爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7122|回复: 13

GRIB转ARL数据的Groovy脚本

[复制链接]

新浪微博达人勋

发表于 2013-8-30 11:33:50 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 MeteoInfo 于 2013-8-30 11:35 编辑

MeteoInfo Java版具有更好的跨平台能力,对于做模式的人来说通常会用Linux或者Unix,很适合使用Java版。之前说过由于Jython对中文的支持不好,选择了Groovy作为MeteoInfo Java版的脚本语言。这里给出一个将GRIB数据转为HYSPLIT模式用的ARL数据的Groovy脚本例子。

MeteoInfo Java版里包含了一个脚本代码编辑器,可以在MeteoInfo桌面程序的“工具 -> 脚本”菜单打开编辑器,在编辑器中可以新建、打开、编辑、保存脚本程序并运行。
Image00444.png

也可以在命令行中运行MeteoInfo.jar时加上“-e”参数,从而在不启动MeteoInfo桌面程序的情况下直接打开脚本剪辑器:
Image00443.png

还可以直接在命令行中运行脚本程序,不启动任何界面,适合脚本自动运行:
Image00446.png

示例程序转成的ARL数据:
Image00447.png

脚本代码:
  1. //--------------------------------------------------------        
  2. // Author: Yaqiang Wang                                          
  3. // Date: 2013-8-27                                               
  4. // Purpose: Convert GRIB data to ARL data  
  5. // Note: Sample                                                   
  6. //-----------------------------------------------------------
  7. import org.meteoinfo.data.*
  8. import org.meteoinfo.data.meteodata.*
  9. import org.meteoinfo.data.meteodata.arl.*

  10. // Set directory
  11. dataDir = 'D:/Temp/'

  12. // Set output data file
  13. outfn = dataDir + 'arl/test.arl'

  14. // Read GRIB data file
  15. mydata = new MeteoDataInfo()
  16. infn = dataDir + 'grib/fnl_20110416_00_00'
  17. println infn + '\n'
  18. mydata.openNetCDFData(infn)
  19. println 'GRIB file has been opened...\n'

  20. // Set output ARL data info
  21. arlDI = new ARLDataInfo()

  22. // Set variable and level list
  23. gvars = ['Pressure_surface','Temperature_height_above_ground',
  24.         'u-component_of_wind_height_above_ground','v-component_of_wind_height_above_ground',
  25.         'Total_precipitation_surface_0_Hour_Accumulation','Geopotential_height_isobaric','Temperature_isobaric',
  26.         'u-component_of_wind_isobaric','v-component_of_wind_isobaric','Vertical_velocity_pressure_isobaric',
  27.         'Relative_humidity_isobaric']
  28. avars = ['PRSS','T02M','U10M','V10M','TPP6','HGTS','TEMP','UWND','VWND','WWND','RELH']
  29. levels = [0,1000.0,2000.0,3000.0,5000.0,7000.0,10000.0,15000.0,20000.0,25000.0,30000.0,35000.0,40000.0,45000.0,
  30.         50000.0,55000.0,60000.0,65000.0,70000.0,75000.0,80000.0,
  31.         85000.0,90000.0,92500.0,95000.0,97500.0,100000.0]

  32. levels.each { l->
  33.         arlDI.levels.add(l)
  34.         if (l == 0){
  35.                 arlDI.LevelVarList.add(['PRSS','T02M','U10M','V10M','TPP6'])               
  36.         } else if (l < 10000) {
  37.                 arlDI.LevelVarList.add(['HGTS','TEMP','UWND','VWND'])
  38.         } else {
  39.                 arlDI.LevelVarList.add(['HGTS','TEMP','UWND','VWND','WWND','RELH'])
  40.         }
  41. }

  42. // Write ARL data file
  43. dataInfo = mydata.getDataInfo()
  44. arlDI.createDataFile(outfn)
  45. arlDI.X = dataInfo.getXDimension().getValues()
  46. arlDI.Y = dataInfo.getYDimension().getValues()
  47. variables = dataInfo.getVariables()
  48. tNum = dataInfo.getTimeNum()
  49. for (t in 0..tNum-1){
  50.         mydata.setTimeIndex(t)
  51.         atime = dataInfo.getTimes().get(t)
  52.         aDH = arlDI.getDataHead(mydata.getProjectionInfo(), 'FNL1', 2)
  53.         arlDI.writeIndexRecord(atime, aDH)
  54.         lidx = 0
  55.         arlDI.levels.each { l->
  56.                 println l
  57.                 println '\n'
  58.                 arlDI.LevelVarList[lidx].each { v->
  59.                         vName = gvars[avars.indexOf(v)]
  60.                         println vName + '\n'
  61.                         if (lidx == 0){
  62.                                 mydata.setLevelIndex(lidx)
  63.                         } else {
  64.                                 variable = dataInfo.getVariable(vName)
  65.                                 nlidx = variable.getZDimension().getDimValue().indexOf (new Double(l))
  66.                                 println 'Level index: ' + nlidx.toString() + '\n'
  67.                                 mydata.setLevelIndex(nlidx)
  68.                         }
  69.                         gData = mydata.getGridData(vName)
  70.                         if (gData == null){
  71.                                 println 'Grid data is null!\n'
  72.                         }
  73.                         if (v == 'PRSS' || v == 'WWND'){
  74.                                 gData = gData.divide(100)
  75.                         } else if (v == 'TPP6'){
  76.                                 gData = gData.divide(1000)
  77.                         }
  78.                         aDL = new DataLabel(atime)
  79.                         aDL.setLevel(lidx)
  80.                         aDL.setVarName(v)
  81.                         aDL.setGrid(99)
  82.                         aDL.setForecast(0)
  83.                         arlDI.writeGridData(aDL, gData)
  84.                 }
  85.                 lidx += 1
  86.         }
  87. }

  88. arlDI.closeDataFile()

  89. println 'Finished!'

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-30 11:36:39 | 显示全部楼层
继续膜拜!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-8-30 11:49:06 | 显示全部楼层

谢谢老师
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-9-3 11:26:42 | 显示全部楼层
王老师:
      我看到程序中地面数据有5个,每层数据有6个,这是ARL数据所需要的最少变量数吗?ARL的数据格式是什么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-9-3 11:56:07 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-9-4 11:32:50 | 显示全部楼层
MeteoInfo 发表于 2013-9-3 11:56
差不多吧。

ARL格式见此网页:https://hysplitbbs.arl.noaa.gov/viewtopic.php?f=25&t=48

我看到PDF上第6页开始有个rotating checksum of the packed data,我在读取第一个单元的记录时,后面会有.00000 5PRSS 13 T02M  2 U10M 86 V10M 86 TPP6 84 1000.0 6HGTS189 TEMP 47 UWND201

  VWND198 WWND241 RELH 40 ,变量后面的应该就是这个吧,请问代表什么含义啊?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-9-4 14:26:02 | 显示全部楼层
tianshui 发表于 2013-9-4 11:32
我看到PDF上第6页开始有个rotating checksum of the packed data,我在读取第一个单元的记录时,后面会有 ...

是这样的。这个应该是程序里数据格式检验生成的数字,应该对于使用没有影响。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-9-4 17:27:54 | 显示全部楼层
MeteoInfo 发表于 2013-9-4 14:26
是这样的。这个应该是程序里数据格式检验生成的数字,应该对于使用没有影响。

王老师可曾做过将4个字节的数据转换为ARL数据?有fortran文件吗
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2013-9-4 20:30:13 | 显示全部楼层
tianshui 发表于 2013-9-4 17:27
王老师可曾做过将4个字节的数据转换为ARL数据?有fortran文件吗

4个字节的数据不知道指的是什么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-9-5 09:31:52 | 显示全部楼层
MeteoInfo 发表于 2013-9-4 20:30
4个字节的数据不知道指的是什么?

就是普通的数据格式
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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