爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 3441|回复: 0

转换GRIB格式数据至MM5中间文件

[复制链接]

新浪微博达人勋

发表于 2014-7-17 09:22:44 | 显示全部楼层 |阅读模式

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

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

x
运行MM5模式需要更大范围边界气象场的驱动,T639是目前中国气象局一个比较好的业务数据源,T639是GRIB2格式,需要转换为MM5的中间文件格式。MeteoInfo Java版支持MM5输出和中间文件格式,可以通过写脚本来方便的进行批量转换,并可以通过定时提交作业自动运行,满足业务预报的需求。

示例脚本如下:
  1. #--------------------------------------------------------        
  2. # Author: Yaqiang Wang                                          
  3. # Date: 2014-5-8                                               
  4. # Purpose: Convert GRIB data to MM5 intermediate data  
  5. # Note: Sample                                                   
  6. #-----------------------------------------------------------
  7. from org.meteoinfo.data.meteodata import MeteoDataInfo
  8. from org.meteoinfo.data.meteodata.mm5 import MM5IMDataInfo
  9. from org.meteoinfo.data.meteodata import Variable
  10. from org.meteoinfo.data.meteodata.mm5 import DataHead
  11. import os
  12. import datetime

  13. #---- Define convert function
  14. def convert(inDir, outDir, sdate, fhour):
  15.   hdate = sdate + datetime.timedelta(hours=fhour)
  16.   hdatestr = hdate.strftime('%Y-%m-%d_%H:00:00')
  17.   print hdatestr

  18.   #---- Set intput and output data file
  19.   infn = os.path.join(inDir, 'gmf.639.' + sdate.strftime('%Y%m%d%H') + \
  20.     '%03d.grb2'%fhour)
  21.   print 'T639 file: ' + infn
  22.   outfn = os.path.join(outDir, 'T639_' + sdate.strftime('%Y-%m-%d') + '_%02d'%fhour)
  23.   print 'MM5 intermediate file: ' + outfn

  24.   #---- Read a GRIB data file
  25.   mydata = MeteoDataInfo()
  26.   mydata.openNetCDFData(infn)
  27.   print 'GRIB file has been opened...'

  28.   #---- Set output MM5 intermediate data info
  29.   mm5DI = MM5IMDataInfo()

  30.   #---- Set variable and level list
  31.   gvars = ['Geopotential_height_isobaric','Temperature_isobaric',\
  32.     'u-component_of_wind_isobaric','v-component_of_wind_isobaric',\
  33.     'Relative_humidity_isobaric','Pressure_reduced_to_MSL_msl',\
  34.     'Temperature_surface']
  35.   mvars = ['HGT','T','U','V','RH','PMSL','SST']
  36.   units = ['m','K','m s{-1}','m s{-1}','%','Pa','K']
  37.   descs = ['Height','Temperature','U','V','Relative Humidity',\
  38.     'Sea-level Pressure','Sea-surface Temperature']

  39.   #---- Write MM5 intermediate data file
  40.   dataInfo = mydata.getDataInfo()
  41.   mm5DI.createDataFile(outfn)
  42.   vNum = len(gvars)
  43.   for i in range(0, vNum):
  44.     #Read input grid data
  45.     varName = gvars
  46.     print 'Variable: ' + mvars
  47.     var = dataInfo.getVariable(varName)   
  48.     levNum = var.getLevelNum()
  49.     print 'Level number: ' + str(levNum)
  50.     for l in range(0, levNum):
  51.       mydata.setLevelIndex(l)
  52.       gData = mydata.getGridData(varName)
  53.       dh = DataHead()
  54.       dh.iversion = 3
  55.       dh.hdate = hdatestr
  56.       dh.xfcst = 0.0
  57.       dh.field = mvars
  58.       dh.units = units
  59.       dh.desc = descs
  60.       if levNum <= 1:
  61.         dh.level = 200100.0
  62.       else:
  63.         dh.level = var.getLevels().get(l)
  64.       print 'Level: ' + str(dh.level)
  65.       dh.idim = gData.getXNum()
  66.       dh.jdim = gData.getYNum()
  67.       dh.llflag = 0
  68.       dh.startlat = gData.getYMax()
  69.       dh.startlon = gData.getXMin()
  70.       dh.deltalat = -gData.getYDelt()
  71.       dh.deltalon = gData.getXDelt()
  72.       #Write data
  73.       mm5DI.writeDataHead(dh)
  74.       mm5DI.writeGridData(gData)

  75.   mm5DI.closeDataFile()

  76. #---- Run program
  77. #---- Set datetime
  78. stime = datetime.datetime.now()
  79. sdate = datetime.datetime.now()
  80. sdate = sdate.replace(hour=0)
  81. sdate = sdate - datetime.timedelta(days=2)
  82. print sdate

  83. #---- Set directories
  84. inDir = "D:/Working/MIScript/baoding/rdT639"
  85. outDir = "D:/Working/MIScript/baoding/rdT639"

  86. #---- Convert data
  87. #convert(inDir, outDir, sdate, 18)
  88. for fhour in range(0, 109, 6):
  89.   convert(inDir, outDir, sdate, fhour)

  90. print 'Run time: %s'%(datetime.datetime.now() - stime)
  91. print 'Finished!'



转换前的GRIB2数据图形:
Image00704.png


转换后的MM5中间文件数据图形:
Image00705.png

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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