【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

相关推荐
搏博14 小时前
在WPS中通过JavaScript宏(JSA)调用DeepSeek官网API优化文档教程
javascript·人工智能·windows·深度学习·机器学习·wps
跑得动1 天前
头歌 | WPS 文档 设置分栏
wps
跑得动1 天前
头歌 | WPS 文档 设置样式
wps
yyywxk1 天前
Word / WPS 页面顶部标题 段前间距 失效 / 不起作用 / 不显示,标题紧贴页眉 问题及解决
word·wps
小李砸牛1 天前
怎么样在Windows系统上安装 的 WPS JS 插件
功能测试·wps
m0_694079471 天前
wps文档调整行距不起作用
wps
跑得动1 天前
头歌 | WPS文档基本操作
运维·服务器·wps
jimin_callon4 天前
VBA第三十九期 VBA自动把工作表转换成PPT
python·excel·vba·wps·deepseek
风舞红枫6 天前
WPS宏开发手册——常见问题
wps