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 输出。 |
核心启动顺序
- 设置默认 history 文件名并确认
run.def 存在。
- 调用
conf_gcm(99,.TRUE.) 读取运行控制;要求 iphysiq 可被 iperiod 整除。
- 调用
init_const_mpi、init_parallel、Read_Distrib、barrier、set_bands;rank 0 写出 band 文件。
- 调用
SetDistrib(jj_Nb_Caldyn),将主动力计算分布切到 caldyn band。
- 在 OpenMP parallel 区中调用
Init_Mod_hallo,使每个线程拥有可用 halo 请求/缓冲状态。
- 初始化 Cp(T)、IOIPSL 日历和 tracer,按
nqtot 分配 q(ip1jmp1,llm,nqtot)。
- 根据
read_start 选择 dynetat0("start.nc",...) 或 iniacademic;generic guide 可补读 relax.nc。
- 校验
day_step 与 iperiod/iphysiq 的整除关系,设置 dtvr=daysec/day_step。
- 处理
start_time/starttime、raz_date、annee_ref/day_ref/day_ini/itau_dyn/itau_phy 和 Julian day。
- 物理开启时调用
iniconst、inigeom、inifilr,随后 inidissip。
CPP_PHYS 下调用 iniphysiq(..., distrib_phys(mpi_rank), comm_lmdz, ..., dtphys/nsplit_phys, ...)。
- 写初始 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。
复现要点
iphysiq/iperiod 和 day_step/iphysiq 整除检查必须在进入时间推进前通过。
- 并行 history 初始化只在
mpi_rank==0 进行;物理初始化则接收本 rank 的 distrib_phys(mpi_rank)。
- Mars 分支在
ecritstart>0 时用 day_ini 写初始 restart,否则使用 day_end。
iniphysiq 调用传入 dtphys/nsplit_phys,不是直接传 dtphys。
待确认
- COMMON 并行
gcm.F 在当前 Mars 标准作业脚本中的直接入口地位需要 build/run 脚本确认。
Read_Distrib 文件缺失时的默认分布由 bands 记录,运行目录中是否保留该文件取决于具体实验。
相关页面