history/XIOS/getin 输出配置边界
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d\gcm.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\gcm.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d\conf_gcm.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\com_io_dyn_mod.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\inithist.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\writehist.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\initdynav.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\writedynav.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\inithist_p.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\writehist_p.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\initdynav_p.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\writedynav_p.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\phy_common\ioipsl_getin_p_mod.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\ioipsl_getincom.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\misc\wxios.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\phy_common\xios_writefield.F90
LMDZ.MARS\libf\phymars\conf_phys.F
LMDZ.MARS\libf\phymars\xios_output_mod.F90
LMDZ.MARS\libf\phymars\write_output_mod.F90
Mars 运行参与度:必经/条件经过。getin/getin_p 对 Mars 动力和物理配置是必经;动力 history/dynav 仅在 ok_dyn_ins/ok_dyn_ave/ok_dynzon 与 CPP_IOIPSL 条件满足时经过;XIOS 仅在 CPP_XIOS 和相关 Mars physics 输出路径启用时经过。
总边界
当前 wiki需要把四类 I/O 分清:
| 层 | 配置入口 | 输出实现 | 主要文件 | 责任边界 |
|---|---|---|---|---|
| 动力配置 | conf_gcm 直接 getin |
不输出,只写控制状态 | conf_gcm.F90, control_mod, logic_mod |
读取 iecri/periodav/ok_dyn_* 等动力输出门控。 |
| 动力 history/dynav | ok_dyn_ins/ok_dyn_ave/ok_dynzon |
IOIPSL histbeg/histdef/histwrite/histsync |
inithist/writehist/initdynav/writedynav |
写 COMMON 动力诊断文件,不负责 Mars diagfi.nc。 |
| 物理配置 | conf_phys 和 physics modules 调 getin_p |
不输出,只写 Mars physics 状态 | COMMON ioipsl_getin_p_mod, MARS conf_phys.F |
root 读取并广播物理参数,如 outputs_per_sol/output_diagfi/callstats。 |
| 物理/XIOS/diagfi 输出 | Mars physics 输出模块 | Mars writediagfi/stats/xios_output_mod,以及 COMMON XIOS/write_field helper |
MARS write_output_mod/xios_output_mod, COMMON wxios/xios_writefield/write_field |
Mars physics 诊断由 MARS 控制;COMMON 只提供并行安全 getin、XIOS helper 和旧写场桥。 |
因此不要把 dyn_hist.nc、diagfi.nc、stats.nc 和 XIOS XML 输出混成一条链。它们共享配置读取和并行环境,但文件职责不同。
配置读取链
动力侧
gcm.F90 在顶部按编译选项选择配置读取来源:
#ifdef CPP_IOIPSL
USE IOIPSL
#else
USE ioipsl_getincom
#endif
conf_gcm.F90 直接调用 getin。与输出相关的关键项包括:
| key | 默认 | 使用方 | 作用 |
|---|---|---|---|
iecri |
1 |
gcm, leapfrog |
instant history 的输出步长,按天转成 t_ops=((iecri/day_step)*daysec)。 |
periodav |
1. |
gcm, leapfrog |
平均 history 的写出周期,t_wrt=periodav*daysec。 |
output_grads_dyn |
.false. |
leapfrog |
额外 Grads 动力输出。 |
ok_dynzon |
.false. |
leapfrog, bilan_dyn |
纬向/守恒诊断输出。 |
ok_dyn_ins |
.false. |
gcm, writehist |
instant dyn_hist*.nc 初始化和写出门。 |
ok_dyn_ave |
.false. |
gcm, writedynav |
averaged dyn_hist*_ave.nc 初始化和写出门。 |
物理侧
COMMON 的 ioipsl_getin_p_mod.F90 是物理侧并行配置读取 wrapper:
#ifdef CPP_IOIPSL
USE ioipsl, ONLY: getin
#else
USE ioipsl_getincom, ONLY: getin
#endif
每个 typed getin_p procedure 都先 OMP barrier,然后只有 is_mpi_root .AND. is_omp_root 调 getin,最后 bcast 给其它 ranks/threads。Mars conf_phys.F 通过它读取:
| key | Mars 作用 |
|---|---|
outputs_per_sol |
Mars physics 输出频率;必须整除 steps_per_sol。 |
slow_diagfi |
1D/debug 场景下控制 diagfi.nc 打开/关闭策略。 |
iphysiq |
physics 调用频率,与动力侧共享含义。 |
ecritstart |
Mars physics restart 写出频率。 |
datadir, startphy_file |
外部数据目录和 startfi.nc 初始化。 |
callstats |
是否写 stats.nc。 |
output_diagfi |
是否写 Mars diagfi.nc。 |
diagsoil |
是否写 Mars diagsoil.nc。 |
Mars physics 模块还广泛用 getin_p 读取辐射、尘埃、水循环、云微物理等配置;这些属于 MARS physics 内容,不在 COMMON 当前 wiki里逐项展开。
动力 history/dynav 链
动力输出只在 CPP_IOIPSL 编译分支内初始化和写出。
初始化
gcm.F90 串行路径:
if (ok_dyn_ins) then
t_ops = ((1.0*iecri)/day_step) * daysec
t_wrt = daysec
CALL inithist(day_ref, annee_ref, time_step, t_ops, t_wrt)
endif
if (ok_dyn_ave) then
t_ops = iperiod * time_step
t_wrt = periodav * daysec
CALL initdynav(day_ref, annee_ref, time_step, t_ops, t_wrt)
endif
并行 gcm.F 只在 mpi_rank==0 上调用串行 inithist/initdynav 初始化;并行专用 inithist_p/initdynav_p 在当前路径中保留为支撑实现和其它调用模式。
com_io_dyn_mod.F90 持有文件名和 id:
| 类型 | 文件名 | id 设置方 | 写出方 |
|---|---|---|---|
| instant scalar | dyn_hist.nc |
inithist |
writehist |
| instant U grid | dyn_histu.nc |
inithist |
writehist |
| instant V grid | dyn_histv.nc |
inithist |
writehist |
| averaged scalar | dyn_hist_ave.nc |
initdynav |
writedynav |
| averaged U grid | dyn_histu_ave.nc |
initdynav |
writedynav |
| averaged V grid | dyn_histv_ave.nc |
initdynav |
writedynav |
时间步写出
leapfrog.F 里有三组门:
MOD(itau, iperiod)==0 or itau==itaufin:
ok_dynzon -> bilan_dyn(...)
ok_dyn_ave -> writedynav(...)
MOD(itau, iecri)==0:
ok_dyn_ins -> writehist(...)
writehist/writedynav 内部用 itau_w = itau_dyn + time 作为 histwrite 时间。串行版写全局数组;并行版写局部切片,tracer 写出比串行版更完整。
XIOS 和 COMMON helper 边界
COMMON gcm.F90 在 CPP_XIOS 下调用:
CALL wxios_init("LMDZ")
wxios_init 做的是 XIOS 初始化和 context 名保存;真正的 context/domain/axis/field 细节由后续 XIOS helper 或 Mars physics 输出模块决定。
COMMON wxios.F90 和 xios_writefield.F90 提供:
wxios_init,wxios_context_init,wxios_closedef,wxios_domain_param等 context/domain helper。xios_writefield2d/3d的临时 field/file 发送封装。write_field_phy把物理列 gather 到全局,再桥接到旧misc:WriteField。
Mars physics 标准输出主控在 MARS:
xios_output_mod.F90建立 Mars physics XIOS axes/domain/calendar,并提供histwrite*_xios和xios_is_active_field。write_output_mod.F90先看output_diagfi决定是否调用writediagfi,在CPP_XIOS下还可把字段送到send_xios_field。
所以 COMMON 当前 wiki只需要说明 COMMON helper 如何接入;Mars physics 的完整 field 列表、XML、diagfi.nc 字段含义属于 MARS wiki 或后续 Mars physics 输出页。
复现顺序
对 Mars 3D run,按以下顺序判断输出是否会出现:
- 编译期确认
CPP_IOIPSL:没有它,COMMON 动力hist*history 初始化和写出分支不会编译进入。 - 编译期确认
CPP_XIOS:没有它,COMMONwxios和 Mars physics XIOS 输出不会编译进入。 - 运行期在
run.def里检查iecri,periodav,ok_dyn_ins,ok_dyn_ave,ok_dynzon。 - 运行期在
callphys.def或共享 def 文件里检查outputs_per_sol,output_diagfi,callstats,diagsoil。 - 若动力 history 缺失,先看
ok_dyn_*和CPP_IOIPSL,再看inithist/initdynav是否被调用。 - 若 Mars
diagfi.nc缺失,先看output_diagfi和 MARSwrite_output_mod/writediagfi,不要先查 COMMONwritehist。 - 若 XIOS 文件缺失,先看
CPP_XIOS、XIOS XML/context、xios_output_mod初始化和 field 是否 active。 - 若并行配置读取异常,查
getin_p的 root-read/bcast 前提:物理 MPI/OMP 数据和 transfer/bcast 是否初始化。
常见误判
iecri控制的是动力 instant history,不是 Mars physicsdiagfi.nc的唯一频率。Mars physics 使用outputs_per_sol。ok_dyn_ins=.true.只打开 COMMON 动力输出,不会自动打开 Marsdiagfi.nc。output_diagfi=.false.不影响 COMMONdyn_hist*.nc。wxios_init("LMDZ")不是字段注册;字段、axis、domain 仍由wxios_*helper 或 Marsxios_output_mod定义。getin找不到 key 时保持调用方默认值;因此输出没打开可能是默认值,而不是读取失败。
待确认
- Mars physics
diagfi.nc/stats.nc/xios的完整字段清单不属于 COMMON 源码,需要由 MARS physics 输出页补齐。 - 当前 split workspace 没有实际运行
CPP_IOIPSL/CPP_XIOS构建;本页根据源码分支和调用关系说明边界。