mod_phys_lmdz_para.F90
路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\phy_common\mod_phys_lmdz_para.F90
文件定位
mod_phys_lmdz_para.F90 定义物理侧并行抽象模块 mod_phys_lmdz_para。它组合 MPI 数据、OpenMP 数据和通用 transfer 封装,初始化本 rank/线程的物理列数量,并用 Test_transfert 检查 scatter/gather/bcast/reduce 等通信包装。
Mars 运行参与度
条件经过:Mars 或 COMMON 物理侧初始化物理列并行分布时经过;串行构建也通过本抽象保持接口兼容。
定义的符号
| 符号 | 类型 | 行号 | 作用 | | --- | --- | --- | | mod_phys_lmdz_para | module | 4 | 物理侧并行抽象入口。 | | klon_loc | INTEGER,SAVE,THREADPRIVATE | 9 | 当前 OpenMP 线程本地物理列数。 | | is_sequential、is_parallel | LOGICAL,SAVE | 10-11 | 运行并行状态标志。 | | is_master | LOGICAL,SAVE,THREADPRIVATE | 12 | 当前线程是否 master。 | | Init_phys_lmdz_para | subroutine | 19 | 初始化 MPI/OMP 物理列分布。 | | Test_transfert | subroutine | 49 | 测试物理侧 transfer 包装。 |
初始化流程
Init_phys_lmdz_para(nbp,nbp_lon,nbp_lat,communicator)调用Init_phys_lmdz_mpi_data建立 MPI 物理分布。- 进入 OpenMP parallel 区,调用
Init_phys_lmdz_omp_data(klon_mpi)建立线程内分布。 - 设置
klon_loc=klon_omp。 - 根据 MPI rank 和 OpenMP rank 设置
is_master,并调用Test_transfert。 - parallel 区外设置
is_sequential与is_parallel。
Test_transfert
测试例程构造全局 1D/2D 字段,依次验证:
Scatter后Gather回全局 1D 字段。grid1dTo2d_glo、scatter2D、gather2d、grid2dTo1d_glo往返。bcast与reduce_sum。
只有 is_master 分支打印/检查全局结果。
复现要点
klon_loc和is_master是THREADPRIVATE,不同 OpenMP 线程值不同。- 本模块本身不直接写 MPI 调用,真正通信在
mod_phys_lmdz_transfert_para及 MPI/OMP data/transfer 模块中。 Test_transfert使用mod_grid_phy_lmdz:klon_glo,nbp_lev,因此必须在 grid 初始化之后执行。
待确认
Init_phys_lmdz_mpi_data和Init_phys_lmdz_omp_data的边界计算需由后续 MPI/OMP data-transfer 页面展开。Test_transfert在生产运行中是否始终启用,需结合编译/运行开关确认。