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_dynzonCPP_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.ncdiagfi.ncstats.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_rootgetin,最后 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.F90CPP_XIOS 下调用:

CALL wxios_init("LMDZ")

wxios_init 做的是 XIOS 初始化和 context 名保存;真正的 context/domain/axis/field 细节由后续 XIOS helper 或 Mars physics 输出模块决定。

COMMON wxios.F90xios_writefield.F90 提供:

Mars physics 标准输出主控在 MARS:

所以 COMMON 当前 wiki只需要说明 COMMON helper 如何接入;Mars physics 的完整 field 列表、XML、diagfi.nc 字段含义属于 MARS wiki 或后续 Mars physics 输出页。

复现顺序

对 Mars 3D run,按以下顺序判断输出是否会出现:

  1. 编译期确认 CPP_IOIPSL:没有它,COMMON 动力 hist* history 初始化和写出分支不会编译进入。
  2. 编译期确认 CPP_XIOS:没有它,COMMON wxios 和 Mars physics XIOS 输出不会编译进入。
  3. 运行期在 run.def 里检查 iecri, periodav, ok_dyn_ins, ok_dyn_ave, ok_dynzon
  4. 运行期在 callphys.def 或共享 def 文件里检查 outputs_per_sol, output_diagfi, callstats, diagsoil
  5. 若动力 history 缺失,先看 ok_dyn_*CPP_IOIPSL,再看 inithist/initdynav 是否被调用。
  6. 若 Mars diagfi.nc 缺失,先看 output_diagfi 和 MARS write_output_mod/writediagfi,不要先查 COMMON writehist
  7. 若 XIOS 文件缺失,先看 CPP_XIOS、XIOS XML/context、xios_output_mod 初始化和 field 是否 active。
  8. 若并行配置读取异常,查 getin_p 的 root-read/bcast 前提:物理 MPI/OMP 数据和 transfer/bcast 是否初始化。

常见误判

待确认

相关页面