【WRF理论第十七期】单向/双向嵌套机制(含namelist.input详细介绍)

发布于:2025-04-11 ⋅ 阅读:(32) ⋅ 点赞:(0)

准备工作:

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 表示这是一个 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