观潮 · 模式预报与气象 AI 观察
MPAS 重启算例结果对不上:只改 config_do_DAcycling 一个开关,输出就不一样
同一个 restart 文件,同一套配置,只把 config_do_DAcycling 从 false 改成 true,两次 restart 跑的模拟结果就不一样。提问者确认过没有 da_state 流、也没有做同化,他的判断是"结果应该完全一致"。
官方给出的解释落在一段具体的源码逻辑上,而不是"精度差异"。
---
提问者的排查过程
提问者(名字 JiaWang)一开始就把自己的假设说清楚了,这是好习惯:
- 两组实验唯一的差别是
config_do_DAcycling=true与=false - 其余配置完全一致
- restart 文件是同一个
- 模拟输出里没有
da_state流 - 没有做任何 DA(同化)
所以他的问题很具体:既然没有同化,这个开关在 restart 下应该不起作用,为什么结果还会不同?
他随后按官方要求附上了 namelist.atmosphere(2.7 KB),并说明 config_pbl_scheme = 'bl_ysu'。
值得注意的是,官方第一句回复问的是 Are you running with MYNN PBL scheme?——提问者答不是,是 YSU。这个问题本身没有后续展开,看起来是排障初期的例行确认,但对最终定位没有影响。 你自己排查时不必在这上面花时间。
---
官方定位:restart 下这个开关会强制走一段冷启动才走的代码
官方回复的核心是:restart 运行如果把 config_do_DAcycling 设成 true,会强制调用 atm_init_coupled_diagnostics 例程——而这个例程平时只在冷启动开头调一次。官方同时给出了调用逻辑的源码位置:mpas_atm_core.F 第 522–530 行的 atm_mpas_init_block(MPAS 8.4.2 标签下)。
拆开就是两件事:
- 这个诊断例程平时只在冷启动开头调一次。 设为
true之后,restart 运行会强制再调一次。 - 这次重算会改写
theta_m、rho_zz等场量。 官方用了generally这个限定,说的是这些场量一般会与 restart 文件里存的值产生位级别差异。
也就是说,结果不一致的来源不是数值方法本身,而是这几个诊断场被重新计算了一遍,覆盖了 restart 文件里带过来的值。
两位提问者与回复者之间还确认了一件事:这个开关的正当用途,恰恰是"用 JEDI DA 输出更新了 restart 文件里某些变量之后,必须设成 true"。官方明确回答 Yes that is correct。
这条确认很重要,它把整件事的因果关系闭合了:官方给出的"会重算诊断场"的机制,正是这个设计本身要的效果,而不是一个副作用或缺陷。
---
这条排查的可迁移部分
这个案例的价值不在于 MPAS 具体怎么做,而在于排查动作的顺序。官方把话说得非常具体:先看这个例程在什么条件下被调用,再去源码里核对调用逻辑(并且直接给出 mpas_atm_core.F 的行号区间 522–530)。这比"试几个开关看结果变不变"要可靠得多。
同样值得记的是提问者的对照设计:两次实验只有一个变量、restart 文件相同、没有 da_state 流。他把这些条件主动列出来,才让官方能直接定位到"restart 分支的调用条件"上。没有这三条,官方只能反过来问他。
---
作者承认的限制
帖子没有给出位级差异的幅度。 官方只说 generally lead to bit-level differences in these fields,用了 generally 这个限定,没有说所有情况下都会出现,也没有给具体是哪几个字段、差异多大。帖子里没有验证结果对比——提问者后来也没有回帖说两组结果到底差多少、哪些场量差异明显。
没有讨论这个差异是否影响业务运行。 帖子的语境是"结果不一致让我困惑",官方回答的是"为什么会不一致",不是"这个差异要不要紧"。如果你是拿 restart 跑业务、或者做敏感性试验,这个差异对你的结论有没有影响,帖子里没有任何依据。
定位基于 MPAS 8.4.2,其他版本未验证。 官方给出的链接是 v8.4.2 标签下的 mpas_atm_core.F 第 522–530 行。atm_mpas_init_block 里的调用条件在其他版本里可能已经改过。8.4.2 之前或之后的版本遇到同样现象,不要直接照搬这个结论。
da_state 流不存在这个前提是提问者自述的。 帖子里没有官方检查确认输出里确实没有同化相关输出。它作为排查前提是合理的,但不是被独立核实过的事实。
---
一句话判断
MPAS restart 跑两次结果不一致、且只差 config_do_DAcycling 一个开关时,去 atm_mpas_init_block 里看 atm_init_coupled_diagnostics 的调用条件。 这个开关在 restart 下会强制重算 theta_m、rho_zz 等诊断场,与 restart 文件带来的值产生位级差异——这是设计使然(用 JEDI DA 更新过 restart 变量后确实需要它),不是精度问题。但"差异有多大、要不要紧",官方和提问者都没有回答,得自己拿两组输出比。