gcm.F

路径

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

文件定位

gcm.F 是 dyn3dpar 的并行 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_mod、logic_mod、temps_mod 运行时长、物理调用频率、日期、start/restart 逻辑。
iniphysiq_mod、mod_grid_phy_lmdz、dimphy 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_hist、dyn_hist_ave 输出 rank 0 初始化 history/dynav 输出。

核心启动顺序

  1. 设置默认 history 文件名并确认 run.def 存在。
  2. 调用 conf_gcm(99,.TRUE.) 读取运行控制;要求 iphysiq 可被 iperiod 整除。
  3. 调用 init_const_mpi、init_parallel、Read_Distrib、barrier、set_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_step 与 iperiod/iphysiq 的整除关系,设置 dtvr=daysec/day_step。
  9. 处理 start_time/starttime、raz_date、annee_ref/day_ref/day_ini/itau_dyn/itau_phy 和 Julian day。
  10. 物理开启时调用 iniconst、inigeom、inifilr,随后 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_Distrib 和 set_bands 先建立多个用途的纬向 band 数组。SetDistrib(jj_Nb_Caldyn) 将 parallel_lmdz 当前分布设为 caldyn 需要的 band,后续 leapfrog_p 内部可按输送、耗散、物理等阶段重设分布。halo 模块初始化放在 OpenMP parallel 区内,是因为 mod_hallo 中部分缓冲和列表是 THREADPRIVATE。

复现要点

待确认

相关页面