观潮 · 模式预报与气象 AI 观察
ndown.exe 跑不出嵌套域:报错不在数据,在 namelist 里有两项只能写一个值
用真实资料跑 WRF 的 LES,想先用 ndown.exe 给内层降分辨率,程序在读 namelist.input 阶段就死了。日志里的报错指向两行配置,但真正的原因是:这两项在注册表里只允许单一取值,他按嵌套域的习惯写了三个。
---
报错长什么样
```
module_io_quilt_old.F 2931 T
------ ERROR while reading namelist dynamics ------
Maybe here?: diff_6th_opt = 0, 0,
Maybe here?: damp_opt = 3, 3,
------ ERROR while reading namelist bdy_control ------
Maybe here?: spec_bdy_width = 5,
Maybe here?: spec_bdy = .T., .T.,
-------------- FATAL CALLED ---------------
FATAL CALLED FROM FILE: <stdin> LINE: 11164
ERRORS while reading one or more namelists from namelist.input.
-------------------------------------------
application called MPI_Abort(MPI_COMM_WORLD, 1) - process 0
```
Maybe here? 这几行是 WRF 读 namelist 时的自查机制:它把你填的值原样打出来,问"是不是这里出的问题"。所以这几行不是根因,是嫌疑犯名单——真正的失败发生在最后那句 FATAL CALLED FROM FILE: <stdin>。
提问者自己也意识到了一点,贴出来的配置里每项都是三个值:外层、中层、内层各一个。他习惯性地按嵌套域写了三份,而问题就出在这里。
---
官方给的修法
回复只有两句实质内容:
```
damp_opt = 3
spec_bdy = .T.
```
这两项从 3, 3, 和 .T., .T., 改成单值即可。 其余配置一个字都不用动。
---
为什么不能写三个值
回复里给的判据是:这两个 namelist 参数只允许单一取值。
给出的自查方法是:去 WRF/Registry/Registry.EM_COMMON 文件里搜这些参数名,看它的注册表条目。条目里如果写了 max_dom,就说明它是逐层变量、每个域可以不同;条目里只有 1,就只能填一个值。
这条查法值得记住,因为它适用于所有 namelist 参数,不止这两个:
Registry 条目里写的值 · 含义 · namelist 里该写几个
出现 `max_dom` · 逐层变量,每个域可不同 · 写 `max_dom` 个值
只写 `1` · 全局标量,所有域共用一个 · 只能写 1 个值
damp_opt 是全域统一的数值阻尼选项,spec_bdy 是全域统一的谱边界开关,两者都属于后者。写三个值不是"多写了一个会被忽略",而是读 namelist 的 Fortran 解析器在赋值时维度不匹配,直接跳到 FATAL CALLED。
反过来,diff_6th_opt、spec_bdy_width 虽然也出现在 Maybe here? 名单里,但官方只点了两个——说明那两项注册表里是有 max_dom 的,写三个合法。
---
一个容易踩的连带坑
提问者是在跑 ndown.exe 时撞上这个错。ndown.exe 负责把粗分辨率结果插值成内层初始条件,它读的是独立的 namelist.input,不是外层那个主 namelist。
官方建议的通用查法里没有提这一点,但报错日志里那句 module_io_quilt_old.F 已经说明问题了:读 namelist 的模块和主模式不是同一套。改外层 namelist 不会影响 ndown.exe,必须去改它工作目录下的那一份。
如果你改完 damp_opt 和 spec_bdy 之后在别处又冒出同类 Maybe here? 报错,用同样的办法去 Registry.EM_COMMON 查那一项就行了,不用再来回试。
---
作者承认的限制
帖子给出的两个值没有说明适用版本。 回复里提的是 module_io_quilt_old.F,文件名里的 _old 暗示这是较老的 I/O 分支。官方没写这是哪个 WRF 版本上的行为,也没说新版本里这些参数的注册表定义是否改过。跨版本复用这个改法前,先在自己那份源码的 Registry.EM_COMMON 里查一次。
帖子没有说明改完之后的结果。 提问者发的是 9 月 19 日,官方 10 月 3 日回复,帖子里没有后续楼层确认跑通了。也就是说:这两个参数确实是失败点,但"改成单值之后 LES 插值成功"这一步在帖子里没有被验证。后面还可能撞到别的错误。
这是提问者的第一次 LES 真实资料案例。 他自述 I am newbie to LES with WRF real data case,并且帖子里附的 ndownamelist.pdf(38.4 KB)无人回复点评。也就是说,官方给的回复解决的是这一个报错,不是对 LES + 真实资料这套流程的整体建议。
---
一句话判断
ndown.exe 报 Maybe here? 加 FATAL CALLED FROM FILE: <stdin>,第一件事是看日志里那几个参数在 Registry.EM_COMMON 里有没有 max_dom。 没写 max_dom 的是全域标量,namelist 里只能给一个值,按嵌套域习惯写三个必然崩在这。改的时候注意 ndown.exe 读的是它自己目录下那份 namelist.input。