Mars 3D GCM 主入口链
输入范围
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d\gcm.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d\conf_gcm.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\iniconst.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\inigeom.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\inidissip.F90
LMDZ.MARS\libf\dynphy_lonlat\phymars\iniphysiq_mod.F90
LMDZ.MARS\doc\run.tex
Mars 运行参与度:必经/条件经过。LMDZ.MARS 文档给出的 3D GCM 编译示例是 makelmdz_fcm -arch ... -d 64x48x49 -p mars gcm,生成 LMDZ.COMMON/bin/gcm_XXX_phymars_seq.e 或 gcm_XXX_phymars_para.e。本页覆盖 gcm 可执行文件的 COMMON 串行入口链;并行入口和 Mars nogcm 变体只作为边界说明。
入口定位
gcm.F90 定义 PROGRAM gcm,负责从运行目录的配置和初始态进入完整 3D 动力时间推进。Mars 运行需要的 physics 由构建期 -p mars 选择 phymars,并在源码中通过 CPP_PHYS 下的 iniphysiq_mod:iniphysiq 接入。
构建和运行的最小外部事实:
| 证据 | 含义 |
|---|---|
LMDZ.MARS\doc\run.tex 示例 makelmdz_fcm -arch linux-ifort -d 64x48x49 -p mars gcm |
Mars 3D GCM 目标名是 gcm,物理包是 mars。 |
输出命名 gcm_XXX_phymars_YY.e |
XXX 来自 -d 分辨率,YY 是 seq 或 para。 |
gcm.F90 中 USE iniphysiq_mod 只在 CPP_PHYS 下启用 |
Mars 物理初始化由构建出的 phymars dyn-phys 接口提供。 |
MARS 树中 libf\dynphy_lonlat\phymars\nogcm.F90 调用 leapfrog_nogcm |
nogcm 是 Mars 专属变体链,不是本页的 gcm 主链。 |
主启动顺序
| 阶段 | 源码位置 | 关键行为 | Mars 复现意义 |
|---|---|---|---|
1. 检查 run.def |
gcm.F90 157-163 |
INQUIRE(file="run.def"),缺失则 abort_gcm。 |
Mars 3D run 必须在运行目录放置 run.def;物理配置通常由 run.def include callphys.def。 |
| 2. 读取运行控制 | gcm.F90 163;conf_gcm.F90 |
conf_gcm(99,.TRUE.) 通过 getin 写 control_mod, logic_mod, temps_mod, comconst_mod。 |
planet_type, nday, day_step, iperiod, iphysiq, read_start, ecritstart, ok_dyn_* 等从这里进入 COMMON 状态层。 |
| 3. 基本一致性检查 | gcm.F90 164-170, 289-306 |
检查 iphysiq 是 iperiod 倍数、day_step 是 iperiod/iphysiq 倍数;串行动力拒绝 use_filtre_fft。 |
这些是 Mars run 前置配置错误,不能靠后续 physics 修正。 |
| 4. 可选 XIOS/IOIPSL 设置 | gcm.F90 176-224 |
CPP_XIOS 下 wxios_init("LMDZ");CPP_IOIPSL 下设置日历。 |
Mars 常用 planet_type!="earth" 时 Julian day ref 被置 0;不能把 Earth 日期输出解释为 Mars sol 日历。 |
5. tracer 初始化和 q 分配 |
gcm.F90 235-242 |
infotrac_init 读取 tracer 配置,按 nqtot 分配 q(ip1jmp1,llm,nqtot)。 |
Mars tracer 数量由 traceur.def/infotrac 链决定,必须先于读 start.nc。 |
| 6. 读取或构造动力初态 | gcm.F90 248-281 |
read_start 为真时读 dynetat0("start.nc");否则 iniacademic 构造理想化初态。 |
标准 Mars 3D run 走 start.nc;理想化分支不等价于生产初态。 |
| 7. 日期和时间步规范化 | gcm.F90 301-339 |
dtvr=daysec/day_step;按 raz_date/starttime 处理 restart 时间差异。 |
Mars restart 复现要关注 timestart/ecritstart/raz_date,否则可能从错误 sol 或时间记录启动。 |
| 8. 常量、几何、滤波 | gcm.F90 400-418 |
iflag_phys==1 时调用 iniconst, inigeom, inifilr。 |
普通 Mars 物理 run 通常需要这些动力常量和几何在 iniphysiq 前就绪。 |
| 9. 耗散初始化 | gcm.F90 424-425 |
inidissip(...) 读取/校验耗散阶数和时间尺度。 |
Mars conf_gcm 中 idissip/dissip_period、vert_prof_dissip 会在这里落地。 |
| 10. 结束日和物理初始化 | gcm.F90 431-475 |
由 nday/less1day/ndynstep 算 day_end;iniphysiq 接收网格、常量、dtphys/nsplit_phys。 |
Mars physics 第一次获得动力网格几何、面积、常量和物理步长。 |
| 11. 初始 restart/history | gcm.F90 485-516 |
Mars 下 dynredem0("restart.nc", day_ini/day_end, phis);按 ok_dyn_ins/ok_dyn_ave 初始化 history/dynav。 |
ecritstart>0 时 Mars 初始 restart 用 day_ini,否则用 day_end;history 依赖 IOIPSL 宏和输出开关。 |
| 12. 进入时间推进 | gcm.F90 538 |
leapfrog(ucov,vcov,teta,ps,masse,phis,q,time_0)。 |
后续主循环由 leapfrog 细节页描述;本页边界停在入口实参和状态准备。 |
配置键到入口状态
| 配置/文件 | 读取点 | 写入状态 | 入口后续使用位置 |
|---|---|---|---|
run.def: planet_type |
conf_gcm |
control_mod%planet_type |
Mars restart day 选择、dynetat0/dynredem planeto 分支、物理一致性检查。 |
run.def: nday, less1day, fractday, ndynstep |
conf_gcm |
control_mod |
gcm 计算 day_end,leapfrog 推导循环终点。 |
run.def: day_step |
conf_gcm |
control_mod%day_step |
dtvr=daysec/day_step,history 周期,physics/dynamics 调用频率。 |
run.def: iperiod, iphysiq, nsplit_phys |
conf_gcm |
control_mod |
入口整除检查,iniphysiq 的 dtphys/nsplit_phys,leapfrog 的 physics 门控。 |
run.def: read_start |
conf_gcm |
logic_mod%read_start |
选择 dynetat0("start.nc") 或 iniacademic。 |
run.def: raz_date, starttime, timestart, ecritstart |
conf_gcm |
control_mod, temps_mod |
restart 时间选择、入口日期重置、Mars 初始 restart day。 |
traceur.def |
infotrac_init |
infotrac%nqtot 和 tracer 表 |
分配 q,读取 start.nc tracer,后续输送。 |
start.nc |
dynetat0 |
ucov/vcov/teta/q/masse/ps/phis/time_0 和时间控制 |
iniphysiq 之前的动力状态;最终传给 leapfrog。 |
Mars 正常路径和排除路径
Mars 3D 正常 run 的 COMMON 主链可以写成:
makelmdz_fcm -p mars gcm
-> PROGRAM gcm
-> require run.def
-> conf_gcm(99,.TRUE.)
-> infotrac_init + allocate q
-> dynetat0("start.nc") when read_start
-> validate day_step/iperiod/iphysiq and date controls
-> iniconst -> inigeom -> inifilr -> inidissip
-> iniphysiq(..., dtphys/nsplit_phys, ..., iflag_phys)
-> dynredem0 + optional inithist/initdynav
-> leapfrog(...)
不纳入本页展开:
- Earth-only ORCHIDEE/INCA/COSP/SISVAT/RRTM 编译选项。
planet_type=="earth"的 IOIPSL Julian date 显示路径;Mars 下jD_ref/jH_ref在当前 COMMON 入口中置 0。- Venus/Titan calendar abort 分支。
read_start=.false.的iniacademic理想化初态,只作为条件路径记录。- MARS
nogcm.F90 -> leapfrog_nogcm,它与本页共享conf_gcm/iniconst/inigeom/iniphysiq形状,但主循环和动力意义不同。
与 nogcm 和 Mars defrun_new 的边界
MARS libf\dynphy_lonlat\phymars\nogcm.F90 也调用 conf_gcm(99,.TRUE.),随后执行与 gcm 相似的常量、几何、物理初始化,最后进入 leapfrog_nogcm。它不是 makelmdz_fcm -p mars gcm 的主程序,而是 Mars lon-lat/no-GCM 变体。
MARS defrun_new.F 是 Mars 专属旧式/工具链配置读取器:它直接打开 run.def,写 Mars 相关默认,且注释说明部分 terrestrial 参数“不再从 run.def 读”。COMMON gcm.F90 的 3D 主入口不直接调用 defrun_new;本页只把它作为 Mars utility/nogcm 边界参考。
复现检查点
运行前最小检查:
- 可执行文件来自
makelmdz_fcm -p mars gcm,并和目标分辨率-d匹配。 - 运行目录存在
run.def、traceur.def、start.nc,Mars physics 还需要匹配的startfi.nc/callphys.def路径。 run.def中planet_type应与 Mars physics 一致,通常为mars。mod(iphysiq,iperiod)==0,且day_step同时为iperiod和iphysiq的倍数。- 若使用串行动力,不设置
use_filtre_fft=.true.。 - 若从已有 restart 继续,确认
timestart/starttime/raz_date/ecritstart,避免入口因为时间不一致 abort 或从非预期记录启动。 - 若需要 history/dynav 输出,确认构建带
CPP_IOIPSL,且ok_dyn_ins/ok_dyn_ave、iecri/periodav有期望值。
待确认
- Mars 生产脚本更常用串行
gcm还是并行dyn3dpar/gcm.F,需要由具体平台 run 脚本和编译命令确认;本页覆盖gcm_..._seq.e形态,同时说明 parallel 产物命名。 startfi.nc的 physics 读取不在 COMMONgcm.F90中直接出现,而是在 Marsiniphysiq/physiq链中进入;完整 physics restart 入口需与 Mars physics wiki 对接。