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

WRF运行的单向/双向嵌套机制

  • 准备工作:
  • 嵌套说明
    • [双向嵌套(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。

参考

1、PPT-WRF Nesting: Set up and Run

相关推荐
CHN悠远2 天前
飞腾D3000安装debian13后使用WPS的方法
wps
❀͜͡傀儡师3 天前
docker 安装WPS
docker·容器·wps
罗政4 天前
WPS Excel快速插入一批图片
excel·wps
罗政5 天前
WPS Excel快速进行跨表数据合并
excel·wps
dyxal6 天前
linux系统上 WPS Office新增字体
linux·运维·wps
罗政6 天前
WPS Excel快速进行同表内的单元格差异对比(高亮)
excel·wps
罗政7 天前
WPS 如何进行单元格数据脱敏(实用方法与坑位避让)
wps
罗政7 天前
WPS Excel如何快速交换列(调整列顺序),删除多个不连续的列
excel·wps
枯基Evan8 天前
PPTX 中加入输入框和按钮,文本框不为空点击按钮跳转
wps·jsa
黄色茶杯9 天前
解决WPS的word文件嵌入EXCEL无法双击打开
word·excel·wps