罕见!WRF计算LWC与IWC及可视化

前言

气象家园帖子公式参考:https://bbs.06climate.com/forum.php?mod=viewthread&tid=90527&highlight=lwc

LWC=Qcloud*1000*dens

IWC=(QICE+QSNOW) *1000*dens

其中QCLOUD为Cloud water mixing ratio (kg/kg),QICE 为ice mixing ratio (kg/kg),QSNOW为snow mixing ratio (kg/kg),一般WRFOUT中都有这几个输出量;

1000是将kg/kg換成g/kg;

dens为密度,在一般WRFOUT中没有直接输出

在大气科学研究中,了解大气中液态水含量(LWC)和冰态水含量(IWC)的分布对于理解和预测天气现象非常重要。LWC是指空气中以液态存在的水的质量,通常以克/千克为单位。IWC是指空气中以冰态存在的水的质量,也以克/千克为单位。

通过使用WRF模式的输出数据(通常是WRFOUT文件),我们可以计算并绘制LWC和IWC在空间上的分布图。这可以帮助我们观察和分析云和降水过程中液态和冰态水的分布情况,从而更好地了解大气中的物理过程。

在计算LWC和IWC时,我们需要获取WRF模式输出数据中的相关变量,例如云水混合比(QCLOUD)、冰水混合比(QICE)、雪水混合比(QSNOW)以及空气密度(dens)。然后,通过将这些变量与空气密度相乘,我们可以得到LWC和IWC的质量(以克/千克为单位)。

最后,我们使用Python中的科学计算库(如metpy、netCDF4和WRF-Python)以及数据可视化库(如Matplotlib和Cartopy)来进行数据处理、计算和绘图。这些库提供了丰富的功能,使我们能够方便地从WRF模式的输出数据中提取所需信息,并通过绘制分布图来展示LWC和IWC的空间分布。

导入计算与绘图库

In [2]:

代码语言:javascript
复制
代码语言:javascript
复制
from wrf import uvmet, to_np, getvar, interplevel, smooth2d, get_cartopy, cartopy_xlim, cartopy_ylim, latlon_coords,destagger
import numpy as np
from netCDF4 import Dataset
import metpy.calc as mpcalc
import xarray as xr
from metpy.units import units
import matplotlib.pyplot as plt
from matplotlib.cm import get_cmap
from matplotlib.colors import from_levels_and_colors
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import cartopy.io.shapereader as shpreader
from cartopy.feature import NaturalEarthFeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
from cartopy.mpl.gridliner import LATITUDE_FORMATTER, LONGITUDE_FORMATTER
import cmaps
from cnmaps import get_adm_maps, draw_map
from glob import glob
import metpy.calc as mpcalc
import metpy.constants as constants
代码语言:javascript
复制

变量提取与计算

In [3]:

代码语言:javascript
复制
代码语言:javascript
复制
# 读取WRFOUT文件
ncfile = Dataset("/home/mw/input/wrfout3385/wrfout_d02_2022-07-14_1300.nc")

获取所需的变量

提取温度和气压

t = getvar(ncfile, "T")
p = getvar(ncfile, "pressure")
qvor = getvar(ncfile,"QVAPOR")
z = getvar(ncfile,"z")

计算密度

rho = mpcalc.density(p, t, qvor)

获取水含量变量

qc = getvar(ncfile, "QCLOUD")
qi = getvar(ncfile, "QICE")
qs = getvar(ncfile, "QSNOW")

计算LWC和IWC

lwc = qc * 1000 * rho
iwc = (qi + qs) * 1000 * rho

将结果转换为NumPy数组

lwc = to_np(lwc)
iwc = to_np(iwc)

提取经纬度

lats, lons = latlon_coords(qc)

代码语言:javascript
复制

In [4]:

代码语言:javascript
复制
代码语言:javascript
复制
ter = xr.open_dataset('/home/mw/input/china_dem3276/cldasgrid_dem.nc')
ter = ter.elevation
lon = ter.lon
lat = ter.lat
代码语言:javascript
复制

简易绘图

In [5]:

代码语言:javascript
复制
代码语言:javascript
复制
# 绘制LWC分布图
cmap = cmaps.radar
plt.figure(figsize=(10, 8))
plt.contourf(lwc[0, :, :], cmap=cmap)
plt.colorbar()
plt.title("Liquid Water Content (LWC)")
plt.show()

绘制IWC分布图

plt.figure(figsize=(10, 8))
plt.contourf(iwc[0, :, :], cmap=cmap)
plt.colorbar()
plt.title("Ice Water Content (IWC)")

plt.show()

代码语言:javascript
复制

复杂绘图

代码语言:javascript
复制

完整代码可去下面链接在线运行查看,iwc没什么分布就不多画了

WRF计算LWC与IWC及可视化叠加山体阴影

计算公式如有错误还请指教,笔者未去查找相关文献