物理侧 MPI data/transfer 组

输入范围

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\phy_common\mod_phys_lmdz_mpi_data.F90
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\phy_common\mod_phys_lmdz_mpi_transfert.F90

文件定位

mod_phys_lmdz_mpi_data.F90 保存物理侧 MPI decomposition:当前 rank 的经纬向范围、物理列范围、极点所有权、MPI communicator 和 datatype。mod_phys_lmdz_mpi_transfert.F90 在这些分布表之上提供广播、scatter/gather、二维 scatter/gather、reduce 和 1D/2D 网格互转的泛型 MPI 包装。

Mars 运行参与度

条件经过:Mars 或 COMMON 物理侧启用 MPI 物理分布和 transfer 包装时经过;串行构建通过上层抽象绕过或退化。

文件和符号

文件 行数 主要符号 作用
mod_phys_lmdz_mpi_data.F90 220 mod_phys_lmdz_mpi_data, init_phys_lmdz_mpi_data, print_module_data 保存 MPI rank、分布表和当前 rank 子域。
mod_phys_lmdz_mpi_transfert.F90 1953 mod_phys_lmdz_mpi_transfert, bcast_mpi, scatter_mpi, gather_mpi, scatter2D_mpi, gather2D_mpi, reduce_sum_mpi, grid1dTo2d_mpi, grid2dTo1d_mpi 为 integer/real/logical/character 和多维数组提供 MPI transfer 泛型;主文件页见 mod_phys_lmdz_mpi_transfert

MPI data 初始化

init_phys_lmdz_mpi_data(nbp,nbp_lon,nbp_lat,communicator) 的核心步骤:

  1. 计算全局物理列数:1D 时 klon_glo=1,否则 klon_glo=nbp_lon*(nbp_lat-2)+2
  2. 若启用 MPI,从 COMM_LMDZ_PHY 读取 mpi_size/mpi_rank,设置 MPI_REAL_LMDZ=MPI_REAL8;否则设为单 rank。
  3. MPI_ALLGATHER 收集每个 rank 的 nbp,得到 klon_mpi_para_nb
  4. 由累计列数计算 klon_mpi_para_begin/end
  5. 通过偏移 +nbp_lon-1 将一维列范围换算为 ij_para_begin/endjj_para_begin/endii_para_begin/end
  6. 将本 rank 的范围写入 ii_begin/ii_end/jj_begin/jj_end/jj_nb/klon_mpi_begin/klon_mpi_end/klon_mpi

MPI transfer 接口族

mod_phys_lmdz_mpi_transfert 定义多个 Fortran 泛型接口。常用族:

接口覆盖 integer、real、logical;广播还覆盖 character。数组维数通常支持标量到 3/4 维包装,内部用 dimsize 展平附加维度。

复现要点

待确认

相关页面