爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 19121|回复: 36

MeteoInfoLab脚本示例:整层水汽通量散度

[复制链接]

新浪微博达人勋

发表于 2016-5-11 14:54:39 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 MeteoInfo 于 2024-7-3 15:33 编辑

增加了trapz函数用来对多维数据的某一维进行积分,该函数的文档见此网页:http://www.meteothink.org/docs/m ... numeric.minum.trapz。利用此函数可以对多维气象数据进行垂直方向的积分,比如计算整层水汽通量散度。

示例脚本如下。结果未经验证,欢迎讨论。
  1. print 'Open data files...'
  2. datadir = 'D:/Temp/nc'
  3. f_air = addfile(datadir + '/air.2011.nc')
  4. f_uwnd = addfile(datadir + '/uwnd.2011.nc')
  5. f_vwnd = addfile(datadir + '/vwnd.2011.nc')
  6. f_rhum = addfile(datadir + '/rhum.2011.nc')

  7. print 'Read data array...'
  8. v_rhum = f_rhum['rhum']
  9. levels = v_rhum.dimvalue(1)
  10. zn = len(levels)
  11. tidx = 173    # Jun 23, 2011
  12. t = f_air.gettime(tidx)
  13. air = f_air['air'][tidx,:zn,::-1,:]
  14. uwnd = f_uwnd['uwnd'][tidx,:zn,::-1,:]
  15. vwnd = f_vwnd['vwnd'][tidx,:zn,::-1,:]
  16. rhum = f_rhum['rhum'][tidx,:zn,::-1,:]

  17. # Calculate
  18. print 'Calculate...'
  19. zn,yn,xn = uwnd.shape
  20. prs = zeros((zn,yn,xn))
  21. prs = dim_array(prs, air.dims)
  22. zidx = 0
  23. for pr in levels:
  24.     prs[zidx,:,:] = pr
  25.     zidx += 1
  26. g = 9.8
  27. es = 6.112*exp(17.67*(air-273.16)/(air-29.65))
  28. qs = 0.62197*es/(prs-0.378*es)
  29. q = qs*rhum/100  
  30. qu = q*uwnd/g
  31. qv = q*vwnd/g
  32. qhdivg = meteolib.divergence(qu, qv)   
  33. vqhdivg = trapz(qhdivg, levels)

  34. #Plot
  35. print 'Plot...'
  36. axesm()
  37. geoshow('country', edgecolor='black')
  38. layer = contourfm(vqhdivg, 20)
  39. title('Vertical Integrated Water Vapor Flux Divergency (' + t.strftime('%Y-%m-%d') + ')')
  40. colorbar(layer)
  41. xlim(0, 360)
  42. ylim(-90, 90)


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

新浪微博达人勋

发表于 2016-5-11 15:45:40 | 显示全部楼层
王老师再造一个“MATLAB+GrADS”
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-5-13 09:25:47 | 显示全部楼层
王老师给力
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-6-23 11:27:22 | 显示全部楼层
楼主你好,运行你的脚本提示出错,这是什么原因?
>>> run script...
Open data files...
Read data array...
Calculate...
Traceback (most recent call last):
  File "<iostream>", line 31, in <module>
  File "D:\MeteoInfo\pylib\mipylib\dimarray.py", line 188, in __sub__
    r = DimArray(self.array.__sub__(other.array), self.dims, self.fill_value, self.proj)
  File "D:\MeteoInfo\pylib\mipylib\miarray.py", line 148, in __sub__
    r = MIArray(ArrayMath.sub(self.array, other.array))
java.lang.ArrayIndexOutOfBoundsException

java.lang.ArrayIndexOutOfBoundsException: java.lang.ArrayIndexOutOfBoundsException
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-6-23 11:34:30 | 显示全部楼层
↘禹禹獨行… 发表于 2016-6-23 11:27
楼主你好,运行你的脚本提示出错,这是什么原因?
>>> run script...
Open data files...

1、首先确保你用的是最新版的MeteoInfo
2、脚本程序你是否有改动?改动的什么地方?
3、所用的数据文件是不是有变化?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-6-23 12:45:25 | 显示全部楼层
MeteoInfo 发表于 2016-6-23 11:34
1、首先确保你用的是最新版的MeteoInfo
2、脚本程序你是否有改动?改动的什么地方?
3、所用的数据文件 ...

是最新版的MeteoInfo
  1. print 'Open data files...'
  2. f_air = addfile('G:/datas/air/air.2000.nc')
  3. f_uwnd = addfile('G:/datas/uwnd/uwnd.2000.nc')
  4. f_vwnd = addfile('G:/datas/vwnd/vwnd.2000.nc')
  5. f_rhum = addfile('G:/datas/rhum/rhum.2000.nc')

  6. print 'Read data array...'
  7. v_rhum = f_rhum['rhum']
  8. levels = v_rhum.dimvalue(1)
  9. tidx = 173
  10. t = f_air.gettime(tidx)
  11. levs = [1000,300]
  12. air = f_air['air'][tidx,levs,::-1,:]
  13. uwnd = f_uwnd['uwnd'][tidx,levs,::-1,:]
  14. vwnd = f_vwnd['vwnd'][tidx,levs,::-1,:]
  15. rhum = f_rhum['rhum'][tidx,levs,::-1,:]

  16. # Calculate
  17. print 'Calculate...'
  18. zn = len(levels)
  19. yn = v_rhum.dimlen(2)
  20. xn = v_rhum.dimlen(3)
  21. prs = zeros((zn,yn,xn))
  22. prs = DimArray(prs, air.dims, air.fill_value, air.proj)
  23. zidx = 0
  24. for pr in levels:
  25.     prs[zidx,:,:] = pr
  26.     zidx += 1
  27. g = 9.8
  28. es = 6.112*exp(17.67*(air-273.16)/(air-29.65))
  29. qs = 0.62197*es/(prs-0.378*es)
  30. q = qs*rhum/100
  31. qu = q*uwnd/g
  32. qv = q*vwnd/g
  33. qhdivg = hdivg(qu, qv)
  34. vqhdivg = trapz(qhdivg, levels)

  35. #Plot
  36. print 'Plot...'
  37. axesm()
  38. mlayer = shaperead('D:/MeteoInfo/map/country1.shp')
  39. geoshow(mlayer, edgecolor='black')
  40. layer = contourfm(vqhdivg, 20)
  41. title('Vertical Integrated Water Vapor Flux Divergency (' + t.strftime('%Y-%m-%d') + ')')
  42. colorbar(layer)
  43. xlim(0, 360)
  44. ylim(-90, 90)
复制代码

脚本程序只是改动了对应路径,使用的是ncep的数据。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-6-23 14:56:20 | 显示全部楼层
↘禹禹獨行… 发表于 2016-6-23 12:45
是最新版的MeteoInfo

脚本程序只是改动了对应路径,使用的是ncep的数据。

你用的日数据还是每日4次的数据?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-6-24 08:48:08 | 显示全部楼层
MeteoInfo 发表于 2016-6-23 14:56
你用的日数据还是每日4次的数据?

数据是逐日的
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-6-24 09:24:04 | 显示全部楼层

之前的脚本有bug,已经更新,你再试试更新后的脚本。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-6-24 09:30:24 | 显示全部楼层

找到出错的原因了,我之前下载的rhum数据只有8层,新的数据都是17层。所以用新的数据需要修改相应的代码。
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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