爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
楼主: MeteoInfo

MeteoInfo脚本示例:GRIB to ARL

[复制链接]

新浪微博达人勋

发表于 2019-3-29 14:43:25 | 显示全部楼层
王老师,你好,看了下这个程序感觉和python程序比较像,不知道可不可以用python进行调试输出呢,感觉python也应该可以。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2019-3-29 15:23:19 | 显示全部楼层
搁浅 发表于 2019-3-29 14:43
王老师,你好,看了下这个程序感觉和python程序比较像,不知道可不可以用python进行调试输出呢,感觉python ...

参考这个:http://bbs.06climate.com/forum.p ... &extra=page%3D1
和这个:http://www.meteothink.org/exampl ... ctory/grib2arl.html
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-3-15 19:13:20 | 显示全部楼层
王老师,您好!我使用您的grib转arl的程序,将模式输出的grib数据转为arl格式数据,但转出来的数据在meteoinfo里面打开报错,hysplit里面也用不了。通过多次测试,发现经纬度网格只要小于1000个就不会出错,请问您的代码里面有哪个参数是控制网格数的吗?还是说arl格式就是不允许太大的网格数的呢?
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-3-15 22:48:35 | 显示全部楼层
sandytiny 发表于 2024-3-15 19:13
王老师,您好!我使用您的grib转arl的程序,将模式输出的grib数据转为arl格式数据,但转出来的数据在meteoi ...

你可以考虑传上来一个示例数据文件和脚本程序,我测试一下。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-3-16 17:24:10 | 显示全部楼层
MeteoInfo 发表于 2024-3-15 22:48
你可以考虑传上来一个示例数据文件和脚本程序,我测试一下。

王老师,我放了2个不同分辨率的fnl的grib2数据到网盘,麻烦王老师帮忙看看,感谢。网格数小于1000的那个grib2在我这边测试是正常转换的,大网格数的那个转出来以后meteoinfo就报错了,HYSPLIT也无法用。我这边使用的代码见附件。谢谢王老师。
数据链接:https://pan.baidu.com/s/1xuweNCixF9U96iNmWPx6ZQ?pwd=tfu8

grib2arl.py

3.01 KB, 下载次数: 0, 下载积分: 金钱 -5

密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-3-16 17:26:27 | 显示全部楼层
王老师,我贴上来了

  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2012-12-31                                               
  4. # Purpose: Convert GRIB data to ARL data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------
  7. import clr
  8. from System import *
  9. from System.Collections.Generic import *
  10. clr.AddReference("MeteoInfoC.dll")
  11. from MeteoInfoC import *
  12. from MeteoInfoC.Data import *
  13. from MeteoInfoC.Data.MeteoData import *

  14. #---- Set directories
  15. dataDir = "G:\\dataprocess\\test\\grib2\"

  16. #---- Set output data file
  17. outFile = dataDir + 'fnl_20191101_06_00.arl'

  18. #---- Read a GRIB data file
  19. mydata = MeteoDataInfo()
  20. infile = dataDir + 'fnl_20191101_06_00.grib2'
  21. mydata.OpenGRIBData(infile)

  22. #---- Set output ARL data info
  23. arlDI = ARLDataInfo()

  24. #---- Set variable and level list
  25. gvars = ['U-component_of_wind@pressure','V-component_of_wind@pressure',\
  26.     'Temperature@pressure','Geopotential_height@pressure',\
  27.     'Relative_humidity@pressure','Vertical_velocity@pressure',\
  28.     'Temperature@height_above_ground','Relative_humidity@height_above_ground','U-component_of_wind@height_above_ground',\
  29.     'V-component_of_wind@height_above_ground','Pressure_reduced_to_MSL@msl',\
  30.     'Pressure@surface','Precipitation_rate@surface']
  31. avars = ['UWND','VWND','TEMP','HGTS','RELH','WWND','T02M','RH2M','U10M','V10M','MSLP','PRSS','TPP6']
  32. levels = [0,200,500,700,850,925,1000]
  33. for l in levels:
  34.     arlDI.levels.Add(l)
  35.     if l == 0:
  36.         arlDI.LevelVarList.Add(List[str](['T02M','RH2M','U10M','V10M','MSLP','PRSS','TPP6']))
  37.     else:
  38.         arlDI.LevelVarList.Add(List[str](['UWND','VWND','TEMP','HGTS','RELH','WWND']))

  39. #---- Write ARL data file
  40. arlDI.CreateDataFile(outFile)
  41. arlDI.X = mydata.GetX()
  42. arlDI.Y = mydata.GetY()
  43. variables = mydata.GetVariables()
  44. tNum = mydata.GetTimeNumber()
  45. for t in range(0, tNum):
  46.     mydata.TimeIndex = t
  47.     atime = mydata.GetTime(t)
  48.     print atime.ToString("yyyy-MM-dd HH")
  49.     aDH = arlDI.GetDataHead(mydata.ProjInfo, 'FNL1', 2)
  50.     arlDI.WriteIndexRecord(atime, aDH)
  51.     lidx = 0
  52.     for l in arlDI.levels:
  53.         print l
  54.         for v in arlDI.LevelVarList[lidx]:
  55.             vName = gvars[avars.index(v)]
  56.             print vName
  57.             if lidx == 0:
  58.                 mydata.LevelIndex = lidx
  59.             else:
  60.                 variable = mydata.GetVariable(vName)
  61.                 nlidx = variable.Levels.IndexOf(l)
  62.                 mydata.LevelIndex = nlidx
  63.             gData = mydata.GetGridData(vName)
  64.             if v == 'PRSS' or v == 'WWND' or v == 'MSLP':
  65.                 gData = gData / 100
  66.             elif v == 'TPP6':
  67.                 gData = gData / 1000
  68.             aDL = DataLabel(atime)
  69.             aDL.Level = lidx
  70.             aDL.Variable = v
  71.             aDL.Grid = 99
  72.             aDL.Forecast = 0
  73.             arlDI.WriteGridData(aDL, gData)
  74.         lidx += 1

  75. arlDI.CloseDataFile()

  76. print 'Finished!'
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-3-17 12:56:09 | 显示全部楼层
sandytiny 发表于 2024-3-16 17:26
王老师,我贴上来了

你参考这里:http://www.meteothink.org/exampl ... ctory/grib2arl.html
在MeteoInfoLab里运行代码。
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-3-18 18:04:37 | 显示全部楼层
MeteoInfo 发表于 2024-3-17 12:56
你参考这里:http://www.meteothink.org/examples/meteoinfolab/trajectory/grib2arl.html
在MeteoInfoL ...

谢谢王老师,我用您的代码跑了一遍,还是生成了arl文件,但用meteoinfo打开就报错了,王老师能帮忙看看吗?代码如下:

  1. # Convert GRIB data to ARL data

  2. #---- Set data folder
  3. datadir = 'D:\grib\Test'
  4. #---- Set output data file
  5. outfn = os.path.join(datadir, 'gdas1.fnl0p25.2023010100.f00.arl')
  6. #if os.path.exists(outfn):
  7. #    os.remove(outfn)
  8. #---- Read a GRIB data file
  9. infn = os.path.join(datadir, 'gdas1.fnl0p25.2023010100.f00.grib2')
  10. print infn
  11. inf = addfile(infn)
  12. print 'GRIB data file has been opened...'
  13. #---- Set output ARL data file
  14. arlf = addfile(outfn, 'c', dtype='arl')
  15. #---- Set variable and level list
  16. gvar2d = ['Temperature_height_above_ground','Relative_humidity_height_above_ground','u-component_of_wind_height_above_ground',\
  17.     'v-component_of_wind_height_above_ground','Pressure_reduced_to_MSL_msl','Pressure_surface','Precipitation_rate_surface']
  18. gvar3d = ['u-component_of_wind_isobaric','v-component_of_wind_isobaric','Temperature_isobaric',\
  19.     'Geopotential_height_isobaric','Relative_humidity_isobaric','Vertical_velocity_geometric_isobaric']
  20. avar2d = ['T02M','RH2M','U10M','V10M','MSLP','PRSS','TPP6']
  21. avar3d = ['UWND','VWND','TEMP','HGTS','RELH','WWND']
  22. gv = inf['Geopotential_height_isobaric']
  23. nx = gv.dimlen(gv.ndim - 1)
  24. ny = gv.dimlen(gv.ndim - 2)
  25. levels = gv.dimvalue(gv.ndim - 3)[::-1]
  26. nz = len(levels)
  27. arlf.setlevels(levels)
  28. arlf.set2dvar(avar2d)
  29. for l in levels:
  30.     arlf.set3dvar(avar3d)

  31. #---- Write ARL data file
  32. arlf.setx(gv.dimvalue(gv.ndim - 1))
  33. arlf.sety(gv.dimvalue(gv.ndim - 2))
  34. tNum = inf.timenum()
  35. fhour = 0
  36. for t in range(0, tNum):
  37.     print 'Time index: ' + str(t)
  38.     atime = inf.gettime(t)
  39.     print atime.strftime('%Y-%m-%d %H:00')
  40.     dhead = arlf.getdatahead(inf.proj, 'RSMC', 2, fhour)
  41.     #Pre-write index record without checksum - will be over-write latter
  42.     arlf.writeindexrec(atime, dhead)
  43.     #Checksum list
  44.     ksumlist = []
  45.     # Write 2d variables
  46.     ksums = []
  47.     for avname,gvname in zip(avar2d, gvar2d):
  48.         print avname + ' ' + gvname
  49.         if avname == 'U10M' or avname == 'V10M':
  50.             gdata = inf[gvname][t,0,:,:]
  51.         else:
  52.             gdata = inf[gvname][t,:,:]
  53.         if avname == 'PRSS' or avname == 'MSLP':
  54.             gdata = gdata * 0.01
  55.         ksum = arlf.writedatarec(atime, 0, avname, fhour, 99, gdata)
  56.         ksums.append(ksum)
  57.     ksumlist.append(ksums)
  58.     # Write 3d variables
  59.     for lidx in range(0, nz):
  60.         ksums = []
  61.         llidx = nz - lidx - 1
  62.         print lidx
  63.         print llidx
  64.         for avname,gvname in zip(avar3d, gvar3d):
  65.             print avname + ' ' + gvname
  66.             gdata = inf[gvname][t,llidx,:,:]
  67.             if avname == 'WWND':
  68.                 gdata = gdata * 0.01
  69.             elif avname == 'SPHU':
  70.                 gdata = gdata * 1000.
  71.             ksum = arlf.writedatarec(atime, lidx + 1, avname, fhour, 99, gdata)
  72.             ksums.append(ksum)
  73.         ksumlist.append(ksums)
  74.     #Re-write index record with checksum
  75.     arlf.writeindexrec(atime, dhead, ksumlist)
  76.     fhour += 1
  77. arlf.close()
  78. print 'Finished!'
复制代码
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2024-3-19 10:46:03 | 显示全部楼层
sandytiny 发表于 2024-3-18 18:04
谢谢王老师,我用您的代码跑了一遍,还是生成了arl文件,但用meteoinfo打开就报错了,王老师能帮忙看看吗 ...

参考这个脚本程序,不过数据文件中只有一个时次。

  1. # Convert GRIB data to ARL data

  2. #---- Set data folder
  3. datadir = 'D:/Temp/grib'
  4. #---- Set output data file
  5. outfn = os.path.join(datadir, 'gdas1.fnl0p25.2023010100.f00.arl')
  6. #if os.path.exists(outfn):
  7. #    os.remove(outfn)
  8. #---- Read a GRIB data file
  9. infn = os.path.join(datadir, 'gdas1.fnl0p25.2023010100.f00.grib2')
  10. print(infn)
  11. inf = addfile(infn)
  12. print('GRIB data file has been opened...')
  13. #---- Set output ARL data file
  14. arlf = addfile(outfn, 'c', dtype='arl')
  15. #---- Set variable and level list
  16. gvar2d = ['Temperature_height_above_ground','Relative_humidity_height_above_ground','u-component_of_wind_height_above_ground',
  17.     'v-component_of_wind_height_above_ground','Pressure_reduced_to_MSL_msl','Pressure_surface','Precipitation_rate_surface']
  18. gvar3d = ['u-component_of_wind_isobaric','v-component_of_wind_isobaric','Temperature_isobaric',
  19.     'Geopotential_height_isobaric','Relative_humidity_isobaric','Vertical_velocity_geometric_isobaric']
  20. avar2d = ['T02M','RH2M','U10M','V10M','MSLP','PRSS','TPP6']
  21. avar3d = ['UWND','VWND','TEMP','HGTS','RELH','WWND']
  22. gv = inf['Geopotential_height_isobaric']
  23. nx = gv.dimlen(gv.ndim - 1)
  24. ny = gv.dimlen(gv.ndim - 2)
  25. levels = gv.dimvalue(gv.ndim - 3)[::-1]
  26. nz = len(levels)
  27. arlf.setlevels(levels)
  28. arlf.set2dvar(avar2d)
  29. for l in levels:
  30.     arlf.set3dvar(avar3d)

  31. #---- Write ARL data file
  32. arlf.setx(gv.dimvalue(gv.ndim - 1))
  33. arlf.sety(gv.dimvalue(gv.ndim - 2))
  34. tNum = inf.timenum()
  35. fhour = 0
  36. for t in range(0, tNum):
  37.     print('Time index: ' + str(t))
  38.     atime = inf.gettime(t)
  39.     print(atime.strftime('%Y-%m-%d %H:00'))
  40.     dhead = arlf.getdatahead(inf.proj, 'RSMC', 2, fhour)
  41.     #Pre-write index record without checksum - will be over-write latter
  42.     arlf.writeindexrec(atime, dhead)
  43.     #Checksum list
  44.     ksumlist = []
  45.     # Write 2d variables
  46.     ksums = []
  47.     for avname,gvname in zip(avar2d, gvar2d):
  48.         print(avname + ' ' + gvname)
  49.         if avname in ['T02M','RH2M','U10M','V10M']:
  50.             gdata = inf[gvname][t,0,:,:]
  51.         else:
  52.             gdata = inf[gvname][t,:,:]
  53.             
  54.         if avname == 'PRSS' or avname == 'MSLP':
  55.             gdata = gdata * 0.01
  56.             
  57.         ksum = arlf.writedatarec(atime, 0, avname, fhour, 99, gdata)
  58.         ksums.append(ksum)
  59.     ksumlist.append(ksums)
  60.     # Write 3d variables
  61.     for lidx in range(0, nz):
  62.         ksums = []
  63.         llidx = nz - lidx - 1
  64.         print(lidx, llidx)
  65.         for avname,gvname in zip(avar3d, gvar3d):
  66.             print avname + ' ' + gvname
  67.             gdata = inf[gvname][t,llidx,:,:]
  68.             if avname == 'WWND':
  69.                 gdata = gdata * 0.01
  70.             elif avname == 'SPHU':
  71.                 gdata = gdata * 1000.
  72.             ksum = arlf.writedatarec(atime, lidx + 1, avname, fhour, 99, gdata)
  73.             ksums.append(ksum)
  74.         ksumlist.append(ksums)
  75.     #Re-write index record with checksum
  76.     arlf.writeindexrec(atime, dhead, ksumlist)
  77.     fhour += 1
  78. arlf.close()
  79. print('Finished!')
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

新浪微博达人勋

发表于 2024-3-19 11:06:58 | 显示全部楼层
MeteoInfo 发表于 2024-3-19 10:46
参考这个脚本程序,不过数据文件中只有一个时次。

谢谢王老师,我这跑了一遍,还是生成arl但就是meteoinfo打开报错,不知道是哪里出了问题
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表