python--由wrfouput的数据计算位势涡度,并插值到指定压力层

近日,需要对wrf模式输出的数据进行计算位涡,并绘图分析。发现模式本身输出的数据中虽然不包含位涡,但wrf-python 提供了函数可以通过其他变量计算得到位涡。顺便记录一下计算的过程以及将位涡插值到压力层的过程

位涡的计算主要通过wrf-python这个库中的wrf.pvo这个函数,官网链接如下:

wrf-pvo

wrf.pvo(ustag, vstag, theta, pres, msfu, msfv, msfm, cor, dx, dy, meta=True)

计算位涡需要用到的变量包括:

  • 纬向风速U
  • 经向风速V
  • 位势温度T
  • 压力P
  • 几个其他参数:msfu、msfv、msfm、cor
  • x格点之间的距离:dx
  • y格点之间的距离:dy
    函数计算返回的就是位涡,单位为(puv)1 PVU = 1.0 x 10^(-6) m^2 s^(-1) K kg^(-1)

比较了一下ncl中的计算函数wrf_pvo()中计算过程是需要将:位涡+300 的,但是wrf-python中的没有体现,按道理应该是以ncl中的为准。

后来发现,通过getvar("T")得到的位温,它是perturbation potential temperature theta-t0,加上300才是 total potential temperature

下面给出定义的函数,直接输入文件路径,即可得到计算得到的位涡:

def cal_interp(file):
   ########################################################################
    ####通过函数计算位涡
   #######################################################################
    ncfile = Dataset(filelist[0])
    U = getvar(ncfile, "U")
    V = getvar(ncfile, "V")
    Theta = getvar(ncfile, "T")
    P = getvar(ncfile, "P")
    PB = getvar(ncfile, "PB")
    MSFU = getvar(ncfile, "MAPFAC_U")
    MSFV = getvar(ncfile, "MAPFAC_V")
    MSFM = getvar(ncfile, "MAPFAC_M")
    COR = getvar(ncfile, "F")
    DX = ncfile.DX
    DY = ncfile.DY
    THETA = Theta  + 300
    P     = P + PB
    pv = pvo(U, V, THETA, P, MSFU, MSFV, MSFM, COR, DX, DY, 0)
   ########################################################################
    ####下面将得到的位涡插值到等压面上,选取常用的27层压力层进行插值
   #######################################################################
    pre = getvar(ncfile, "pressure")
    level =np.array( [100,125,
                      150,175,200,
                      225,250,300,
                      350,400,450,
                      500,550,600,
                      650,700,750,
                      775,800,825,
                      850,875,900,
                      925,950,975,
                      1000]
            )
    level=level[::-1]
    
    plevs =level*units.hPa
    
    pv_interp = np.array(interplevel(pv, pre, plevs))
    
    potential_vorticity=pv_interp*units['K m**2 kg**-1 s**-1']
    return  potential_vorticity

使用函数:

path=r'/wrfout/'
filelist = glob.glob(path+'*')
filelist.sort()
pv = cal_interp(filelist[0])

这样就得到一个文件的位涡啦

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
w-python 提供了 `wrf.potential_temperature()` 函数来计算真相当位温,但是没有提供计算假相当位温的函数。不过,我们可以使用 `wrf.interplevel()` 函数将某个次上的气象场插值到另一个次上,从而计算假相当位温。 假相当位温是在常压面上定义的,因此我们需要先将气象场插值到常压面上,然后再计算假相当位温。下面是一个示例代码: ```python import numpy as np import xarray as xr import wrf # 读取 WRF 模拟数据 ds = xr.open_dataset("wrfout.nc") # 获取气压和温度 p = wrf.getvar(ds, "pressure") t = wrf.getvar(ds, "tc") # 选择要计算假相当位温的次,这里选择 500 hPa level = 500 # 插值到常压面上 p_c = 1000.0 # 常压面气压 t_c = wrf.interplevel(t, p, p_c) p_c_arr = np.full_like(t_c, p_c) # 计算假相当位温 theta_e = wrf.getvar(ds, "theta_e", timeidx=wrf.ALL_TIMES) theta_e_c = wrf.interplevel(theta_e, p, p_c) theta_e_c_arr = np.full_like(theta_e_c, theta_e_c) theta_se = wrf.calc.thetae(t_c, p_c_arr, theta_e_c_arr) # 将结果添加到数据集中 ds["theta_se"] = theta_se # 保存结果 ds.to_netcdf("wrfout_with_theta_se.nc") ``` 在上面的代码中,我们首先读取了 WRF 模拟数据,然后获取了气压和温度。接着,我们选择要计算假相当位温的次,这里选择了 500 hPa。然后,使用 `wrf.interplevel()` 函数将温度插值到常压面上,插值后的温度保存在变量 `t_c` 中。同时,我们也需要将常压面气压保存在 `p_c_arr` 中,这里使用了 `numpy.full_like()` 函数来生成一个和 `t_c` 相同大小的数组。接着,我们使用 `wrf.getvar()` 函数计算湿位势能,并使用 `wrf.interplevel()` 函数将湿位势插值到常压面上。最后,我们使用 `wrf.calc.thetae()` 函数计算假相当位温,并将结果保存在变量 `theta_se` 中。最后,我们将 `theta_se` 添加到数据集中,并将结果保存到文件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简朴-ocean

继续进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值