WRF运行的单向/双向嵌套机制
- 准备工作:
-
- WRF运行的基本流程
- namelist.input的详细设置
-
- [&time_control 设置](#&time_control 设置)
- [&domain 嵌套结构](#&domain 嵌套结构)
- [&bdy_control 配置部分](#&bdy_control 配置部分)
- [namelist 其他注意事项](#namelist 其他注意事项)
- 嵌套说明
-
- [双向嵌套(two-way nesting)](#双向嵌套(two-way nesting))
- [单向嵌套(one-way nesting)](#单向嵌套(one-way nesting))
- [🔁 One-way vs Two-way 嵌套对比](#🔁 One-way vs Two-way 嵌套对比)
- [另:"单向嵌套"与"双向嵌套" 的差异比较](#另:“单向嵌套”与“双向嵌套” 的差异比较)
- 参考
准备工作:
1、编译时选择支持嵌套的选项
2、确保生成了 real.exe, wrf.exe, ndown.exe(如需单独运行嵌套区域)
可查看wrf/run文件夹下的.exe文件内容:
bash
ls -lh /home/directory/WRF-4.6/WRF-4.6.1/run/*.exe
对于ARW版本:输出结果应包含:
bash
ndown.exe
real.exe
tc.exe
wrf.exe
3、对于 real-data 模拟,需生成 met_em.d0 文件供嵌套区域使用*
对于ARW版本:
bash
met_em.d01.<date>, met_em.d0*.<date>
WRF运行的基本流程
WPS预处理和WRF运行的详细过程可参见另一博客-【WRF模拟】全过程总结:WPS预处理及WRF运行。
1、进入运行目录
bash
cd /home/directory/WRF-4.6/WRF-4.6.1/run
2、链接或复制 WPS 输出文件
3、编辑 namelist.input
namelist.input 是关键:
- 嵌套运行的控制几乎全部依赖 namelist.input
- 关键参数:max_dom ≥ 2
- 注意嵌套相关多列参数设置(如时间、格点数等)
4、运行 real.exe 初始化
bash
mpirun -np 3 ./real.exe
5、运行 wrf.exe 执行模拟
bash
# 设置 堆栈大小 为 无限制,以避免分段错误
ulimit -s unlimited
# <num_processes> 替换为希望使用的计算进程数。
mpirun -np <num_processes> ./wrf.exe
# 单进程运行
mpirun -np 1 ./wrf.exe
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 其他部分的配置如下:
bash
&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 中关于嵌套域输入控制的变量
bash
&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 的设置如下:
bash
i_parent_start = 31,
j_parent_start = 17,
- i_parent_start=31:嵌套域在 父域的第31列网格点 开始;
- j_parent_start=17:嵌套域在 父域的第17行网格点 开始
&domain 的内容如下(参考):
bash
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 中设置的嵌套起点一致,否则会报错或嵌套错位。
bash
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)之间的数据回馈与平滑处理。
bash
&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 配置部分主要控制边界条件的设置方式和边界区域的平滑处理,对于模型稳定性和嵌套域之间的一致性非常重要。
bash
&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 参数化:
bash
cu_physics = 1, 0, 0, ! d01 开启积云方案,d02/d03 关闭
2、所有域应使用相同的物理过程调用频率,如 radt, cudt 等。
参数说明:
参数 | 含义 | 单位 |
---|---|---|
radt | 辐射方案的调用间隔 | 秒 |
cudt | 积云方案的调用间隔 | 秒 |
建议所有域统一设置这些频率,不要因分辨率不同而设置不同值。
bash
radt = 30, 30, 30
cudt = 5, 0, 0
嵌套说明
嵌套方式总结:
嵌套类型 | 特征 |
---|---|
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)
单向嵌套(one-way nesting)
🔁 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。