conf_gcm 串并行配置差异
源码基线:LMDZ.COMMON-6.3\LMDZ.COMMON。 Mars 运行参与度:必经/条件经过。串行 Mars 3D gcm 经过 dyn3d/conf_gcm.F90;并行动力构建或并行入口测试经过 dyn3dpar/conf_gcm.F90。本页只覆盖 Mars run 相关的 COMMON 配置链,Earth/Titan/Venus 专属行为只作为边界说明。
源码范围
| 文件 | 入口 | 本页用途 |
|---|---|---|
libf/dyn3d/conf_gcm.F90 |
SUBROUTINE conf_gcm(tapedef, etatinit),第 4 行 |
串行配置读取中心,写 control_mod、logic_mod、comconst_mod、sponge_mod、serre_mod。 |
libf/dyn3dpar/conf_gcm.F90 |
SUBROUTINE conf_gcm(tapedef, etatinit),第 6 行 |
并行配置读取中心,主体与串行同构,额外读并行滤波、MPI allocation 和 OMP adjust 约束。 |
libf/dyn3d/gcm.F90 |
PROGRAM gcm |
串行入口在 conf_gcm 后做整除和 FFT filter 约束,随后初始化动力/物理和 history。 |
libf/dyn3dpar/gcm.F |
PROGRAM gcm |
并行入口在 conf_gcm 后初始化 MPI/OMP、bands、halo 分布,并限制 rank 0 history 初始化。 |
共同配置管线
串行和并行入口都先调用 parse_args(),再调用 conf_gcm(99,.TRUE.)。conf_gcm 不是一个返回局部配置对象的例程;它直接把 getin 读到的值写入模块全局状态。后续 gcm、gcm_p、leapfrog、leapfrog_p 通过这些模块变量使用配置。
gcm 或 gcm_p
-> parse_args()
-> conf_gcm(99,.TRUE.)
-> getin keys
-> control_mod / logic_mod / comconst_mod / sponge(_p) / serre_mod
-> 入口硬约束
-> 初态、常量、几何、耗散、物理接口、history 初始化
-> leapfrog 或 leapfrog_p
关键共同点:
iphysiq必须是iperiod的倍数。串行入口在gcm.F90167-168 行检查;并行入口在gcm.F181-182 行检查。day_step必须分别是iperiod和iphysiq的倍数。串行入口在 292-300 行检查;并行入口在 310-318 行检查。- 两个入口都用
zdtvr = daysec / REAL(day_step)刷新动力时间步,串行在 304 行,并行在 322 行。 raz_date == 1时,两个入口都把start_time重设为starttime,串行在 314-316 行,并行在 332-334 行。主线不再把旧版严格 mismatch 逻辑作为主路径。read_start都决定是否从start.nc读动力初态;否则走 idealized/academic 初始化。inidissip、iniphysiq和ok_dyn_ins/ok_dyn_avehistory 初始化都在入口程序里使用conf_gcm写入的状态。
共享 getin 键
| 类别 | 主要键 | 写入/影响 | Mars 复现要点 |
|---|---|---|---|
| 日期和运行长度 | calend, dayref, anneeref, raz_date, nday, ndynstep, starttime, ecritstart, less1day, fractday |
control_mod, temps_mod |
Mars 日期和 restart 时间由入口与 leapfrog* 继续派生;raz_date==1 直接重设初始时间。 |
| 时间步和调度 | day_step, nsplit_phys, iperiod, iphysiq, iapp_tracvl |
control_mod |
入口整除检查是硬门;nsplit_phys 进入 iniphysiq 的 dtphys/nsplit_phys。 |
| 物理和 tracer | iflag_phys, iflag_trac, type_trac, config_inca, force_conserv_tracer, cpofT |
logic_mod, control_mod, infotrac |
iflag_phys 决定物理初始化和 leapfrog* physics 门,tracer 维度由后续 infotrac_init 使用。 |
| restart 和初态 | read_start, resetvarc, ok_etat0, ok_limit, read_orop |
logic_mod, control_mod |
read_start=.true. 进入 dynetat0("start.nc");Mars utility 对这些 COMMON 状态也有接口兼容需求。 |
| 动力输出 | ok_dynzon, ok_dyn_ins, ok_dyn_ave, iecri, periodav, output_grads_dyn |
control_mod |
串行直接初始化 history;并行只在 mpi_rank==0 初始化 history/dynav。 |
| 耗散和顶边界 | idissip, dissip_period, lstardis, nitergdiv, nitergrot, niterh, tetagdiv, tetagrot, tetatemp, dissip_*, iflag_top_bound, mode_top_bound, tau_top_bound, callsponge |
control_mod, comconst_mod, sponge_mod(_p) |
idissip 是旧 Mars/Generic 兼容键,随后 dissip_period 可覆盖;iflag_top_bound>=1 与 callsponge=.true. 互斥。 |
| zoom 和网格映射 | clon, clat, grossismx, grossismy, fxyhypb, dzoomx, dzoomy, taux, tauy, ysinus |
serre_mod |
etatinit=.false. 时会把配置和 start 状态比较;Mars 标准 run 通常关注与 start 文件一致性。 |
| 行星分支 | planet_type, ok_strato, vert_prof_dissip |
control_mod, logic_mod, comconst_mod |
非 Earth 行星默认 vert_prof_dissip=0,Mars 分支改成 1;Earth strato 逻辑不展开。 |
串并行差异
| 主题 | 串行 dyn3d |
并行 dyn3dpar |
影响 |
|---|---|---|---|
adjust |
串行 conf_gcm.F90 不读该键。 |
并行 conf_gcm.F90 104-114 行读 adjust;若 OpenMP 线程数大于 1 且 adjust=y,调用 abort_gcm。 |
并行 OMP run 中 adjust 必须关闭。 |
offline 与 adjust |
只读 offline,不检查 adjust。 |
537-540 行读 offline 后,如 offline .AND. adjust 打印 warning。 |
并行配置排查时要同时查 offline/adjust。 |
use_filtre_fft |
串行 conf_gcm.F90 568-573 行读到 true 即停止;串行入口 gcm.F90 170-173 行又再次 abort。 |
并行 conf_gcm.F90 595-596 行读入 mod_filtre_fft:use_filtre_fft,没有同样的停止逻辑。 |
FFT filter 是并行路径配置;串行 Mars GCM 不能打开。 |
use_mpi_alloc |
无。 | 并行 conf_gcm.F90 607-615 行读 use_mpi_alloc 到 mod_hallo。 |
影响并行 halo/通信相关内存分配策略,主页面需继续追踪具体使用点。 |
ngroup |
串行 423-426 行读取,要求 iim 可被 2**ngroup 兼容。 |
并行 442-445 行同样读取。 | 这是共享动力网格约束,不是并行独有键。 |
| sponge 模块 | sponge_mod。 |
sponge_mod_p。 |
配置键相同,但运行时作用到串行/并行不同实现。 |
| 并行初始化 | 无 MPI/OMP 初始化。 | gcm.F 189-204 行调用 init_const_mpi, init_parallel, Read_Distrib, set_bands, rank 0 WriteBands, SetDistrib(jj_Nb_Caldyn)。 |
conf_gcm 后进入并行分布状态,很多后续数组必须处在正确 band。 |
| 物理初始化参数 | iniphysiq(iim,jjm,llm,...) 使用全局 lon-lat 结构。 |
iniphysiq(..., distrib_phys(mpi_rank), comm_lmdz, ...)。 |
并行物理初始化接收当前 rank 的物理列分布和 communicator。 |
| history 初始化 | 串行入口直接按 ok_dyn_ins/ok_dyn_ave 初始化。 |
gcm.F 512 行起包在 IF (mpi_rank==0) 内。 |
并行 history/dynav 文件由 root rank 建立,其他 rank 只参与计算/通信。 |
并行入口约束细节
并行版 conf_gcm 的配置读取并不会自己建立 MPI decomposition;它只是把配置写入模块。真正的并行结构在 dyn3dpar/gcm.F 中建立:
conf_gcm(99,.TRUE.)读配置后,立即检查iphysiq/iperiod。init_const_mpi设置COMM_LMDZ和 MPI datatype。init_parallel初始化 MPI/OMP rank、局部纬向范围和 communicator。Read_Distrib读取可能存在的Bands_*prc.dat分布。set_bands派生 caldyn、vanleer、dissip、physics 等 band;mpi_rank==0写WriteBands。SetDistrib(jj_Nb_Caldyn)将当前分布切到动力计算初始 band。- OpenMP parallel 区内初始化
mod_hallo,使每个线程拥有 halo 请求/缓冲状态。
所以并行配置问题要按两层排查:先确认 conf_gcm 的 getin 键和入口整除约束,再确认 bands/halo/distribution 是否与当前 MPI size、OMP 线程数和 Bands_*prc.dat 一致。
Mars run 相关边界
- Mars 串行 3D 正常入口不经过并行 MPI/bands 初始化,因此
use_mpi_alloc、rank 0 history 和distrib_phys(mpi_rank)只属于并行动力条件路径。 - Mars 并行 run 或并行代码验证会经过
dyn3dpar/gcm.F与dyn3dpar/conf_gcm.F90,这些配置不能只从串行页推断。 - Earth stratosphere 的
ok_strato默认分支和非 Mars Venus/Titan 路径不在本页展开;这里只记录它们不会改变 Mars 配置主线。 - 当前 COMMON 源码已删除
dyn3d/nogcm.F90;Marsphymars/nogcm.F90属于 MARS 树边界上下文,不作为 COMMON 文件页目标。
复现检查表
排查 run.def 或并行 Mars run 时,按这个顺序最稳:
- 确认入口是串行
dyn3d/gcm.F90还是并行dyn3dpar/gcm.F。 - 确认
parse_args()没有因未知命令行参数提前 abort。 - 确认
conf_gcm读到的planet_type,day_step,iperiod,iphysiq,iflag_phys,read_start,ok_dyn*。 - 检查
mod(iphysiq, iperiod)==0、mod(day_step, iperiod)==0、mod(day_step, iphysiq)==0。 - 串行入口确认
use_filtre_fft没有打开;并行入口确认use_filtre_fft是否需要 FFT filter 细节页继续追踪。 - 并行入口确认
adjust与 OMP 线程数兼容,offline .AND. adjustwarning 是否出现。 - 并行入口确认
Read_Distrib/set_bands/WriteBands/SetDistrib顺序和Bands_*prc.dat是否符合当前 MPI size。 - 若 history 缺文件,串行查
ok_dyn_ins/ok_dyn_ave;并行还要确认输出在mpi_rank==0初始化。
待确认
use_mpi_alloc的具体运行时影响需要在mod_hallo和相关 allocation 调用里继续追踪;本页只确认配置读取和模块归属。adjust的物理/数值意图没有在conf_gcm.F90附近解释;本页只确认并行 OMP 约束和 offline warning。- 具体 Mars 生产脚本是否默认使用并行入口,需要结合实验脚本确认;源码层面只能确认两套入口的条件可达性。