dyn3dpar 总览
路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3dpar
职责
dyn3dpar 是 COMMON 并行动力目录。它在串行 dyn3d 主链的基础上加入 MPI/OpenMP 初始化、纬向 decomposition、stage-specific band 分布、halo/swap 通信、root/domain I/O 和并行动力-物理接口约束。Mars 串行 3D 或 Mars nogcm 类路径不经过本目录;Mars 并行动力构建、并行入口验证或并行物理接口测试会经过这里。
最短阅读路径:
- gcm:并行入口,说明
conf_gcm -> init_const_mpi -> init_parallel -> bands/halo -> leapfrog_p。 - conf_gcm:并行配置读取,覆盖
adjust/use_filtre_fft/use_mpi_alloc和并行 sponge。 - parallel_lmdz、bands、mod_hallo:理解 decomposition、band 和通信。
- leapfrog_p:并行时间推进、band 切换、physics、耗散、输出和 restart。
- 串行/并行动力对照主题页:从串行公式对照并行边界。
目录分组
| 分组 | 代表文件 | 作用 |
|---|---|---|
| 入口和配置 | gcm.F, conf_gcm.F90, abort_gcm.F, getparam.F90, wrgrads.F |
并行主程序、运行配置、错误终止和历史辅助入口。 |
| 并行基础设施 | mod_const_mpi.F90, parallel_lmdz.F90, mod_hallo.F90, bands.F90, times.F90, omp_chunk.h |
MPI/OMP 常量、decomposition、halo/swap 请求、band 分布和计时重平衡。 |
| 主时间推进 | leapfrog_p.F, logic_mod.F90, temps_mod.F90, moyzon_mod.F90 |
并行 Matsuno/leapfrog 调度、运行逻辑、时间状态和纬向平均。 |
| 动力 tendency | caldyn_p.F, covcont_p.F, covnat_p.F, pression_p.F, massdair_p.F, massbar_p.F, massbarxy_p.F, flumass_p.F, convflu_p.F, convmas*_p.F, dteta1_p.F, vitvert_p.F, dudv*_p.F, enercin_p.F, bernoui_p.F, tourpot_p.F, geopot_p.F |
并行 pressure/mass/flux/energy/vorticity 管线;多数由串并行 routines 深度页覆盖。 |
| 微分和耗散算子 | grad*_p.F, diverg*_p.F, rotat*_p.F, laplacien*_p.F, nxgrad*_p.F, nxgraro*_p.F, divgrad*_p.F, dissip_p.F, friction_p.F, top_bound_p.F, sponge_mod_p.F90 |
并行梯度、散度、旋度、Laplacian、耗散、摩擦和顶边界。 |
| tracer 输送 | advtrac_p.F90, advect_p.F, advect_new_p.F, vlsplt_p.F, vlspltgen_p.F, vlspltqs_p.F, check_isotopes_p.F, filtreg_p.F |
并行 tracer advection、Van Leer split、水汽饱和路径、isotope 检查和滤波。 |
| 物理耦合 | addfi_p.F, qminimum_p.F, planetary_operations_p.F90, guide_p_mod.F90 |
physics tendency 回填、tracer 下限、行星操作和 guide/nudging 并行实现。 |
| I/O、history、restart | dynredem_p.F90, inithist_p.F, writehist_p.F, initdynav_p.F, writedynav_p.F, initfluxsto_p.F, fluxstokenc_p.F, bilan_dyn_p.F, write_field_p.F90 |
并行 restart、history/dynav、flux storage、守恒诊断和 debug dump。 |
| 测试/理想化 | sw_case_williamson91_6.F |
shallow-water Williamson case。 |
已有关键页面
| 页面 | 覆盖内容 |
|---|---|
| gcm | 并行入口、MPI/OMP 初始化、bands、halo、start/restart/history 和 leapfrog_p 调度。 |
| conf_gcm | 并行配置读取、并行专用键、耗散/sponge/zoom 状态和串并行差异。 |
| leapfrog_p | 并行 Matsuno/leapfrog 主循环、band 切换、halo、physics、耗散、输出和 restart。 |
| parallel_lmdz | MPI/OMP rank、纬向 decomposition、局部 ij 范围、gather/broadcast 和 omp_chunk 修复。 |
| mod_hallo | halo/swap request、打包通信、threadprivate buffer 和 use_mpi_alloc 边界。 |
| bands | caldyn/Van Leer/dissip/physics band 分布和 adaptive rebalancing。 |
| times | adaptive bands 的计时状态和 MPI 汇总。 |
| guide_p_mod | 并行 guide/nudging,覆盖 guide_plevs、局部范围、halo、root 输出和 Mars 边界。 |
| vlsplt_p | 并行 Van Leer split 主文件页,覆盖 band、halo、OMP、动态工作数组和父子 tracer。 |
| vlspltgen_p | 并行通用 tracer split 调度。 |
| vlspltqs_p | 并行饱和水汽 split 输送。 |
| bilan_dyn_p | 并行动力守恒和 zonal diagnostic 输出。 |
与串行 dyn3d 的关系
| 串行目录/页 | 并行对应 | 差异重点 |
|---|---|---|
| dyn3d/index | 本页 | 串行全局数组 vs 并行局部数组、band 和 halo。 |
| dyn3d/gcm | gcm | 并行入口多出 init_const_mpi/init_parallel/Read_Distrib/set_bands/Init_Mod_hallo。 |
| dyn3d/conf_gcm | conf_gcm | 并行读取 adjust/use_filtre_fft/use_mpi_alloc,使用 sponge_mod_p。 |
| dyn3d/leapfrog | leapfrog_p | 并行主循环在 caldyn、transport、dissip、physics 和 output 阶段切换分布并注册 halo。 |
| dyn3d/advtrac | advtrac_p.F90, vlsplt_p, vlspltgen_p |
tracer scheme 调度相似,但并行路径受 nqperes/iadv、band、halo/swap 和 OpenMP chunk 约束。 |
| dyn3d/bilan_dyn | bilan_dyn_p | 守恒和 zonal diagnostics 要处理局部分布、halo 和 root 输出。 |
并行基础约定
dyn3dpar 的可复现性主要依赖三个基础约定:
parallel_lmdz给出当前 rank 的纬向范围、极点所有权和局部一维索引。bands为 caldyn、Van Leer、dissip、physics 分别提供 stage-specific 分布;leapfrog_p运行中会频繁SetDistrib。mod_hallo负责跨 rank halo 和重分布请求;复杂字段必须先注册,再发送/等待/解包。
因此排查并行数值差异时,不应先假设公式错误。更稳的顺序是:确认当前 stage 的 band、确认 ij_begin/ij_end 和极点所有者、确认 halo 请求宽度和时机,再进入具体算子。
主题和 routine 入口
| 主题/组页 | 对应 dyn3dpar 范围 |
|---|---|
| 串行/并行动力对照 | 主题读法:decomposition、halo、bands、I/O 和 physics transfer。 |
| conf_gcm 串并行配置差异 | dyn3d/conf_gcm.F90 与 dyn3dpar/conf_gcm.F90 配置差异。 |
| leapfrog-p state contract | leapfrog_p 入口实参、工作数组和 module 状态。 |
| leapfrog-p time scheduler | forward/leapf/purmats/apphys/apdiss/lafin、True_itau 和输出/restart 调度。 |
| leapfrog-p distribution halo | SetDistrib、band 切换和 halo/swap request。 |
| leapfrog-p physics coupling | calfis_p、physics tendency halo、addfi_p 和 top_bound_p。 |
| leapfrog-p output restart | history/dynav/zonal diagnostics 和 restart 写出。 |
| caldyn 串并行对照 | caldyn_p 与串行 caldyn 对照。 |
| caldyn dynamic tendencies | pressure/mass/flux/energy/vorticity 5 段管线,包含并行拆分。 |
| advtrac 串并行对照 | advtrac_p 调度和串行 wrapper 差异。 |
| vlsplt-p halo split | vlsplt_p halo 注册、边界带/内区重叠和 band 依赖。 |
| dissip 串并行对照 | dissip_p 与串行耗散。 |
| history output 串并行对照 | writehist_p/writedynav_p root/domain 输出。 |
| dynredem restart | dynredem_p 并行 restart 写出。 |
Mars 范围边界
- Mars 串行 3D 正常入口可不经过本目录;本目录是 Mars 并行动力条件路径。
- Mars physics 的 MPI/OMP 列分布还依赖 phy_common/mod_phys_lmdz_para、parallel-physics-grid-distribution 和 transfer 页面。
- Venus/Titan 专属分支、
evolution/PEM和 当前 COMMON 源码已删除的dyn3d/nogcm.F90不属于本目录页面范围。
复现清单
- 记录编译目标是串行还是并行;并行目标再记录 MPI ranks、OpenMP threads 和
omp_chunk。 - 读取
run.def中adjust/use_filtre_fft/use_mpi_alloc/offline/ngroup等并行相关键。 - 检查
Bands_*prc.dat是否存在;若不存在,确认bands的默认分布和WriteBands输出。 - 对某个
_p算子定位问题前,先确认当前SetDistrib使用的是 caldyn、Van Leer、dissip 还是 physics band。 - 对极点或边界行差异,先查
pole_nord/pole_sud、exchange_hallo和mod_hallo请求。 - 对 output/restart 差异,查 root rank、IOIPSL domain、局部切片和 gather 路径。
- 对 physics tendency 差异,同时查
calfis_p动力侧映射和phy_commontransfer。
待确认
- 具体 Mars 生产脚本是否默认走
dyn3dpar/gcm.F,以及是否保留Bands_*prc.dat,需要结合实验脚本确认。 - 多个
_p叶子算子目前由串并行 routine 页或主页面覆盖,未逐一建立单文件页;若后续定位到具体 bug,可按文件再拆。 sw_case_williamson91_6.F属于理想化 shallow-water 测试,Mars 标准路径不应误读为必经。