WRF后处理总结:wrf-python与NCL在WRF后处理中的基本应用——变量提取、计算与可视化

本内容相关视频讲述:WRF后处理总结

什么是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后处理包括计算、绘图两部分,正确的计算是绘图的前提,不同的绘图类型也对应不同的变量计算处理方式,总结如下:

  1. 计算
  • 读取、合并、基本计算
  • 诊断量计算(cape、Cloud fraction、Precipitable Water等)
  • 垂直插值、坐标索引转换
  1. 绘图
  • 剖面图
  • 填色图
  • 折线/点线图
  • 其他:3D、风玫瑰、Skew_T

数据信息

首先我们应当查看一下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常用计算函数
NCLWRF-python
wrf_user_get_varwrf.getvarExtract and computes varaiables
wrf_user_interp_levelwrf.interplevelInterpolate a 3D field at the given vertical level(s)
wrf_user_vert_crosswrf.vertcrossInterpolates a 3D field through a user-specified horizontal line
wrf_user_interp_linewrf.interplineInterpolates a 2D field to a user-specified line
wrf_user_ll_to_xywrf.ll_to_xyLat/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与wrf-python结合

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可视化的示例

可参见我的其他博客:

python cartopy极坐标网格绘制

python cartopy极地投影重叠问题解决

python cartopy绘制北极函数封装

python常见气象绘图函数

python绘制WRF土地利用

总结

  1. 判断需要提取的变量与诊断量

确定后,使用getvar函数进行提取。

可使用ncdump-h命令查看wrfout中的变量,wrf中的诊断量分类也可从官方文档处查阅。

  1. 判断绘图类型

所需的可视化绘图类型,决定了你在WRF后处理中的计算步骤。

1D点线图:ll_to_xy interpline

2D填色图:interplevel

3D剖面图:vinterp vertcross

  1. 绘图、美化

色标、XY轴、标签的设置等等。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年3月8日
下一篇 2023年3月8日

相关推荐