mod_interface_dyn_phys.F90
路径
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dynphy_lonlat\mod_interface_dyn_phys.F90
文件定位
mod_interface_dyn_phys.F90 定义动力-物理接口索引模块 mod_interface_dyn_phys。并行物理编译时,它分配并填充 index_i/index_j,把当前 MPI 物理列映射回动力经纬索引;非并行物理编译时,Init_interface_dyn_phys 是空例程,只保留接口兼容。
Mars 运行参与度
接口兼容/条件经过:MARS dyn1d 直接转发本文件;并行物理路径初始化动力-物理索引时经过。串行非 `CPP_PARA` 构建只使用 dummy 初始化接口。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
mod_interface_dyn_phys |
module | 4 | 保存动力-物理接口索引。 |
index_i |
INTEGER,ALLOCATABLE,SAVE |
5 | 每个物理列对应的动力经向 i 索引。 |
index_j |
INTEGER,ALLOCATABLE,SAVE |
6 | 每个物理列对应的动力纬向 j 索引。 |
Init_interface_dyn_phys |
subroutine | 13 或 57 | 并行分支填充索引;非并行分支为空例程。 |
并行分支依赖
| 依赖 | 用途 |
|---|---|
mod_phys_lmdz_mpi_data |
提供 klon_mpi、ii_begin/ii_end、jj_begin/jj_end、is_north_pole_dyn/is_south_pole_dyn 等物理侧分布信息。 |
dimensions.h |
提供 iim 等动力网格维度。 |
并行初始化逻辑
- 分配
index_i(klon_mpi)和index_j(klon_mpi)。 - 从
k=1开始填充物理列到动力(i,j)的映射。 - 如果当前 MPI 物理域包含北极动力点,则第一列映射为
(1,1);否则从ii_begin:iim填当前jj_begin行。 - 对中间纬圈
jj_begin+1:jj_end-1,按i=1:iim填满整圈。 - 如果包含南极动力点,最后映射为
(1,jj_end);否则填i=1:ii_end的最后一行。
伪代码
allocate index_i/index_j for klon_mpi
k = 1
if north pole owned:
map k to (1,1)
else:
map partial first latitude row from ii_begin to iim
for j = jj_begin+1 to jj_end-1:
map all longitudes 1..iim
if south pole owned:
map k to (1,jj_end)
else:
map partial last latitude row from 1 to ii_end
副作用
本模块只分配和保存索引数组,不写文件,也不直接变换物理场。后续 calfis_p、gr_dyn_fi_p、gr_fi_dyn_p 使用这些索引解释物理列与动力网格的对应关系。
复现要点
- 极点只映射到
i=1的单点,而普通纬圈按完整或局部经度段展开。 index_i/index_j的长度是klon_mpi,不是全局klon_glo或 OpenMP 局部klon_omp。- 非
CPP_PARA分支不分配数组;调用方如果需要索引,必须确认编译宏。
待确认
mod_phys_lmdz_mpi_data中ii_begin/ii_end的边界定义需要物理侧 MPI data 页补全。- Mars dyn1d 转发本文件时是否永远走 dummy 分支,需要结合 dyn1d 编译宏确认。