Mars dyn1d COMMON 直接转发约定
输入范围
LMDZ.MARS\libf\phymars\dyn1d
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dynphy_lonlat
Mars 运行参与度:接口兼容。phymars/dyn1d 是 Mars 1D physics driver 的编译目录,不走 3D gcm -> leapfrog 主链;但它通过一批“一行路径文件”把 COMMON 动力状态、垂直坐标、tracer、并行占位和 dyn-phys 接口暴露给 testphys1d。这些文件本身不是独立实现,等价于在 Mars dyn1d 编译上下文中纳入对应 COMMON 源文件。
直接转发清单
每个转发文件内容只有一行相对路径,形式为 ../../../../LMDZ.COMMON/...。本页确认到 14 个目标文件均存在。
| Mars dyn1d 文件 | COMMON 目标 | 角色 | 1D 链使用状态 |
|---|---|---|---|
abort_gcm.F |
LMDZ.COMMON\libf\dyn3d\abort_gcm.F |
动力侧 abort 例程 | init_testphys1d_mod.F90 在 orphan tracer 检查失败时调用。 |
logic_mod.F90 |
LMDZ.COMMON\libf\dyn3d\logic_mod.F90 |
动力逻辑开关模块 | init_testphys1d_mod.F90 使用 hybrid 选择垂直坐标。 |
comconst_mod.F90 |
LMDZ.COMMON\libf\dyn3d_common\comconst_mod.F90 |
COMMON 动力常量状态 | 1D 目录暴露该模块;当前 testphys1d 主链主要使用 Mars physics 常量模块。 |
comvert_mod.F90 |
LMDZ.COMMON\libf\dyn3d_common\comvert_mod.F90 |
ap/bp/aps/bps/pa/preff 垂直坐标状态 |
testphys1d 和 init_testphys1d_mod 直接使用。 |
control_mod.F90 |
LMDZ.COMMON\libf\dyn3d_common\control_mod.F90 |
3D GCM 控制状态 | 1D 目录暴露接口;当前 1D 初始化不走 control_mod 主配置链。 |
disvert_noterre.F |
LMDZ.COMMON\libf\dyn3d_common\disvert_noterre.F |
非地球垂直离散构造 | init_testphys1d_mod.F90 调用后再初始化 vertical_layers_mod。 |
ener_mod.F90 |
LMDZ.COMMON\libf\dyn3d_common\ener_mod.F90 |
动力能量守恒状态 | 1D 目录暴露接口;当前 1D 主链不写这些守恒量。 |
infotrac.F90 |
LMDZ.COMMON\libf\dyn3d_common\infotrac.F90 |
tracer 名称、数量、父子关系状态 | init_testphys1d_mod 写 nqtot/tname/nqperes/nqfils;read_profile_mod 读 tname。 |
paramet.h |
LMDZ.COMMON\libf\dyn3d_common\paramet.h |
动力维度 include | 支撑 COMMON 例程编译时的维度符号。 |
comgeom.h |
LMDZ.COMMON\libf\dyn3d_common\comgeom.h |
动力几何 common/include | 支撑 COMMON 例程编译时的几何符号。 |
serre_mod.F90 |
LMDZ.COMMON\libf\dyn3d_common\serre_mod.F90 |
zoom/网格相关状态 | 1D 目录暴露接口;当前 1D 主链未直接使用。 |
mod_const_mpi.F90 |
LMDZ.COMMON\libf\dyn3dpar\mod_const_mpi.F90 |
MPI 通信器和常量 | testphys1d 在 CPP_XIOS 下调用 init_const_mpi;init_testphys1d_mod 使用 COMM_LMDZ。 |
parallel_lmdz.F90 |
LMDZ.COMMON\libf\dyn3dpar\parallel_lmdz.F90 |
并行初始化抽象 | testphys1d 在 CPP_XIOS 下调用 init_parallel。 |
mod_interface_dyn_phys.F90 |
LMDZ.COMMON\libf\dynphy_lonlat\mod_interface_dyn_phys.F90 |
动力-物理接口初始化状态 | init_testphys1d_mod.F90 调用 init_interface_dyn_phys。 |
本地 1D 文件边界
phymars/dyn1d 同时包含非转发的本地 Mars 1D 文件:
| 本地文件 | 角色 | COMMON 转发关系 |
|---|---|---|
testphys1d.F90 |
1D Mars physics driver,编译示例为 makegcm -p mars -d 25 testphys1d。 |
使用转发的 comvert_mod, mod_const_mpi, parallel_lmdz。 |
init_testphys1d_mod.F90 |
1D 初始化主模块,读取 traceur.def、run.def/callphys.def 参数,初始化垂直层、网格、surface 和 physics state。 |
使用转发的 infotrac, comvert_mod, logic_mod, mod_const_mpi, mod_interface_dyn_phys, disvert_noterre, abort_gcm。 |
read_profile_mod.F90 |
读取 profile_<tracer> 输入剖面,缺失时按 tracer 名称给默认值。 |
使用转发的 infotrac%tname。 |
profile_temp_mod.F90 |
构造或读取 1D 温度剖面。 | 不使用直接转发模块;使用 Mars physics 常量和 getin。 |
writerestart1D_mod.F90 |
写 restart1D.txt,包含 ps/pa/preff、tracer、风和温度剖面。 |
接收由 comvert_mod 和 1D 初始化得到的 pa/preff,自身不 USE COMMON 转发模块。 |
1D 初始化如何使用转发模块
testphys1d.F90 第 31-37 行说明该程序只运行 Martian GCM 的物理部分,需要 testphys1d.def、callphys.def、run.def 和垂直层文件。它不是普通 Mars 3D GCM,也不调用 COMMON 的 gcm/leapfrog。
关键顺序:
testphys1d.F90第 98-100 行在CPP_XIOS下调用init_const_mpi和init_parallel,这两个符号来自转发的mod_const_mpi.F90和parallel_lmdz.F90。testphys1d.F90第 122-130 行通过getin('startfiles_1D',...)决定是否读 1D restart/startfi。init_testphys1d_mod.F90第 177-220 行读取traceur.def,设置nqtot=nq并分配tname;第 222-253 行构造父子 tracer 关系,orphan tracer 时调用转发的abort_gcm。init_testphys1d_mod.F90第 255-259 行初始化 physics distribution,XIOS 编译时把转发的COMM_LMDZ传入。- 第 296-310 行读取
day_step/ndt并计算dttestphys=daysec/steps_per_sol。这里使用的是 Mars physicstime_phylmdz_mod,不是 COMMONcontrol_mod。 - 第 314-339 行设置
psurf/pa/preff/hybrid,调用转发的disvert_noterre填充ap/bp/aps/bps,再调用vertical_layers_mod:init_vertical_layers。 - 第 423-433 行调用
init_interface_dyn_phys、init_regular_lonlat、init_geometry、phys_state_var_init、conf_phys和initracer,让 1D 列满足 physics 接口期望。 - 第 435-440 行如果
conf_phys设置的iphysiq不是 1,则强制设为 1,因为 1D driver 每一步都调用 physics。
伪流程:
testphys1d
-> optional init_const_mpi/init_parallel
-> getin startfiles_1D
-> init_testphys1d
-> read traceur.def into infotrac state
-> init_physics_distribution(COMM_LMDZ or 1)
-> getin day0/time/day_step/ndt/psurf/hybrid
-> disvert_noterre -> comvert_mod ap/bp/aps/bps
-> init_vertical_layers
-> init_interface_dyn_phys + geometry + phys_state_var_init
-> conf_phys + initracer
-> timestep loop calls physiq every step
-> optional writerestart1D
与 3D Mars GCM 的差异
| 主题 | 3D Mars GCM | dyn1d/testphys1d |
|---|---|---|
| 入口 | gcm 或 nogcm,进入 COMMON/Mars leapfrog 链。 |
testphys1d,只驱动一个物理列。 |
| 控制状态 | conf_gcm/defrun_new 写 control_mod/logic_mod/temps_mod/comconst_mod。 |
多数控制量由 getin 和 Mars physics state 写入;control_mod 只是转发暴露。 |
| 行星常量 | 从 Mars 配置、start/control 表和 iniconst 链进入动力/物理。 |
init_testphys1d_mod 第 131-170 行手写 Mars 常量。 |
| 垂直坐标 | 3D 初始化和 restart/control 表共同决定。 | getin("hybrid") 后调用转发的 disvert_noterre,再用 init_vertical_layers 同步 physics 层。 |
| tracer 状态 | COMMON infotrac_init 读取并扩展 tracer。 |
1D 自己读取 traceur.def,手动写 nqtot/tname/nqperes/nqfils。 |
| 并行 | 3D 并行入口由 dyn3dpar decomposition/halo 驱动。 |
只在 XIOS/physics distribution 接口上需要 COMM_LMDZ 和初始化占位。 |
| restart | dynetat0/dynredem 和 Mars phyetat0/phyredem。 |
文本 start1D.txt/restart1D.txt 加可选 startfi.nc。 |
复现注意事项
- 这些一行文件必须被看作 COMMON 源码的别名,不要把它们写成 Mars 本地实现。
comconst_mod/control_mod/ener_mod/serre_mod/comgeom.h/paramet.h在 dyn1d 目录中可见,不等于当前 1D 主流程都会读写其全部状态。- 1D
nqtot/tname初始化绕过infotrac_init,但仍使用 COMMONinfotrac模块变量。因此 tracer 文件格式错误会影响read_profile_mod和 physics tracer 初始化。 disvert_noterre的输出进入comvert_mod,随后vertical_layers_mod同步到 physics;如果hybrid/psurf/pa/preff不一致,plev/play会直接影响physiq输入。CPP_XIOS打开时,mod_const_mpi/parallel_lmdz转发路径变成运行前置;不开 XIOS 时,physics distribution 用串行 communicator 值1。