WRF运行的单向/双向嵌套机制
- 准备工作:
- WRF运行的基本流程
- namelist.input的详细设置
- &time_control 设置
- &domain 嵌套结构
- &bdy_control 配置部分
- namelist 其他注意事项
- Registry.EM
- 运行 ARW 嵌套
- 双向嵌套(two-way nesting)
- Moving Nest Case(移动嵌套,仅 ARW 支持)
- 单向嵌套(one-way nesting)
- 🔁 One-way vs Two-way 嵌套对比
- 另:“单向嵌套”与“双向嵌套” 的差异比较
- 设置"纯净"的嵌套模拟
- 参考
准备工作:
1、编译时选择支持嵌套的选项
2、确保生成了 real.exe, wrf.exe, ndown.exe(如需单独运行嵌套区域)
可查看wrf/run文件夹下的.exe文件内容:
ls -lh /home/directory/WRF-4.6/WRF-4.6.1/run/*.exe
对于ARW版本:输出结果应包含:
ndown.exe
real.exe
tc.exe
wrf.exe
3、对于 real-data 模拟,需生成 met_em.d0 文件供嵌套区域使用*
对于ARW版本:(只有有一个时间段)
met_em.d01.<date>, met_em.d0*.<date>
WRF运行的基本流程
WPS预处理和WRF运行的详细过程可参见另一博客-【WRF模拟】全过程总结:WPS预处理及WRF运行。
1、进入运行目录
cd /home/directory/WRF-4.6/WRF-4.6.1/run
2、在wrf/run文件夹下,链接或复制 WPS 输出文件
cd test/em_real
ln -sf ../../../WPS/met_em.* .
3、编辑 namelist.input
namelist.input 是关键:
- 嵌套运行的控制几乎全部依赖 namelist.input
- 关键参数:max_dom ≥ 2
- 注意嵌套相关多列参数设置(如时间、格点数等)
4、运行 real.exe 初始化
mpirun -np N ./real.exe
mpirun -np 3 ./real.exe
N为并行进程数。
real.exe 运行成功后,会得到初始和边界条件文件:
wrfinput_d01
wrfinput_d02
wrfbdy_d01
文件名 | 含义 | 说明 |
---|---|---|
wrfinput_d01 | 初始场文件(Domain 1) | 模拟起始时刻的完整变量场 |
wrfinput_d02 | 初始场文件(Domain 2) | 若有嵌套域,也会生成对应的初始场 |
wrfbdy_d01 | 边界场文件(Domain 1) | 仅对最外层域 d01 生成,提供模拟期间的侧边界变化信息 |
- wrfinput_d0X:对所有域来说,这些文件只包含模型开始时间点的变量数据(即单一时刻的 3D 初始-场,如温度、风、湿度等)。
- 仅对 最外层域(d01) 生成的文件,包含多个时间层次的侧边界数据。这些数据会在模拟过程中不断注入模型边界,以保证大尺度强迫。
5、运行 wrf.exe 执行模拟
# 设置 堆栈大小 为 无限制,以避免分段错误
ulimit -s unlimited
# >& wrf.out:将标准输出与错误信息都写入 wrf.out 文件;
./wrf.exe >& wrf.out &
# <num_processes> 替换为希望使用的计算进程数。
mpirun -np <num_processes> ./wrf.exe
# 单进程运行
mpirun -np 1 ./wrf.exe
✅ 对于嵌套模拟(Nested Cases),强烈推荐使用并行运行!
运行成功,会生成以下文件:
wrfout_d01_2005-08-28_00:00:00
wrfout_d02_2005-08-28_00:00:00
如果选择了重启功能(Restart),则会生成以下文件:
wrfrst d01 <date>, wrfrst d02 <date>
这些文件包含完整的模型状态变量,可用于中断恢复或长时间跨阶段模拟。
namelist.input的详细设置
&time_control 设置
&time_control 部分的配置内容如下:
注意:嵌套域的起止时间可以不同于父域,但必须在父域的时间范围内!!!
参数解释与说明:
参数 | 含义 | 示例值 | 说明 |
---|---|---|---|
run_days run_hours… | 模拟总时长 | 0天24小时 | 模型运行时间为 24 小时 |
start_year, start_month… | 各嵌套域的起始时间 | 2000-01-24 12:00:00 | 每列分别对应 D01, D02, D03 |
end_year, end_month… | 各嵌套域的结束时间 | 2000-01-25 12:00:00 | 与起始时间一致表示三层嵌套同步运行24小时 |
interval_seconds | WPS met_em 文件的时间间隔(秒) | 21600 秒(6小时) | WRF 每 6 小时读取一次边界数据 |
1、模拟时长可通过 run_* 设置,也可通过 start_* 和 end_* 控制:两者必须一致,否则行为不可预测。
2、interval_seconds 参数必须与 met_em 文件时间间隔一致:
常见值:21600(6小时)、10800(3小时)等。
&time_control 其他部分的配置如下:
&time_control
interval_seconds = 21600,
history_interval = 180, 60, 60,
frame_per_outfile = 1000, 1000, 1000,
restart_interval = 360,
/
参数解释与说明:
参数 | 示例值 | 说明 |
---|---|---|
interval_seconds | 21600 | 输入数据的时间间隔(单位:秒),通常指 met_em.d0* 文件的时间步长,21600 秒 = 6 小时 |
history_interval | 180, 60, 60 | 每个 domain 输出一次历史文件的时间间隔(单位:分钟) - D01 每 180 分钟(3小时) 输出一次 - D02 和 D03 每 60 分钟(1小时) 输出一次 |
frame_per_outfile | 1000, 1000, 1000 | 每个输出文件中包含的时间帧数(即多少个时间点的数据写入一个文件) - 如果模拟时间长,会自动拆分成多个 wrfout_* 文件 |
restart_interval | 360 | 每 360 分钟(6小时) 输出一次 wrfrst_d0* 重启动文件(restart file) - 便于从中断处继续模拟 |
注意:
1、每个嵌套域都会生成自己的 wrfout_d0* 历史文件(比如 wrfout_d01_…, wrfout_d02_…)
2、各嵌套层的输出间隔可以不同,便于根据分辨率控制输出精度与数据量(由 history_interval 控制)
3、每个域的重启文件(wrfrst_d0*)也分别生成,可用于单独或联合重启模拟(由restart_interval变量控制)
4、如果 frame_per_outfile 值较小,或模拟时间很长,会拆分出多个 wrfout 文件(例如按天或按小时)
3、&time_control 中关于嵌套域输入控制的变量
&time_control
input_from_file = .true., .true., .true.,
fine_input_stream = 0, 2, 2,
/
🔹 input_from_file(布尔型)
作用:控制 real.exe 是否为每个嵌套域读取 wrfinput_d0* 文件作为初始场。
对应域:
- .true.:为该域读取 wrfinput_d0* 文件(通常由 real.exe 生成);
- .false.:该域不读取输入文件,WRF 会自动从父域插值获得初始场。
📌 在 真实资料模拟(real-data run) 中,通常都设为 .true.,这样每个域都有自己的初始化文件。这是 真实资料模拟(real) 中的常规做法。
🔹 fine_input_stream(整数型)
作用:指定嵌套域在初始化时使用哪些输入流(input streams)中定义的数据变量。
取值说明:
- 0:使用所有变量(默认)(fine_input_stream = 0);
- 2:表示使用 Registry 中 io_form_2(即 I/O stream 2)中定义的变量;
这通常用于嵌套域在父域开始后延迟启动的情况,可避免不必要变量的初始化。
&domain 嵌套结构
&domains 支持以下嵌套结构:
-
多嵌套共享一个父域 ✅
-
多层嵌套(嵌套嵌套)✅
-
❌ 不允许多父域(如 D03 同时嵌套 D01 & D02)
嵌套域(Nest)在父域中的起始位置定义:
i_parent_start、j_parent_start:指定嵌套域在父域中的起始位置(起始网格点),以父域的网格坐标系为参考。
红色箭头指向嵌套域的左下角,说明其起始位置在 父域的第 31 个网格点(I=31)。
对应在 namelist.input 的设置如下:
i_parent_start = 31,
j_parent_start = 17,
- i_parent_start=31:嵌套域在 父域的第31列网格点 开始;
- j_parent_start=17:嵌套域在 父域的第17行网格点 开始
&domain 的内容如下(参考):
max_dom = 3,
e_we = 74, 112, 94,
e_sn = 61, 97, 91,
e_vert = 28, 28, 28,
grid_id = 1, 2, 3,
parent_id = 0, 1, 2,
i_parent_start = 0, 31, 30,
j_parent_start = 0, 17, 30,
设置项 | 含义 | 注意事项 |
---|---|---|
max_dom | 定义模拟的嵌套域数量 | 必须 ≥ 所用嵌套层数 |
e_we/e_sn | 每个域的水平网格维度 | 与 WPS 完全一致 |
grid_id/parent_id | 定义域的嵌套层级关系 | 编号从 1 开始,父域 ID 必须小于子域 ID |
i/j_parent_start | 嵌套域在父域中的起始位置 | 对应左下角,必须准确对齐 WPS 设置 |
注意:这些值必须与 WPS 中设置的嵌套起点一致,否则会报错或嵌套错位。
dx = 30000, 10000, 3333.33,
dy = 30000, 10000, 3333.33,
parent_grid_ratio = 1, 3, 3,
parent_time_step_ratio = 1, 3, 3,
参数详解:
参数 | 含义 | 示例值 |
---|---|---|
dx, dy | 每个网格点的水平间距(单位:米) | D01: 30km, D02: 10km, D03: 3.33km |
parent_grid_ratio | 当前域相对于父域的网格间距倍率 | D01:1, D02:3, D03:3(都表示 finer by 3x) |
parent_time_step_ratio | 当前域相对于父域的时间步长倍率 | 通常与 grid ratio 相同,但可以不同 |
注意:
1、所有 4 个变量都必须显示设置(否则模拟会失败);
2、grid ratio(网格比率)必须为整数,如 3、5;
3、time step ratio(时间步长比)可与 grid ratio 不同,但通常建议一致,以保持数值稳定性;
4、网格间距单位为米,即使使用经纬度投影(lat/lon)也必须换算为米;
对于旋转经纬度网格(rotated lat/lon),dx ≠ dy 是允许的。
与嵌套反馈机制相关的参数:feedback 和 smooth_option。它们控制嵌套域(Nest)与其父域(Parent Domain)之间的数据回馈与平滑处理。
&domains
feedback = 1,
smooth_option = 0,
/
✅ feedback
作用:控制嵌套域(子域)是否将其模拟结果“反馈”给父域。
取值:
- 0:无反馈(称为 一向嵌套 one-way nesting)
➤ 嵌套域不会修改父域的模拟结果; - 1:开启反馈(称为 双向嵌套 two-way nesting)
➤ 嵌套域的高分辨率结果可更新父域覆盖区域中的值。
📌 通常推荐在研究高分辨率区域对整个区域有反馈影响时使用 feedback = 1。
✅ smooth_option
作用:当开启 feedback=1 时,是否对嵌套与父域边界区域进行平滑处理,以减少突变。
取值:
- 0:不进行平滑(默认值);
- 1:进行一次平滑;
- 2:进行两次平滑。
📌 平滑处理有助于防止嵌套区与父域交界处出现数值不连续,尤其在地形复杂区域。
参数 | 含义 | 常用值 | 建议 |
---|---|---|---|
feedback | 嵌套域是否影响父域 | 0 = one-way 1 = two-way | 若嵌套区重要,建议设为 1 |
smooth_option | 是否对 feedback 区域进行平滑 | 0, 1, 2 | 若反馈开启,建议设为 1 或 2 |
&bdy_control 配置部分
&bdy_control 配置部分主要控制边界条件的设置方式和边界区域的平滑处理,对于模型稳定性和嵌套域之间的一致性非常重要。
&bdy_control
spec_bdy_width = 5,
spec_zone = 1,
relax_zone = 4,
specified = .T., .F., .F.,
nested = .F., .T., .T.,
/
参数逐项解释:
参数 | 意义 |
---|---|
spec_bdy_width | 外边界总宽度(单位:格点数),包含指定区和缓冲区。这里为 5 |
spec_zone | 指定区(specified zone)的宽度。外部强制施加边界值,比如来自 GFS 数据。这里为 1 |
relax_zone | 缓冲过渡区(relaxation zone)的宽度,用于平滑地过渡到内部模拟区域。这里为 4 |
specified | 是否为每个域施加外部边界条件: .T. 表示施加(一般只对最外层域 d01) .F. 表示不施加(嵌套域不需要) |
nested | 是否为嵌套域应用父域边界强制(嵌套边界条件): d01 为 .F.(无父域) d02/d03 为 .T.(从父域获得边界) |
📌 注意事项
1、spec_zone + relax_zone = spec_bdy_width
即边界区总宽度必须等于指定区与缓冲区之和。
2、对 ARW 模型,你可以自由设置 relax_zone 和 spec_zone 的值,但它们的总和必须等于 spec_bdy_width。
3、specified 和 nested 的布尔值列表应与你的 domain 数量一致(如 3 个域就要写 3 个值)。
- 左图:wrfinput_d02,为嵌套域的初始边界输入文件,边界区域过渡较生硬,颜色变化突兀;
- 右图:wrfout_d02,模拟过程中使用了边界平滑处理,边界(黑线标出)附近的颜色(变量值)过渡更加平滑。
📌 这说明设置合适的 relax_zone 能够有效减少边界处的不连续性,提高模拟稳定性和准确性。
namelist 其他注意事项
1、所有嵌套域应尽量使用相同的物理方案设置。
WRF 模拟中包括多种物理方案(如微物理、对流、边界层、辐射等),建议所有域(d01、d02、d03…)使用相同的物理参数配置。
⚠️ 例外:积云对流方案(cumulus scheme)
当嵌套域的分辨率非常高(通常 ≤ 3 km),对流可被显式解析(即用显式微物理方案模拟出来),不再需要参数化。即,对于高分辨率嵌套域(如 dx = 1 km 或 3 km),应关闭 cumulus 参数化:
cu_physics = 1, 0, 0, ! d01 开启积云方案,d02/d03 关闭
2、所有域应使用相同的物理过程调用频率,如 radt, cudt 等。
参数说明:
参数 | 含义 | 单位 |
---|---|---|
radt | 辐射方案的调用间隔 | 秒 |
cudt | 积云方案的调用间隔 | 秒 |
建议所有域统一设置这些频率,不要因分辨率不同而设置不同值。
radt = 30, 30, 30
cudt = 5, 0, 0
3、并非所有 namelist 参数都与域(domain)相关
有些变量必须为每个 domain 单独设置(如 dx, dy, i_parent_start),
但也有一些是全局变量(如 run_days, history_interval),不需要为每个域重复设置。
如果不确定某个参数是否与域有关,可以查阅:
➡️ Registry.EM
➡️ registry.io_boilerplate
在这些文件中查找 rconfig 或 namelist 字符串,可以判断该变量是否支持逐域设置。例如:
rconfig "dx" real namelist,domain 1 "grid spacing x-direction"
表示 dx 是 namelist.input 中的、支持逐域设置的变量。
Registry.EM
Registry.EM 是 WRF 模型的核心配置注册表,用于定义各类物理量、输入输出变量、namelist 参数等;其告诉 WRF 程序:
- 参数的类型(如整数、逻辑值等);
- 参数属于哪个 namelist 区块;
- 是否逐域(per domain)设置;
- 默认值是多少。
示例字段如下:
rconfig integer spec_bdy_width namelist,bdy_control 1 5
rconfig logical specified namelist,bdy_control max_domains .false.
rconfig integer distributed_ahe_opt namelist,physics 1 0 rh "distributed_ahe_opt" "AHE handling: 0= no AHE, 1=add to first level temperature tendency, 2=add to surface sensible heat flux" ""
distributed_ahe_opt 是全局统一设置,不能按域区分!
字段 | 含义 |
---|---|
rconfig | 表示这是一个 namelist 配置项(run-time config) |
integer / logical / 浮点(real)/ 字符串(character) | 参数类型(整型 / 逻辑型) |
如:spec_bdy_width | 参数名称 |
namelist,bdy_control | 参数属于哪个 namelist 区块(比如 &bdy_control) |
1 或 max_domains | 设置方式:1 表示所有域共用;max_domains 表示每个域独立设置 |
默认值 | 比如 5, 1, 4, .false. 等 |
运行 ARW 嵌套
嵌套方式总结:
嵌套类型 | 特征 |
---|---|
Two-way (无 nest input) | input_from_file = .false. |
Two-way (有 nest input) | input_from_file = .true. |
Two-way(仅静态输入) | fine_input_stream = 2 |
One-way(并行) | feedback = 0 |
One-way(分开运行) | 使用 ndown.exe |
Two-way 移动嵌套 | 指定或自动追踪台风 |
双向嵌套(two-way nesting)
Moving Nest Case(移动嵌套,仅 ARW 支持)
移动嵌套(Moving Nest)是指嵌套域(子域)可以在模拟过程中移动位置,以追踪目标系统(如热带气旋)。
1、节省计算资源:只在感兴趣区域使用高分辨率;
2、编译时需选择正确选项:
修改 configure.wrf 文件;
支持两种移动模式:
- preset move(指定路径);
- vortex following(自动追踪台风等涡旋);
3、运行时配置通过 namelist.input 控制;
4、所有子域都可以设置为移动。
选择1:手动控制嵌套域的移动路径:
- 用户预先指定每一步的移动方向;
- 每次移动只能移动一个网格单元(grid cell);
- 必须提前设置嵌套初始位置。
namelist.input 中的关键参数(在 &domains 中):
num_moves = 10 ! 总共移动次数
move_id = 2 ! 要移动的嵌套域 ID(如 d02)
move_interval = 60 ! 移动时间间隔(分钟)
move_cd_x = 1,-1,... ! 每次移动在 x 方向的格点数
move_cd_y = 0, 1,... ! 每次移动在 y 方向的格点数
corral_dist = 4 ! 套索距离(防止跑出父域)
选择2:Automatic Moving Case(自动追踪嵌套)
适用于热带气旋模拟(自动追踪台风中心):
- 嵌套域自动识别并追踪台风等涡旋系统;
- 更适合发展成熟的风暴。
namelist 中的关键参数(&domains):
参数 | 含义 | 默认值 |
---|---|---|
vortex_interval | 追踪间隔时间 | 15 分钟 |
max_vortex_speed | 最大允许移动速度 | 40 m/s |
corral_dist | 套索距离 | 8 个粗网格格点 |
track_level | 追踪层次(高度) | 50000 Pa |
time_to_move | 开始移动的时间 | 0 小时 |
单向嵌套(one-way nesting)
流程解析:
1、使用 WPS 生成 met_em.d01.* 和 met_em.d02.*;
2、用 real.exe 处理 d01,生成 wrfinput_d01, wrfbdy_d01(黄色部分);
3、用 wrf.exe 运行 d01(主模拟);
4、然后运行 ndown.exe,在已有 d01 模拟基础上,生成 d02 的 wrfinput_d02 和 wrfbdy_d02(蓝色部分);
5、最后运行 wrf.exe 模拟 d02。
特点:
- d01 和 d02 是 分开运行 的;
- d02 的边界来自 d01 的输出;
- 更适合单向嵌套的需求(如不需要反馈)。
🔁 One-way vs Two-way 嵌套对比
特性 | One-way (feedback=0) | Two-way (feedback=1) |
---|---|---|
嵌套域影响父域? | ❌ 否 | ✅ 是 |
边界光滑处理? | 无需 | 可用 smooth_option |
适用场景 | 较独立区域研究 | 局地对大尺度有反馈的研究 |
另:“单向嵌套”与“双向嵌套” 的差异比较
WRF论坛-Two-way and one-way nesting runs
根据此论坛内容,设置了两组WRF实验,期望D01(外层域)的模拟结果在以下两种设置下应完全相同:
- 实验一:双域模拟(D01+D02),设置 max_dom=2,feedback=0(即one-way nesting)
- 实验二:单域模拟(仅D01),设置 max_dom=1
两次实验都使用相同的时间步长、物理参数化方案等。但结果却发现:D01的模拟结果不一致。
对此的合理解释为:虽然理论上 feedback=0(即关闭反馈)时,父域D01的结果应与单独运行D01的结果一致,但实际上:
- 当设置 max_dom=2 时,WRF 仍然需要初始化和建立子域D02;
- 这个过程会引入一些数值噪声(noise),从而对D01的数值状态造成微小扰动;
- 即使关闭了 feedback,D01 的模拟过程还是被“打扰”了。
换句话说:
只要运行了嵌套(即使 feedback=0),D01 的结果就不会完全等同于不含嵌套的运行。
设置"纯净"的嵌套模拟
如果希望真正不受嵌套影响的 D01 结果,可以尝试使用 ndown程序 来运行嵌套模拟。
这种方式可以先单独运行 D01,再将其结果作为边界条件驱动 D02,避免 D02 在运行中影响 D01。
参考
1、PPT-WRF Nesting: Set up and Run