本内容相关视频讲述:WRF后处理总结
当我们跑完WRF,会有很多输出wrf_out文件,一般以nc格式储存,在wrfout文件里,有着大量的输出变量,使得我们在处理想要的变量时感到头疼,而同时,许多气象中常用的诊断变量无法直接从nc的变量中读出,而是封装在了其他变量里,这时,我们需要使用相应的函数进行诊断量的计算与提取。
此外,WRF本身使用的坐标是使用随地形改变的地形跟随坐标Terrain Following Coordinate (TFC),在WRF3.9以后,WRF又加入了混合垂直坐标Hybrid Vertical Coordinate (HVC) 选项。
简而言之,WRF中的垂直层并不是我们常用的等气压面,而是采用eta层区分,eta层的对应高度与对应区域海拔相关,而在气象中,我们通常选取等压面、等位高度面进行分析研究,这就涉及到了eta向等位势高度面、等气压面的转化与插值计算。
WRF中,使用的是格点中心位置平均来表示该网格里所有变量的值,当我们想使用站点观测数据与模式数据进行对比分析时,找出站点经纬度对应的最近格点经纬度索引并提取就非常重要。
总结一下,WRF后处理包括计算、绘图两部分,正确的计算是绘图的前提,不同的绘图类型也对应不同的变量计算处理方式,总结如下:
首先我们应当查看一下wrf输出变量的一些信息,可以使用ncdump-h
直接查看,也可以在ncl里让ncl打印:
a=addfile("wrfout_d01_2018-05-06_12:00:00","r")
print(a)
printVarSummary(a)
返回:
File path: wrfout_d01_2018-05-06_12:00:00
Number of global attributes: 150
Number of dimensions: 12
Number of variables: 279 …
以及一大串变量的信息,就不放了,实在太长了,建议直接将用:>out.txt
其输出查看。
wrf-python和NCL都有对应的wrf变量提取、插值、诊断量计算的函数,其中常用函数总结如下表:
NCL | WRF-python | |
---|---|---|
wrf_user_get_var | wrf.getvar | Extract and computes varaiables |
wrf_user_interp_level | wrf.interplevel | Interpolate a 3D field at the given vertical level(s) |
wrf_user_vert_cross | wrf.vertcross | Interpolates a 3D field through a user-specified horizontal line |
wrf_user_interp_line | wrf.interpline | Interpolates a 2D field to a user-specified line |
wrf_user_ll_to_xy | wrf.ll_to_xy | Lat/Lon <-> XY Routines |
可以看出wrf-python与NCL在WRF处理中的一致性与相似性。
诊断变量的获取代码如下:
NCL:
DATADir ="/public/home/zhangzilu/Build_WRF/WRF-4.3/run/out/"
FILES = systemfunc (" ls -1 " + DATADir + "wrfout* ")
numFILES = dimsizes(FILES)
print("numFILES = " + numFILES)
print(FILES)
a = addfiles(FILES+".nc","r")
slp = wrf_user_getvar(a,"slp",-1)
wrf-python
os.chdir('F:/wrfout/wrfoutnew/')
file_list = os.listdir(filepath)
files = [os.path.join(filepath,x) for x in file_list]
wrflist=[Dataset(d) for d in files]
slp = getvar(wrflist, "slp",timeidx=ALL_TIMES, method="cat")
对于wrf文件中的诊断变量种类与对应变量,可参考:Available diagnostics
1、水平面插值
将有的3D数据,插值至对应气压面上,如根据3D的位势高度变量,插值到500hPa等压面。
NCL:
ht = wrf_user_getvar(a, "z",time) ; height
p = wrf_user_getvar(a, "pressure",time) ; pressure
ht_500 = wrf_user_interp_level(ht,p,500,False)
wrf-python
z = getvar(ncfile, "z")
p = getvar(ncfile, "pressure")
ht_500 = interplevel(z, p, 500.)#500hPa位势高度
2、垂直剖面插值
主要是将等eta层的数据插到对应位势高度上,此时得到3D数据对应Z轴为位势高度。
主要用于绘制垂直剖面图使用。
NCL:
z = wrf_user_getvar(a, "z",time) ; grid point height
qv = wrf_user_getvar(a, "QVAPOR",time) ;
latlon = (/-118,38,-115,40/)
opt = True
opt@latlon = True
opt@linecoords = True ; returns lat/lon coordinates on line as attributes "lats","lons"
opt@file_handle = a
qv_latlon = wrf_user_vert_cross(qv,z,latlon,opt)
wrf-python:
z = getvar(ncfile, "z")
p = getvar(ncfile, "pressure")
# Define a start point and end point in grid coordinates
start_point = CoordPair(x=0, y=(z.shape[-2]-1)//2)
end_point = CoordPair(x=-1, y=(z.shape[-2]-1)//2)
p_vert = vertcross(p, z, start_point=start_point, end_point=end_point, latlon=True)
NCL:官方示例丰富,主要根据其脚本修改绘制即可官方示例脚本
对于NCL,可使用WRF专用的绘图函数WRF-specific plotting functions,同样,也可以使用常用的gsn_csm plotting functions。
NCL官方文档示例极其丰富,学习以官方手册为主。
Python:主要使用Cartopy/Basemap(已停止维护)与matplotlib包结合。
WRF-python提供绘图辅助函数,用于获取 cartopy,basemap,PyNgl使用的地图对象,如:
cart_proj = get_cartopy(wrfin=ncfile)
# 从文件中获取地理边界,默认使用 XLAT, XLONG
# 提供变量名,可以获取其栅格边界
bounds = geo_bounds(wrfin=ncfile)
NCL:读取与处理nc数据快速,用于后处理的变量读取计算部分
python:绘图美观,已有现成封装绘图脚本,用于绘图。
在NCL中,常用的数据计算与切片逻辑与python一致,NCL中,Statistics函数中,可实现python numpy库的基本计算功能。
可先使用python(或其他熟悉语言)完成计算部分代码,再将其替换为NCL对应语句。
以下为示例,代码用处为:批量读取Wrfout文件,提取对应变量,计算均值(时间平均),并输出。
load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl"
load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl"
begin
; Make a list of all files we are interested in
DATADir ="/public/home/zhangzilu/Build_WRF/WRF-4.3/run/out/"
FILES = systemfunc (" ls -1 " + DATADir + "wrfout* ")
print(FILES)
a = addfiles(FILES+".nc","r")
times = wrf_user_getvar(a,"times",-1) ; get all times in the file
ntimes = dimsizes(times) ; number of times in the file
slp = wrf_user_getvar(a,"slp",-1) ; slp
z=wrf_user_getvar(a,"slp",-1) ; height
p=wrf_user_getvar(a,"pressure",-1) ; pressure
q=wrf_user_getvar(a,"QVAPOR",-1) ;humidity ratio
az=dim_avg_n(z, 0)
ap=dim_avg_n(p,0)
aq=dim_avg_n(q,0)
use_out=addfile("for_python.nc", "c")
use_out->z = az
use_out->p = ap
use_out->QVAPOR = q
end
可参见我的其他博客:
python cartopy极坐标网格绘制
python cartopy极地投影重叠问题解决
python cartopy绘制北极函数封装
python常见气象绘图函数
python绘制WRF土地利用
确定后,使用getvar函数进行提取。
可使用ncdump-h命令查看wrfout中的变量,wrf中的诊断量分类也可从官方文档处查阅。
所需的可视化绘图类型,决定了你在WRF后处理中的计算步骤。
1D点线图:ll_to_xy interpline
2D填色图:interplevel
3D剖面图:vinterp vertcross
色标、XY轴、标签的设置等等。