dyn1d/mod_interface_dyn_phys.F90

路径

LMDZ.MARS\libf\phymars\dyn1d\mod_interface_dyn_phys.F90

文件定位

dyn1d/mod_interface_dyn_phys.F90 在当前源码树中不是独立实现,而是一行相对路径:

../../../../LMDZ.COMMON/libf/dynphy_lonlat/mod_interface_dyn_phys.F90

它把 1D testphys1d 构建路径中的 mod_interface_dyn_phys 解析到公共 dynphy_lonlat 动力-物理接口辅助模块。目标模块不执行完整的动力到物理字段转换;它只保存并行物理列与动力网格 (i,j) 的索引映射,并提供初始化例程。非并行编译时该初始化例程是空例程。

定义的符号

符号 类型 目标行号 作用
mod_interface_dyn_phys.F90 path stub dyn1d line 1 指向 LMDZ.COMMON/libf/dynphy_lonlat/mod_interface_dyn_phys.F90
mod_interface_dyn_phys module common line 4 保存动力-物理接口的并行索引映射。
index_i(:) integer, allocatable, save common line 5 对每个本地物理列记录动力网格的 i 索引。
index_j(:) integer, allocatable, save common line 6 对每个本地物理列记录动力网格的 j 索引。
Init_interface_dyn_phys subroutine common line 12 或 51 初始化 index_i/index_j;非 CPP_PARA 时为空例程。

并行分支算法

CPP_PARA 打开时,Init_interface_dyn_phys 使用 mod_phys_lmdz_mpi_datadimensions.h 中的本地网格信息构造映射:

  1. 分配 index_i(klon_mpi)index_j(klon_mpi)
  2. k=1 开始写本地物理列序号。
  3. 若当前 MPI 子域包含北极动力点 is_north_pole_dyn,第一个物理列映射到 (1,1);否则把北边界行 jj_begini=ii_begin..iim 写入映射。
  4. 对内部纬向行 j=jj_begin+1..jj_end-1,把所有 i=1..iim 写入映射。
  5. 若当前子域包含南极动力点 is_south_pole_dyn,最后一列映射到 (1,jj_end);否则把南边界行 jj_endi=1..ii_end 写入映射。

这个映射处理了经向周期和极点压缩:极点只映射到一个代表点 (1, pole_j),非极点边界按本地 i 范围展开。

非并行分支

未定义 CPP_PARA 时:

SUBROUTINE Init_interface_dyn_phys
  ! dummy routine for seq case
END SUBROUTINE Init_interface_dyn_phys

因此顺序 1D testphys1d 路径调用该例程不会分配 index_i/index_j,也不会改变任何状态。

dyn1d 使用路径

init_testphys1d_mod 在初始化几何和物理状态前调用:

call init_interface_dyn_phys

在 1D 顺序运行中,这通常只是为了接口兼容而调用空例程;在并行/XIOS 构建组合中,若 CPP_PARA 有效,则该调用可提前建立物理列到动力网格的索引映射,供公共 dynphy_lonlat 并行接口路径使用。

与完整动力-物理转换的边界

完整的风、温度、压力、tracer tendency 转换不在本文件中实现,而是在公共 dynphy_lonlat/calfis.Fcalfis_p.F 等文件中进行。mod_interface_dyn_phys 只提供并行列索引映射,不能单独说明 physiq 全部输入/输出转换。

复现要点

  1. dyn1d 本地文件只是路径 stub;实际实现以 LMDZ.COMMON/libf/dynphy_lonlat/mod_interface_dyn_phys.F90 为准。
  2. CPP_PARA 编译下 init_interface_dyn_phys 是空例程;不要期待它在普通 1D 运行中填充几何或物理数组。
  3. CPP_PARAklon_mpi 必须与由 ii_begin/ii_end/jj_begin/jj_end、极点标志推导出的本地物理列数量一致,否则 index_i/index_j 写入会越界或漏填。
  4. 该模块没有释放例程;index_i/index_j 一旦分配,在进程生命周期内保持。

待确认

相关页面