爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 29093|回复: 68

MeteoInfoLab脚本示例:wrfout转arl

[复制链接]

新浪微博达人勋

发表于 2015-12-2 12:37:17 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2015-12-3 23:56 编辑

HYSPLIT模式需要特定格式(ARL)的气象数据来驱动,这里给出了将wrf模式输出的netCDf格式数据转为ARL格式的示例脚本。ARL格式中变量的名称和单位都是固定的,很多变量需要经过单位转换再写入ARL数据文件中。脚本里有详细的注释。
脚本程序:
  1. #--------------------------------------------------------        # Author: Yaqiang Wang                                          
  2. # Date: 2015-12-2                                            
  3. # Purpose: Convert WRF out netCDF data to ARL data  
  4. # Note: Sample                                                   
  5. #-----------------------------------------------------------
  6. #---- Set data folder
  7. datadir = 'E:/Temp/Yaqiang'
  8. #---- Set output data file
  9. outfn = os.path.join(datadir, 'test_wrfout1.arl')
  10. if os.path.exists(outfn):
  11.     os.remove(outfn)
  12. #---- Read a netCDF data file
  13. infn = os.path.join(datadir, 'wrfout_d01_2009-06-08_00_00_00')
  14. print infn
  15. inf = addfile(infn)
  16. print 'NetCDF file has been opened...'
  17. #---- Set output ARL data file
  18. arlf = addfile(outfn, 'c', dtype='arl')
  19. #---- Set variable and level list
  20. wvar2d = ['HGT','PSFC','PBLH','UST','SWDOWN','HFX','LH','T2','U10','V10','RAINNC']
  21. wvar3d = ['P','T','U','V','W','QVAPOR']
  22. avar2d = ['SHGT','PRSS','PBLH','USTR','DSWF','SHTF','LHTF','T02M','U10M','V10M','TPPA']
  23. avar3d = ['PRES','TEMP','UWND','VWND','WWND','SPHU']
  24. wv = inf['P']
  25. nx = wv.dimlen(wv.ndim - 1)
  26. ny = wv.dimlen(wv.ndim - 2)
  27. levels = wv.dimvalue(wv.ndim - 3)
  28. nz = len(levels)
  29. arlf.setlevels(levels)
  30. arlf.set2dvar(avar2d)
  31. for l in levels:
  32.     arlf.set3dvar(avar3d)
  33. #---- Constant for poisson's equation
  34. cp = 1004.0         # J/kg/K; specific heat
  35. grav = 9.81         # m/s**2; gravity
  36. rdry = 287.04       # J/kg/K; gas constant
  37. rovcp = rdry / cp   # constant for poisson's equation
  38. #---- Write ARL data file
  39. arlf.setx(wv.dimvalue(wv.ndim - 1))
  40. arlf.sety(wv.dimvalue(wv.ndim - 2))
  41. tNum = inf.timenum()
  42. fhour = 0
  43. for t in range(0, tNum):
  44.     print 'Time index: ' + str(t)
  45.     atime = inf.gettime(t)   
  46.     print atime.strftime('%Y-%m-%d %H:00')
  47.     dhead = arlf.getdatahead(inf.proj, 'AWRF', 1, fhour)  
  48.     #Pre-write index record without checksum - will be over-write latter
  49.     arlf.writeindexrec(atime, dhead)
  50.     #Checksum list
  51.     ksumlist = []
  52.     # Write 2d variables
  53.     ksums = []
  54.     for avname,wvname in zip(avar2d, wvar2d):        
  55.         #print avname + ' ' + wvname
  56.         gdata = inf[wvname][t,:,:]
  57.         if avname == 'PRSS':
  58.             gdata = gdata * 0.01
  59.         elif avname == 'TPPA':
  60.             gdata = gdata * 0.001
  61.         ksum = arlf.writedatarec(atime, 0, avname, fhour, 99, gdata)
  62.         ksums.append(ksum)
  63.     ksumlist.append(ksums)
  64.     # Write 3d variables
  65.     for lidx in range(0, nz):
  66.         ksums = []
  67.         #print lidx
  68.         pp = inf['P'][t,lidx,:,:]
  69.         pb = inf['PB'][t,lidx,:,:]
  70.         pres = pp + pb        
  71.         uwnd = inf['U'][t,lidx,:,:]               
  72.         vwnd = inf['V'][t,lidx,:,:]        
  73.         temp = inf['T'][t,lidx,:,:]
  74.         #potential to ambient temperature
  75.         temp = (temp + 300.) * (pres / 100000.) ** rovcp        
  76.         sphu = inf['QVAPOR'][t,lidx,:,:]        
  77.         wwnd = inf['W'][t,lidx+1,:,:]
  78.         #convert vertical velocity from m/s to hPa/s using omega = -W g rho
  79.         wwnd = -wwnd * grav * pres * 0.01 / (rdry * temp * (1.0 + 0.6077 * sphu))

  80.         pres = pres * 0.01
  81.         ksum = arlf.writedatarec(atime, lidx + 1, 'PRES', fhour, 99, pres)
  82.         ksums.append(ksum)
  83.         ksum = arlf.writedatarec(atime, lidx + 1, 'TEMP', fhour, 99, temp)
  84.         ksums.append(ksum)
  85.         ksum = arlf.writedatarec(atime, lidx + 1, 'UWND', fhour, 99, uwnd[:,:nx])
  86.         ksums.append(ksum)
  87.         ksum = arlf.writedatarec(atime, lidx + 1, 'VWND', fhour, 99, vwnd[:ny,:])
  88.         ksums.append(ksum)
  89.         ksum = arlf.writedatarec(atime, lidx + 1, 'WWND', fhour, 99, wwnd)
  90.         ksums.append(ksum)      
  91.         ksum = arlf.writedatarec(atime, lidx + 1, 'SPHU', fhour, 99, sphu)
  92.         ksums.append(ksum)
  93.         ksumlist.append(ksums)
  94.     #Re-write index record with checksum
  95.     arlf.writeindexrec(atime, dhead, ksumlist)
  96.     fhour += 6
  97. arlf.close()
  98. print 'Finished!'


转换后的数据和HYSPLIT官方提供的arw2arl程序转换的结果是一致的。
wrf2arl_milab.jpg
wrf2arl.jpg

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

新浪微博达人勋

发表于 2015-12-2 12:47:39 | 显示全部楼层
{:5_213:}{:5_213:}{:5_213:}{:5_213:}{:5_213:}{:5_213:}{:5_213:}
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

发表于 2015-12-2 14:35:20 | 显示全部楼层
赞一个,太棒了!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-12-2 16:32:32 | 显示全部楼层
王老师您好,我重新安装了官网上的最新版本(MeteoInfo 1.2.8R15 - Java (for all systems)),然后按照你的脚本示例进行了修改,但是报错(见图片),感觉很奇怪啊

报错信息

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

新浪微博达人勋

发表于 2015-12-2 17:24:47 | 显示全部楼层
谢谢王老师,又学到了新的知识
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-12-2 18:30:04 | 显示全部楼层
○畏,奶牛 发表于 2015-12-2 16:32
王老师您好,我重新安装了官网上的最新版本(MeteoInfo 1.2.8R15 - Java (for all systems)),然后按照你 ...

在MeteoInfoLab中运行。参考此贴:http://bbs.06climate.com/forum.p ... &extra=page%3D1
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2015-12-3 23:58:20 | 显示全部楼层
○畏,奶牛 发表于 2015-12-2 16:32
王老师您好,我重新安装了官网上的最新版本(MeteoInfo 1.2.8R15 - Java (for all systems)),然后按照你 ...

在wrf转arl功能中有一个bug,转多时次数据会有问题,需要重新下载MeteoInfo最新版本,另外1楼脚本也有更新,包含了更多的变量。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-12-4 08:54:27 | 显示全部楼层
好贴好东西
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-12-4 14:28:50 | 显示全部楼层
MeteoInfo 发表于 2015-12-3 23:58
在wrf转arl功能中有一个bug,转多时次数据会有问题,需要重新下载MeteoInfo最新版本,另外1楼脚本也有更 ...

哦哦,谢谢王老师的提醒!昨天听您的换到在MeteoInfoLab中运行就不报错了,但是确实有时次的问题。今天又下载了官网的最新版本:MeteoInfo 1.2.8R16 - Java (for all systems),对照您1楼更新的脚本进行了修改,并在MeteoInfoLab中运行,没有报错(见图1)。
但是当我运行hysplit的时候在Run Model这一步卡住了(见图2),我在Setup Run设置的是和以前一样的。然后我用MeteoInfo想打开转换的数据看一下,发现也不能打开,有报错(见图3)。看图1好像转换成功了,但是还是有错吗?
文件链接: http://pan.baidu.com/s/1A3xp0 密码: w86j

图2:hysplit第二步运行出错

图2:hysplit第二步运行出错

图3:打开转换的数据

图3:打开转换的数据

图1:转换信息

图1:转换信息
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2015-12-4 14:30:01 | 显示全部楼层
图片的顺序还是错了,顺序变成了:图2,图3,图1
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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