高性能计算服务
>
软件专区
>
最佳实践
>
WRF高分辨率数值模拟
台风是形成在热带海洋上的强烈天气系统,是地球上最具破坏力的自然灾害之一。每年全球热带洋面生成的、最大风速达到8级以上的热带气旋平均有83个,影响 50多个国家。
Weather Research and Forecasting(WRF)是一款由美国国家大气研究中心(NCAR)、国家海洋和大气管理局(NOAA)及其合作伙伴共同开发的广泛使用的数值天气预测和大气研究工具。它用于模拟短期天气预报、大气过程和长期气候模拟。
使用WRF的前提需要进行基础库和WRF模式的编译安装,流程较为麻烦繁琐。现在,超算互联网提供WRF一键部署服务,使科研人员能够绕过繁琐的设置和调试,轻松体验WRF的强大功能。
本次实操,我们将利用中尺度非静力WRF模式,对2008年第8号台风 “凤凰”的登陆过程开展高分辨率数值模拟。
“凤凰”台风于2008年7月25日6时 (世界时,下同)生成后一路西行,26日在中国台湾以东洋面加强为强热带风暴,并于26日9时加强为台风,27日12时进一步加强为强台风,27日22时30分在台湾花莲登陆 (中心气压955hPa,最大风速45m/s,14级),之后继续向西北方向行进,强度有所减弱,并于7月28日14时在福建省福清市东瀚镇再次登陆,登陆时强度仍然达台风量级 (中心气压975hPa ,最大风速33m/s ,12级)
本文利用非静力中尺度数值模式WRF v4.5对“凤凰”台风登陆过程开展高分辨率数值模拟,模拟时间范围为2008年7月25日12时至30日12时,共120小时(5天)。
选取1°×1°分辨率NCEP/NCAR(National Center for Environmental Prediction/National Center for Atmospheric Research)分析资料(间隔6小时)形成模式初始场。数值模拟区域水平分辨率分别为27km,模式积分区域中心为(26.0°N,120.5°E),各模拟区域网格数为200×180。
首先,登录超算互联网,在首页搜索“WRFv4.5版本”并购买。
在“我的商品”中找到所购买的 WRF,点击“命令行”图标选择开通区域后进入 eshell 界面。终端会显示商品自带的软件应用版本、环境变量和启动路径信息。由启动路径可以得到软件部署的位置。
建立Project文件夹,将WRF拷贝一份到Project文件夹。
mkdir Project
cp -rf /public/home/daimu/apprepo/wrf_wps/4.5-intelmpi2017/app/WRF/ ./
cp -rf /public/home/daimu/apprepo/wrf_wps/4.5-intelmpi2017/app/WPS/ ./
随后,在Project建立GEOG文件夹,并上传静态数据地形文件并解压。静态数据可从https://www2.mmm.ucar.edu/wrf/users/download/get_sources_wps_geog.html#specific获得。
Project下上传FNL数据。
加载WRF运行环境,并进入Project/WPS文件夹,WPS文件夹内需要有Vtable文件,一般用的Vtable.GFS,复制到WPS/ungrib/Variable_Tables/Vtable.GFS文件下到WPS文件夹下,并重命名为Vtable。然后对namelist.wps进行参数修改,运行相关命令。
namelist.wps参数设置:
module use /public/software/modules /opt/hpc/software/modules; source /public/home/daimu/apprepo/wrf_wps/4.5-intelmpi2017/scripts/env.sh
cd ./Project/WPS
./geogrid.exe
./link_grib.csh ../FNL/*
./ungrib.exe
./metgrid.exe
随后进入Project/WRF/run文件,对namelist.input文件进行修改,运行以下命令。
ln -sf ../../WPS/met_em.d* .
./real.exe
将/apprepo/wrf_wps/4.5-intelmpi2017/case/wrf.slurm文件复制到Project/WRF/run下,运行以下命令,提交任务。
sbatch wrf.slurm
输入squeue查看任务。
在文件夹下可以看到wrfout-文件,表示模式运行成功。
Step1: 下载miniconda
Step2: 安装miniconda
Step3: 建立WRF环境
Step4: 安装python包
conda install numpy
conda install netcdf4
conda install -c conda-forge wrf-python
conda install matplotlib
conda install cartopy
选择世界时间2008年7月27日21时的数据,利用python进行绘图,查看当前台风的位置和引起的降雨情况。
import numpy as np
from netCDF4 import Dataset
from wrf import (to_np, getvar, smooth2d, get_cartopy, cartopy_xlim,
cartopy_ylim, latlon_coords)
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from cartopy.io.shapereader import BasicReader
import matplotlib.ticker as mticker
# 读取数据
f='/data/wrfout_d01_2008-07-27_21_00_00'
ncfile = Dataset(f)
R = to_np(getvar(ncfile,"RAINC"))+to_np(getvar(ncfile,"RAINNC"))+to_np(getvar(ncfile,"RAINSH"))
lon = np.array(ncfile['XLONG'])[0,:,:]
lat = np.array(ncfile['XLAT'])[0,:,:]
slp = getvar(ncfile, "slp")
# shape文件读取
countries=BasicReader('/data/国家矢量.shp')
ten=BasicReader('/data/九段线.shp')
province=BasicReader('/data/2023年省级.shp')
# 颜色条设置
rgb = ([237, 237, 237],[209, 209, 209],[173, 173, 173],[131, 131, 131],
[93 , 93 , 93],[151, 198, 223],[111, 176, 214],[49 , 129, 189],
[26 , 104, 174],[8 , 79 , 153],[62 , 168, 91],[110, 193, 115],
[154, 214, 149],[192, 230, 185],[223, 242, 217],[255, 255, 164],
[255, 243, 0],[255, 183, 0],[255, 123, 0],[255, 62 , 0],
[255, 2 , 0],[196, 0 , 0],[136, 0 , 0],
)
clors = np.array(rgb)/255.
clevs = [0.1, 1, 2, 5, 7.5, 10, 13, 16, 20, 25, 30, 35, 40, 50, 60,
70, 80, 90, 100, 125, 150, 175, 200, 250
]
clevs = [value * 5 for value in clevs]
# 画图
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection=ccrs.PlateCarree())
contour = ax.contourf(lon,lat, R, clevs, colors=clors, transform=ccrs.PlateCarree())
cb_cf = fig.colorbar(contour, ax=ax,ticks=clevs, shrink=.65)
ax.add_geometries(countries.geometries(),linewidth=.5,edgecolor='black',crs=ccrs.PlateCarree(),facecolor='none')
ax.add_geometries(ten.geometries(),linewidth=.5,edgecolor='black',crs=ccrs.PlateCarree(),facecolor='none')
ax.add_geometries(province.geometries(),linewidth=.5,edgecolor='black',crs=ccrs.PlateCarree(),facecolor='none')
ax.set_extent([117,128,20,28],crs=ccrs.PlateCarree()) # 小范围
g1=ax.gridlines(draw_labels=True,linewidth=1,color='none',alpha=0.5,linestyle='--',x_inline=False,y_inline=False)
g1.top_labels=False
g1.right_labels=False
g1.xformatter=LONGITUDE_FORMATTER
g1.yformatter=LATITUDE_FORMATTER
g1.rotate_labels=False
g1.xlocator = mticker.FixedLocator(np.arange(117,128,2))
g1.ylocator = mticker.FixedLocator(np.arange(20,28,1))
g1.xlabel_style={'size':17}
g1.ylabel_style={'size':17}
smooth_slp = smooth2d(slp, 3, cenweight=4)
fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(111, projection=ccrs.PlateCarree())
contour = ax.contourf(lon,lat, to_np(smooth_slp), 10, transform=ccrs.PlateCarree())
cb_cf = fig.colorbar(contour,ax=ax, shrink=.65)
ax.add_geometries(countries.geometries(),linewidth=.5,edgecolor='black',crs=ccrs.PlateCarree(),facecolor='none')
ax.add_geometries(ten.geometries(),linewidth=.5,edgecolor='black',crs=ccrs.PlateCarree(),facecolor='none')
ax.add_geometries(province.geometries(),linewidth=.5,edgecolor='black',crs=ccrs.PlateCarree(),facecolor='none')
ax.set_extent([117,128,20,28],crs=ccrs.PlateCarree()) # 小范围
g1=ax.gridlines(draw_labels=True,linewidth=1,color='none',alpha=0.5,linestyle='--',x_inline=False,y_inline=False)
g1.top_labels=False
g1.right_labels=False
g1.xformatter=LONGITUDE_FORMATTER
g1.yformatter=LATITUDE_FORMATTER
g1.rotate_labels=False
g1.xlocator = mticker.FixedLocator(np.arange(117,128,2))
g1.ylocator = mticker.FixedLocator(np.arange(20,28,1))
g1.xlabel_style={'size':17}
g1.ylabel_style={'size':17}
台风到来时,中心气压最低,从图中可以看出,最低处位于台湾岛东南部,这一点也与实际情况相近。此时,降雨情况如下图所示。
这里分别选用积云参数化方案Kain-Fritsch和GF进行敏感性实验,探究不同积云参数化方案对台风凤凰模拟的影响。2008年7月28日5时,台风凤凰所在的位置为:
分别利用Kain-Fritsch和GF积云参数化方案模拟的台风凤凰位置如图所示,可以看到Kain-Fritsch积云参数化方案模拟的位置相对准确,而GF积云参数化方案模拟的台风位置相对偏后。
Kain-Fritsch
GF
从降雨分布看,Kain-Fritsch积云参数化方案模拟的降雨范围分布较广,影响范围比较大,但强度较弱;而GF积云参数化方案模拟的降雨范围分布较小,影响范围比较小,但强度较强。
Kain-Fritsch
GF
我们分别使用8核、16核、32核和64核运行此案例,运行时长分别为1h15m15s、53m9s、35m40s和23m16s。从图中可以看出,随着运行核数的增加,运行时长大大的减小,但由于网格数量的限制,减小趋势大大放缓。