gcm.F

路径

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\gcm.F

文件定位

gcm.Fdyn3dpar 的并行 GCM 启动入口,定义 PROGRAM gcm。它在串行 dyn3d/gcm.F90 的主流程基础上加入 MPI/OpenMP 初始化、纬向 band 分布、halo 模块初始化、物理列分布和 leapfrog_p 调度。

Mars 运行参与度

条件经过:Mars 并行动力构建或复用 COMMON 并行动力入口时经过;MARS dyn1d 物理测试更多使用 COMMON 并行抽象模块而不是直接运行本入口。

定义的符号

符号 类型 行号 作用
gcm program 6 并行 GCM 主程序。

主要依赖

依赖 用途
mod_const_mpi:init_const_mpi 初始化 COMM_LMDZ 和 MPI datatype。
parallel_lmdz 初始化 MPI/OMP rank、纬向 decomposition、barrier、SetDistrib
Bands 读取、设置、写出 caldyn/vanleer/dissip/physics band 分布。
mod_hallo OpenMP 线程内初始化并行 halo 请求缓冲。
infotrac 读取 tracer 配置并决定 q 的第四维。
control_modlogic_modtemps_mod 运行时长、物理调用频率、日期、start/restart 逻辑。
iniphysiq_modmod_grid_phy_lmdzdimphy CPP_PHYS 下初始化物理接口。
comconst_mod daysec/dtvr/dtphys/rad/g/r/cpp 等动力常量。

输入与输出

方向 说明
run.def 输入 启动前用 INQUIRE 检查,缺失则 abort_gcm
Bands_${iim}x${jjm}x${llm}_${mpi_size}prc.dat 输入/输出 Read_Distrib 可读取已有分布;rank 0 调 WriteBands 写出当前分布。
start.nc 输入 read_start=.true. 时由 dynetat0 读入动力初态。
relax.nc 输入 planet_type=="generic"ok_guide 时读 relaxation 场。
restart.nc 输出 dynredem0_p 写初始或结束日 restart。
dyn_histdyn_hist_ave 输出 rank 0 初始化 history/dynav 输出。

核心启动顺序

  1. 设置默认 history 文件名并确认 run.def 存在。
  2. 调用 conf_gcm(99,.TRUE.) 读取运行控制;要求 iphysiq 可被 iperiod 整除。
  3. 调用 init_const_mpiinit_parallelRead_Distribbarrierset_bands;rank 0 写出 band 文件。
  4. 调用 SetDistrib(jj_Nb_Caldyn),将主动力计算分布切到 caldyn band。
  5. 在 OpenMP parallel 区中调用 Init_Mod_hallo,使每个线程拥有可用 halo 请求/缓冲状态。
  6. 初始化 Cp(T)、IOIPSL 日历和 tracer,按 nqtot 分配 q(ip1jmp1,llm,nqtot)
  7. 根据 read_start 选择 dynetat0("start.nc",...)iniacademic;generic guide 可补读 relax.nc
  8. 校验 day_stepiperiod/iphysiq 的整除关系,设置 dtvr=daysec/day_step
  9. 处理 start_time/starttimeraz_dateannee_ref/day_ref/day_ini/itau_dyn/itau_phy 和 Julian day。
  10. 物理开启时调用 iniconstinigeominifilr,随后 inidissip
  11. CPP_PHYS 下调用 iniphysiq(..., distrib_phys(mpi_rank), comm_lmdz, ..., dtphys/nsplit_phys, ...)
  12. 写初始 restart,rank 0 初始化 history 和 dynav,最后在 OpenMP parallel 区调用 leapfrog_p

并行特有逻辑

Read_Distribset_bands 先建立多个用途的纬向 band 数组。SetDistrib(jj_Nb_Caldyn)parallel_lmdz 当前分布设为 caldyn 需要的 band,后续 leapfrog_p 内部可按输送、耗散、物理等阶段重设分布。halo 模块初始化放在 OpenMP parallel 区内,是因为 mod_hallo 中部分缓冲和列表是 THREADPRIVATE

复现要点

待确认

相关页面