leapfrog_p.F
源码路径:LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar\leapfrog_p.F。 Mars 运行参与度:条件经过;Mars 并行动力 GCM 主循环经过,串行动力不经过。
文件定位
leapfrog_p 是并行版时间推进主循环。它复用串行时间调度思想,但额外负责 parallel_lmdz band 切换、halo/swap request、physics band 重分布、gather 后 root 写输出和 restart。
restart 时间
| 位置 | 行号 | 行为 |
|---|---|---|
| Mars 中途 restart 分支 | 1822-1830 | CALL dynredem1_p("restart.nc", REAL(itau)/REAL(day_step)+time_0-floor(time_0), ...) 或减去 day_end-day_ini。 |
| 非 Mars 中途 restart fallback | 1833 | CALL dynredem1_p("restart.nc",JH_cur,...) |
| Mars 最终 restart 分支 | 2047-2053 | CALL dynredem1_p("restart.nc", REAL(itau)/REAL(day_step), ...) 或减去 day_end-day_ini。 |
| 非 Mars 最终 restart fallback | 2056 | CALL dynredem1_p("restart.nc",JH_cur,...) |
传入 dynredem-restart 的 time 最终写入 NetCDF time coordinate 和 tab_cntrl(32)。当前 页面不再把 start_time 写 restart 作为主线;Mars 分支还会使用 time_0 的小数部分修正中途 restart 时间。
并行调度
SetDistrib(jj_Nb_Caldyn)
-> caldyn_p / advtrac_p / integrd_p
-> swap/hallo 到 jj_Nb_Physic
-> calfis_p
-> tendency halo merge
-> addfi_p
-> swap 回 jj_Nb_Caldyn
-> 可选 jj_Nb_dissip
-> Gather_Field + root 输出/restart
并行版关键依赖:
- parallel_lmdz:
SetDistrib、Gather_Field、finalize_parallel。 - mod_hallo:
Register_Hallo、Register_SwapField、SendRequest、WaitRequest。 - calfis_p:并行动力-物理接口。
与 并行修复的接口确认
parallel_lmdz的omp_chunk下调逻辑避免某些 hybrid run 中线程无工作却进入MPI_Waitall。- physics 配置读取通过
ioipsl_getin_p_mod:is_master集中 master 判断。 - physics transfer 层新增 5D/6D broadcast,可支撑更高 rank 的物理数组。
- 输出面积由
geometry_mod:cell_area_for_lonlat_outputs与 physics cell area 分开。
Mars 路径边界
- Mars 标准并行 GCM 关注
calfis_p -> addfi_p、restart/history、halo/swap。 - Earth/generic/Titan/giant 分支不在本页展开。
- 当前 COMMON 源码已删除
nogcm,不再做 COMMON nogcm 对照。
复现检查
- 记录当前
jj_Nb_*band 和SetDistrib序列。 - 对 restart,检查 root 写入前字段是否已完整 gather/swap。
- 对 hybrid MPI/OMP 卡死或 request 错误,先查
parallel_lmdz的omp_chunk。 - 对 physics 配置差异,查
is_mastergetin 和bcast。