mod_const_mpi 串并行对照

输入范围

dyn3d\mod_const_mpi.F90
dyn3dpar\mod_const_mpi.F90

Mars 运行参与度:必经/条件经过。串行动力入口通过 COMM_LMDZ 与物理初始化保持接口一致;并行动力入口调用并行版本初始化 MPI/XIOS/OASIS 通信环境。

例程定位

mod_const_mpi 统一提供 COMM_LMDZMPI_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=0MPI_REAL_LMDZ=0。这让串行 gcm.F90nogcm.F90 和物理初始化代码可以使用同一个 COMM_LMDZ 接口,而不要求真实 MPI 环境。

并行逻辑

  1. Init_const_mpi 先在 OpenMP master 区读取 type_ocean,默认值为 'force '
  2. type_ocean=='couple',coupled 分支尝试通过 XIOS 或 Prism/OASIS 获取 COMM_LMDZ,并设置 MPI_REAL_LMDZ=MPI_REAL8
  3. 否则调用 Init_mpi
  4. Init_mpiCPP_MPI 下调用 MPI_INIT_THREAD,要求 MPI_THREAD_SERIALIZED
  5. 若 MPI 库提供的线程级别不足,会打印警告,但源码没有直接 abort。
  6. 设置 COMM_LMDZ=MPI_COMM_WORLDMPI_REAL_LMDZ=MPI_REAL8
  7. 若启用 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 进入物理接口。

复现要点

待确认

相关页面