leapfrog 输出、诊断和 restart
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d\leapfrog.F
LMDZ.MARS\libf\dynphy_lonlat\phymars\leapfrog_nogcm.F
Mars 运行参与度:必经。COMMON 完整 GCM 使用 leapfrog.F 写 history/dynav 诊断和 restart.nc;MARS phymars/leapfrog_nogcm.F 只作为 Mars 侧边界对照,最终步写 restart,不支持 ecritstart 中途 restart。
平均/纬向诊断
在非 purmats 路径,每当 MOD(itau,iperiod)==0 或 itau==itaufin:
- 设
iav=1表示最终步,否则为 0。 - 重算
phi,完整 GCM 使用 CP(T) 适配后的tsurpk,nogcm 平均输出处直接用teta。 - 若
ok_dynzon且启用 IOIPSL,调用bilan_dyn(dtvr*iperiod,dtvr*day_step*periodav,...)。 - 若
ok_dyn_ave且启用 IOIPSL,调用writedynav(itau,vcov,ucov,teta,pk,phi,q,masse,ps,phis)。
purmats backward 分支中也有同样的平均/纬向输出逻辑。
instant history 和 Grads
当 MOD(itau,iecri)==0:
- 只有常规 leapfrog 步或 backward Matsuno 步会写 instant history,即
leapf .OR. (.NOT.leapf .AND. .NOT.forward)。 - 写出前重算
phi,并从ucov/vcov得到unat/vnat。 - 若
ok_dyn_ins且启用 IOIPSL,调用writehist(itau,vcov,ucov,teta,phi,q,masse,ps,phis)。 - 若
output_grads_dyn,includewrite_grads_dyn.h。
restart 判断
完整 leapfrog.F 支持最终步和中途 restart:
| 条件 | 行为 |
|---|---|
itau==itaufin |
lrestart=.true. |
ecritstart>0 且 MOD(itau,ecritstart)==0 |
lrestart=.true. |
ecritstart==0 |
避免 modulo 除零,不触发中途 restart |
写 restart 时:
- Mars 且
ecritstart>0:时间为REAL(itau)/REAL(day_step)+time_0-floor(time_0)。 - Mars 且只在最终写:时间为
REAL(itau)/REAL(day_step)-(day_end-day_ini)+time_0-floor(time_0)。 - 非 Mars:时间为
JH_cur。
MARS nogcm 变体只在 itau==itaufin 时写:
- Mars:
REAL(itau)/REAL(day_step)。 - 非 Mars:
JH_cur。
输出前状态
输出前通常会重新计算 phi,但不总是刷新 p/masse/pk。因此调用顺序依赖前面物理/耗散段已经保证 ps/masse/pk 一致。writehist 和 writedynav 接收 q,其第三维为 nqtot。
复现要点
iecri控制 instant history,iperiod控制平均/纬向诊断,两者不是同一个门。- 完整 GCM 的 Mars restart 时间包含
time_0和day_end-day_ini修正;nogcm 没有这段修正。 writehist在 forward Matsuno 步不会写,避免写半步状态。
待确认
CLOSE(99)与dynredem1内部文件句柄的关系需由 restart 文件页确认。iav在当前片段中只被设置,实际使用需由bilan_dyn或 history 任务进一步确认。