mod_const_mpi 串并行对照
输入范围
dyn3d\mod_const_mpi.F90
dyn3dpar\mod_const_mpi.F90
Mars 运行参与度:必经/条件经过。串行动力入口通过 COMM_LMDZ 与物理初始化保持接口一致;并行动力入口调用并行版本初始化 MPI/XIOS/OASIS 通信环境。
例程定位
mod_const_mpi 统一提供 COMM_LMDZ 和 MPI_REAL_LMDZ。串行目录中的实现是占位模块,直接把两个整数设为 0;并行目录中的实现负责初始化 MPI 线程级别、设置 COMM_LMDZ,并在 XIOS 或 coupled ocean 分支中取得正确 communicator。
对照表
| 项 | 串行 dyn3d/mod_const_mpi.F90 |
并行 dyn3dpar/mod_const_mpi.F90 |
|---|---|---|
| 行数 | 16 | 104 |
| 全局状态 | COMM_LMDZ, MPI_REAL_LMDZ |
COMM_LMDZ, MPI_REAL_LMDZ,均为 SAVE |
| 初始化例程 | Init_const_mpi |
Init_const_mpi, Init_mpi |
| MPI 初始化 | 无,设为 0 | MPI_INIT_THREAD(MPI_THREAD_SERIALIZED,...) |
| XIOS | 无 | wxios_init("LMDZ", outcom=COMM_LMDZ) 或无 outcom 分支 |
| OASIS/Prism | 无 | type_ocean=='couple' 且 CPP_COUPLE/CPP_OMCT 时使用 coupler communicator |
串行逻辑
dyn3d/mod_const_mpi.F90 只定义同名模块和同名 Init_const_mpi,将 COMM_LMDZ=0、MPI_REAL_LMDZ=0。这让串行 gcm.F90、nogcm.F90 和物理初始化代码可以使用同一个 COMM_LMDZ 接口,而不要求真实 MPI 环境。
并行逻辑
Init_const_mpi先在 OpenMP master 区读取type_ocean,默认值为'force '。- 若
type_ocean=='couple',coupled 分支尝试通过 XIOS 或 Prism/OASIS 获取COMM_LMDZ,并设置MPI_REAL_LMDZ=MPI_REAL8。 - 否则调用
Init_mpi。 Init_mpi在CPP_MPI下调用MPI_INIT_THREAD,要求MPI_THREAD_SERIALIZED。- 若 MPI 库提供的线程级别不足,会打印警告,但源码没有直接 abort。
- 设置
COMM_LMDZ=MPI_COMM_WORLD、MPI_REAL_LMDZ=MPI_REAL8。 - 若启用
CPP_XIOS,初始化 XIOS 并把COMM_LMDZ作为输出 communicator。
调用关系
| 调用方/使用方 | 作用 |
|---|---|
dyn3dpar/gcm.F |
USE mod_const_mpi, ONLY: init_const_mpi,并行入口初始化通信常量。 |
| parallel_lmdz | USE mod_const_mpi 读取 COMM_LMDZ 执行 rank/size、barrier、halo、gather。 |
COMMON dyn3d/gcm.F90, MARS phymars/nogcm.F90 |
USE mod_const_mpi, ONLY: COMM_LMDZ,传给物理初始化接口。 |
dynphy_lonlat/calfis_p.F |
使用并行 communicator 进入物理接口。 |
复现要点
- 并行构建中必须先调用
Init_const_mpi,再调用parallel_lmdz/init_parallel,否则COMM_LMDZ尚未可用。 - OpenMP+MPI 组合假定 MPI 库至少支持
MPI_THREAD_SERIALIZED。 type_ocean='couple'会改变 communicator 来源;coupled 实验不能简单假定MPI_COMM_WORLD。- 串行占位值 0 是接口兼容值,不代表真实通信域。
待确认
CPP_COUPLE与CPP_OMCT在 Mars 当前构建中的实际启用情况需由 arch/build 页面确认。MPI_REAL_LMDZ定义后实际使用点需在 halo/mod_hallo 页继续追踪。