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_modlogic_modcomconst_modsponge_modserre_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 读到的值写入模块全局状态。后续 gcmgcm_pleapfrogleapfrog_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

关键共同点:

共享 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 进入 iniphysiqdtphys/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>=1callsponge=.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 必须关闭。
offlineadjust 只读 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_allocmod_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 中建立:

  1. conf_gcm(99,.TRUE.) 读配置后,立即检查 iphysiq/iperiod
  2. init_const_mpi 设置 COMM_LMDZ 和 MPI datatype。
  3. init_parallel 初始化 MPI/OMP rank、局部纬向范围和 communicator。
  4. Read_Distrib 读取可能存在的 Bands_*prc.dat 分布。
  5. set_bands 派生 caldyn、vanleer、dissip、physics 等 band;mpi_rank==0WriteBands
  6. SetDistrib(jj_Nb_Caldyn) 将当前分布切到动力计算初始 band。
  7. OpenMP parallel 区内初始化 mod_hallo,使每个线程拥有 halo 请求/缓冲状态。

所以并行配置问题要按两层排查:先确认 conf_gcmgetin 键和入口整除约束,再确认 bands/halo/distribution 是否与当前 MPI size、OMP 线程数和 Bands_*prc.dat 一致。

Mars run 相关边界

复现检查表

排查 run.def 或并行 Mars run 时,按这个顺序最稳:

  1. 确认入口是串行 dyn3d/gcm.F90 还是并行 dyn3dpar/gcm.F
  2. 确认 parse_args() 没有因未知命令行参数提前 abort。
  3. 确认 conf_gcm 读到的 planet_type, day_step, iperiod, iphysiq, iflag_phys, read_start, ok_dyn*
  4. 检查 mod(iphysiq, iperiod)==0mod(day_step, iperiod)==0mod(day_step, iphysiq)==0
  5. 串行入口确认 use_filtre_fft 没有打开;并行入口确认 use_filtre_fft 是否需要 FFT filter 细节页继续追踪。
  6. 并行入口确认 adjust 与 OMP 线程数兼容,offline .AND. adjust warning 是否出现。
  7. 并行入口确认 Read_Distrib/set_bands/WriteBands/SetDistrib 顺序和 Bands_*prc.dat 是否符合当前 MPI size。
  8. 若 history 缺文件,串行查 ok_dyn_ins/ok_dyn_ave;并行还要确认输出在 mpi_rank==0 初始化。

待确认

相关页面