上期gridfill文章一读者留言:wrf-python自带的vinterp函数就可以实现这个功能
talk is cheap,让我们来试试吧

image
如图所示,wrf.vinterp 是 WRF 专用的垂直插值函数,文档明确将其描述为 wrf.interplevel的"更智能但更慢"的版本:
"Smarter, albeit slower version of wrf.interplevel()"
它的本职工作是将三维场插值到用户指定的垂直坐标面,如:
* pressure(等压面)
* ght_msl / ght_agl(等高度面)
* theta / theta-e(等位温面)
关键参数
from wrf import vinterp
interp_field = vinterp(
wrfin, # WRF NetCDF 文件对象
field=tk, # 待插值的 3D 场
vert_coord="pres", # 目标垂直坐标:等压面
interp_levels=[850, 500], # 目标层(hPa)
extrapolate=False, # 是否在地形以下外推
field_type="tk", # 变量类型标识
log_p=True # 对数气压插值
)
其中extrapolate就是我们所需要的参数,在需要地形外推时打开即可。通过官方文档我们可以得知:
1. 它只在垂直方向外推,不是水平方向的空间插值
2. 有条件限制:只有当 vert_coord 和 field_type 匹配特定组合时才生效
3. 如果条件不满足或 field_type=None,则直接使用最低模式层值,不做任何外推
另外从 wrf_vinterp.f90 源码可以看出,其地下外推的物理假设是:
! 使用美国标准大气递减率 (US Standard Atmosphere lapse rate)
tlev = tlhsl + (zlhsl - zlev)*USSALR ! 温度外推
! 对压力坐标:
zlev = zbot + vt/USSALR*(1. - (vlev/pbot)**EXPON)
! 对高度坐标:
plev = pbot*(1. + USSALR/vt*(zbot - zlev))**EXPONI
* 利用最低模式层温度、气压、湿度和标准大气递减率
* 在垂直方向上估算地形以下的物理量
* 本质上是1D的物理外推,不是 2D 的空间插值
from wrf import getvar, vinterp
t850_1 = vinterp(wrf_file, t, 'pressure', [850],extrapolate=True )
仅需将interplevel换为以上即可

image
左侧为vinterp函数,右侧为gridfill函数。 你觉得哪个效果更佳呢
vinterp 的 extrapolate 是在垂直方向基于标准大气外推,避免插值时产生NaN;而 gridfill 是在水平方向基于泊松方程进行空间平滑填补。两者原理和适用场景不同。如果已经产生了二维面上的 NaN(如用 interplevel 插值后),vinterp无法事后填补。
需要拿wrf变量算方程还是更加推荐gridfill一些,你怎么看呢