- 积分
- 55945
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2011-6-21
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 MeteoInfo 于 2017-2-19 09:45 编辑
利用温度、相对湿度、风场U/V分量数据计算湿位涡。示例脚本简要说明:
1、读取数组。脚本中使用的是ARL格式的4维格点数据,数据是全球1*1度的,为了节省内存,读取4维数组时限定了经纬度范围。数组读取后可以通过数组的dimlen()方法来获取某个维的长度,用dimvalue()方法获取某个维的值的1维数组。该数据集中相对湿度(RELH)变量的高度层只有21层,而温度(TEMP)和U/V(UWND/VWND)变量的高度层有23层,在做数组运算时要求公式中所有数组的各维长度都一致,因此在读取温度和U/V数组时高度维只读到第21层和相对湿度数组一致。
2、计算涡度。利用hcurl()函数和U/V数组计算涡度。
3、构造高度层4维数组。利用dimvalue()方法获取了高度层的1维数组lev,但之后的计算中其它数组都是4维,为了匹配利用zeros()函数构造一个高度层的4维数组prs(所有值均为0)。此时的prs数组是MIArray类型,并没有各维的值的信息,因此创建一个DimArray对象加入维的详细信息。然后对高度层循环给prs数组赋值。
4、计算假相当位温。论坛里有很多帖子讨论假相当位温的计算,这里就不详细说了,公式参考GrADS脚本改写。需要注意的是计算出来的假相当位温eqt/thse是4维的。
5、计算湿位涡。湿位涡的计算也参考了GrADS脚本,由于涉及到上下层的差值,只能一层层计算。先构造一个湿位涡的4维数组mpv,再对时间维和高度维进行循环,在循环中计算2维(Y/X)湿位涡,再赋值给mpv。循环结束后4维mpv数组计算完成。
6、绘图检查计算结果。从4维mpv数组中固定时间和高度维取出2维数组(乘以10的6次方)绘制平面等值线填色图,可以看出计算结果的数量级是对的,具体结果正确与否未进行严格验证。
脚本程序:
- # Calculate moisture potential vorticity
- # Set working directory
- trajDir = 'D:/Temp/HYSPLIT'
- meteoDir = r'U:\data\ARL\2015'
- # Open meteorological data file
- print 'Open meteorological data file...'
- meteofn = os.path.join(meteoDir, 'gdas1.mar15.w5')
- print 'Meteorological file: ' + meteofn
- meteof = addfile(meteofn)
- # Read data
- print 'Read data...'
- latlim = [10,60]
- lonlim = [60,140]
- rh = meteof['RELH'][:,:,latlim,lonlim]
- nx = rh.dimlen(3)
- ny = rh.dimlen(2)
- nz = rh.dimlen(1)
- nt = rh.dimlen(0)
- lat = rh.dimvalue(2)
- lev = rh.dimvalue(1)
- t0 = meteof['TEMP'][:,:nz-1,latlim,lonlim]
- uwnd = meteof['UWND'][:,:nz-1,latlim,lonlim]
- vwnd = meteof['VWND'][:,:nz-1,latlim,lonlim]
- vort = hcurl(uwnd, vwnd)
- prs = zeros([nt,nz,ny,nx])
- prs = dim_array(prs, rh.dims)
- for j in range(nz):
- prs[:,j,:,:] = lev[j]
- # Calculate pseudo-equivalent potential temperature
- print 'Clalulate pseudo-equivalent potential temperature...'
- es = 6.1078*exp(17.2693882*(t0-273.16)/(t0-35.86))
- qq = rh*(0.62197*es/(prs-0.378*es))/100.
- e = prs*qq/(0.62197+qq)+1e-10
- tlcl = 55.0+2840.0/(3.5*log(t0)-log(e)-4.805)
- theta = t0*pow((1000/prs),(0.2854*(1.0-0.28*qq)))
- eqt = theta*exp(((3376./tlcl)-2.54)*qq*(1.0+0.81*qq))
- thse = eqt-273.15
- # Calculate moisture potential vorticity
- print 'Calculate moisture potential vorticity...'
- mpv = zeros([nt,nz,ny,nx], dtype='double')
- mpv = dim_array(mpv, rh.dims)
- mpv.setdimvalue(1, lev[1:nz-1])
- for t in range(nt):
- tt = meteof.gettime(t)
- print tt.strftime('%Y-%m-%d %H:00')
- for z in range(1, nz-1):
- #print '\tLevel: %i' % z
- f = zeros([ny,nx])
- f1 = 2*7.292*sin(lat*3.14159/180.0)*0.00001
- for i in range(nx):
- f[:,i] = f1
- g = 9.8
- dp = 100*(lev[z-1]-lev[z+1])
- deqt = eqt[t,z-1,:,:]-eqt[t,z+1,:,:]
- du = uwnd[t,z-1,:,:]-uwnd[t,z+1,:,:]
- dv = vwnd[t,z-1,:,:]-vwnd[t,z+1,:,:]
- dx1 = 2.0*6370949.0*cos(lat*3.14159/180.0)*3.14159/180.0
- dx = zeros([ny,nx])
- for i in range(nx):
- dx[:,i] = dx1
- dy = 2.0*6370949.0*3.14159/180.0
- dtx = cdiff(eqt[t,z,:,:], 1)
- dty = cdiff(eqt[t,z,:,:], 0)
- pv1 = -g*(vort[t,z,:,:]+f)*deqt/dp
- pv2 = g*((dv/dp)*(dtx/dx)-(du/dp)*(dty/dy))
- pv = pv1+pv2
- mpv[t,z-1,:,:] = pv
- #Plot
- axesm()
- lworld = shaperead('D:/Temp/Map/country1.shp')
- geoshow(lworld, edgecolor='k')
- t = 0
- tt = meteof.gettime(t)
- z = 5
- clevs = arange(-3,3.1,0.5)
- layer = contourfm(mpv[t,z,:,:]*1e6, clevs)
- colorbar(layer)
- title('Moisture potential vorticity (%i hPa)\n' % lev[z] + \
- tt.strftime('%Y-%m-%d %H:00'))
- print 'Finish...'
绘图结果:
|
评分
-
查看全部评分
|