0%

WRF:理想实验指南

1. WRF模式介绍

WRF (Weather Research and Forecasting) 模式是一个开源、灵活、模块化的数值天气预报和大气模拟工具。

WRF模式的结构如图所示,其最为核心的部分是可执行程序wrf.exe(后缀仅仅是出于习惯,因为Linux并不以后缀标识文件类别)。

WRF模型可以运行两种不同的模拟:ideal和real。理想实验通常利用已有的sounding数据为WRF模型生成初始条件,而真实模拟则要求利用WPS(WRF Preprocessing System)进行前处理,将真实的测量数据转化为WRF模型的初始条件。WRF模型的可执行文件(wrf.exe)本身并不随着实验类型的不同而改变,但是这两种不同的实验对应两种不同的前处理程序,分别是ideal.exe和real.exe,它们都需要在WRF模式运行之前执行。

WRF的运行通常分为以下几个阶段:

  1. 准备环境
  • 安装依赖库(NetCDF、MPI等)
  • 编译WRF
  1. 数据处理(用于真实模拟)
  • 使用WPS处理初始条件和边界条件
  1. 运行模式
  • 修改参数和初始廓线
  • 运行初始化程序和主程序
  1. 结果分析
  • 使用NCL等数据分析工具对模式运行的结果进行分析和展示

本文的后几个部分会分别介绍第1,3,4个步骤。步骤2是专为真实模拟而进行的预处理,感兴趣的读者可以自行查阅WRF官方文档

2. 环境准备

对于如何准备系统环境和编译WRF,官方有一个详细的指南:How to Compile WRF: The Complete Process,这里仅做一个简单的介绍。

2.1 安装依赖库

WRF模式运行所必不可少的库有且仅有NetCDF,同时如果想要进行并行运算,还需要安装OpenMPI。安装之后可以通过ncdump --versionmpirun --version来检查自己是否安装成功,以及查看软件的版本。

2.2 下载WRF

可以直接git clone:

1
2
git clone https://github.com/wrf-model/WRF
git clone https://github.com/wrf-model/WPS

如果遇到网络问题,也可以到github上手动下载。

下载解压之后,WRF的目录中应该有如下内容:

2.3 编译WRF

首先运行

1
./configure

在出现的列表中根据系统和编译器选择合适的选项,并根据需要选择串行或并行(并行需要有OpenMPI库的支持)。选择之后还需要对嵌套网络进行选择,对于简单情况直接保持默认即可。

配置之后,在目录中应该会出现一个名为configure.wrf的文件。此时对于4.5.x/4.6.x的版本,还需要进行一步额外的操作才能成功编译,需要在configure.wrf文件的LIB_EXTERNAL的最后添加-lnetcdf,而对于更老的版本4.2.x/4.3.x/4.4.x,则不需要进行这步操作。

之后就可以直接进行编译了。首先我们可以打开 test 目录查看可用的理想实验,包括

确定自己要运行的理想实验之后,回到 WRF 目录,输入

1
./compile -j 4 em_grav2d_x

其中,-j 4代表使用4个线程进行并行编译,这个选项不是必须的,可以根据需要删去或更改;em_grav2d_x是本文中理想实验的名称,可以替换成test目录中的其他理想实验。

如果编译没有问题,应该会显示”Executables successfully built”,这是我们进入理想实验的目录test/em_grav2d_x,可以看到出现了可执行程序ideal.exewrf.exe

3. 理想实验:以em_grav2d_x为例

本文采用的理想实验是em_grav2d_x,用于模拟二维重力流。该实验基于Straka等人1993年发表的文章[1],在X-Z平面进行,水平方向满足周期性边界条件。

在运行程序之前,首先需要配置实验参数,这些参数在namelist.input文件中定义,其具体含义可以参见README.namelist,与本实验有关的参数及其含义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
run_minutes      = 15,      ! 模拟时长:15 分钟(控制模拟的时间范围)
history_interval = 1, ! 输出结果的时间间隔:每 1 分钟(模拟时间)输出一次

time_step = 1, ! 时间步长:1 秒(建议 dx/6 以确保稳定性)
e_we = 513, ! X 方向的网格点数:513
e_sn = 3, ! Y 方向的网格点数:3(保持 2D 模拟)
e_vert = 65, ! 垂直方向的网格点数:65
dx = 100, ! X 方向的水平分辨率:100 米
dy = 100, ! Y 方向的水平分辨率:100 米
ztop = 6409., ! 模拟顶部的高度:6409 米

diff_opt = 2, ! 水平扩散方案:2(隐式扩散)
khdif = 75, ! 水平扩散系数:75
kvdif = 75, ! 垂直扩散系数:75
h_mom_adv_order = 5, ! 水平动量对流项的离散阶数:5 阶(高精度)
v_mom_adv_order = 3, ! 垂直动量对流项的离散阶数:3 阶
h_sca_adv_order = 5, ! 水平标量对流项的离散阶数:5 阶
v_sca_adv_order = 3, ! 垂直标量对流项的离散阶数:3 阶
non_hydrostatic = .true., ! 非静力模式:启用

periodic_x = .true., ! X 方向的周期边界:启用(允许冷池自由传播)
periodic_y = .true., ! Y 方向的周期边界:启用

接着可以通过input_sounding文件设置初始大气的垂直廓线,文件夹中给出了静止大气的廓线和'input_sounding.um=20',也就是有20m/s的水平风速的廓线,当然也可以根据需要自己定义大气的初始廓线。

完成参数和初始廓线的配置之后,就可以运行初始化程序./ideal.exe,注意,每次修改完namelist.inputinput_sounding文件之后,都需要重新运行ideal,否则修改将不会生效。

之后我们就可以运行主程序了

1
./wrf.exe &

命令最后的&表示将程序提交到后台运行,这样即使前台的进程退出,程序依然可以正常工作。

如果想要中止之前的任务,可以先利用top命令查看自己作业的进程ID(PID),之后在命令行输入kill <PID>就可以结束掉该进程。

程序运行的结果将会保存在wrfout_d01_0001-01-01_00_00_00中,可以利用NCL等工具进行分析和后处理。

4. 结果分析

WRF模式支持多种分析结果的方式,包括NCL, RIP, ARWpost, UPP和VAPOR。程序默认输出的文件是netCDF格式的,可以利用NCL方便地进行处理。

作为简易快捷的查看方式,ncview可以让我们立刻观察到结果。但是为了更清晰地分析结果,可以使用NCL语言或者python的netCDF4库。

对于默认的初始参数,程序运行的结果如下:

可以看到,这团冷空气下落到地面的过程中就在水平方向上不断延展,之后会断裂成左右对称的两部分,并继续沿着地面移动。

我们可以改变实验中的参数,观察对于结果有什么影响。

  1. 改变水平风速:修改input_sounding文件中的水平风速场,将水平风速分别设置为0,20,40,得到的结果如下(从上到下风速依次为0,20,40):

可以看到,水平的风速对于系统仅有一个水平方向随时间平移的作用,对于气团的结构则几乎没有影响。

  1. 改变分辨率:直接利用文件夹中提供的namelist.input.dx=200namelist.input.dx=400文件,得到的结果如下(从上到下分辨率依次为100,200,400):

分辨率降低的时候,程序运算的时间显著减少,但是代价是失去了气团的精细结构。

  1. 改变扩散系数:修改namelist.input中的khdifkvdif,得到的结果如下(从上到下扩散系数分别为50,75,100,其中75是默认值):

综上,我们成功地编译并运行了WRF模式,并对em_grav2d_x这个简单的二位重力流问题进行了理想实验。


  1. 1.[Straka et al., Numerical Solutions of a Nonlinear Density Current: A Benchmark Solutioon and Comparisons, Int J Numer Meth Fl, 17 (1): 1-22, 1993]