planetwide_mod.F90
路径
LMDZ.MARS\libf\phymars\planetwide_mod.F90
所属目录 / 模块
libf\phymars
文件定位
planetwide_mod.F90 定义 planetwide_mod 模块,封装在整颗行星物理网格上做最大值、最小值和求和的工具接口。串行构建直接调用 Fortran intrinsic;CPP_PARA 并行构建先把本地物理列数组 gather 到全局物理网格,再由 master 进程做规约并用 bcast 广播标量结果。该模块不保存业务状态,主要为诊断、热羽流、山顶地形、tracer 质量修正和高层逃逸通量提供“全行星”意义上的规约值。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
planetwide_mod |
module |
4 |
全行星规约工具模块;在非 MESOSCALE 路径下提供最大值、最小值和求和泛型接口。 |
planetwide_maxval |
generic interface |
12 |
将 integer/real、1D/2D 本地物理网格数组规约为全行星最大值。 |
planetwide_minval |
generic interface |
17 |
将 integer/real、1D/2D 本地物理网格数组规约为全行星最小值。 |
planetwide_sumval |
generic interface |
22 |
将 integer/real、1D/2D 本地物理网格数组规约为全行星总和。 |
planetwide_maxval_i1 |
subroutine |
29 |
对 integer 1D 数组求全行星最大值。 |
planetwide_maxval_i2 |
subroutine |
51 |
对 integer 2D 数组求全行星最大值。 |
planetwide_maxval_r1 |
subroutine |
73 |
对 real 1D 数组求全行星最大值。 |
planetwide_maxval_r2 |
subroutine |
95 |
对 real 2D 数组求全行星最大值。 |
planetwide_minval_i1 |
subroutine |
119 |
对 integer 1D 数组求全行星最小值。 |
planetwide_minval_i2 |
subroutine |
141 |
对 integer 2D 数组求全行星最小值。 |
planetwide_minval_r1 |
subroutine |
163 |
对 real 1D 数组求全行星最小值。 |
planetwide_minval_r2 |
subroutine |
185 |
对 real 2D 数组求全行星最小值。 |
planetwide_sumval_i1 |
subroutine |
209 |
对 integer 1D 数组求全行星求和。 |
planetwide_sumval_i2 |
subroutine |
231 |
对 integer 2D 数组求全行星求和。 |
planetwide_sumval_r1 |
subroutine |
253 |
对 real 1D 数组求全行星求和。 |
planetwide_sumval_r2 |
subroutine |
275 |
对 real 2D 数组求全行星求和。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
mod_phys_lmdz_para |
is_master, gather, bcast |
并行路径中收集本地物理网格、限定 master 进程做 intrinsic 规约、再广播标量结果。 |
- |
dimphy |
klon |
每个具体例程都导入本地物理列数。 |
源码中未直接引用 klon;可能是历史接口约定或为数组形状说明保留。 |
mod_grid_phy_lmdz |
klon_glo |
并行路径中声明全局物理网格暂存数组 values_glo。 |
- |
调用的关键例程
| 被调用例程 |
所在模块 / 来源 |
调用位置 |
作用 |
gather |
mod_phys_lmdz_para |
各具体例程的 CPP_PARA 分支 |
把本地 values 收集到 values_glo。 |
bcast |
mod_phys_lmdz_para |
各具体例程的 CPP_PARA 分支 |
把 master 进程计算出的标量结果广播到全部进程。 |
maxval |
Fortran intrinsic |
planetwide_maxval_* |
对本地或全局数组求最大值。 |
minval |
Fortran intrinsic |
planetwide_minval_* |
对本地或全局数组求最小值。 |
sum |
Fortran intrinsic |
planetwide_sumval_* |
对本地或全局数组求总和。 |
主要调用点
| 调用方 |
源码位置 |
使用接口 |
用途 |
physiq_mod.F |
use 在 112-113 行;调用在 3236-3237 行 |
planetwide_sumval |
对 colden(:,iq)/6.022e23*mmol(iq)*1.e4*cell_area(:) 做全行星积分,得到 tracer 质量诊断。 |
thermcell_main_mars.F90 |
use 在 51 行;调用在 782、818 行 |
planetwide_maxval |
把局地热羽流层索引 lmax、lalim 扩展为全行星最大层索引 limz、llmax。 |
topmons_mod.F90 |
use 在 964 行;调用在 1046-1047 行 |
planetwide_maxval, planetwide_minval |
计算 hmons 山顶高度场的全行星最大值和最小值。 |
tracer_mass_fixer_dyn_mod.F90 |
use 在 108 行;调用在 145-147 行 |
planetwide_sumval |
对主要大气成分质量做全行星求和,构造动力学后质量修正因子。 |
aeronomars\moldiff_red.F90 |
use 在 16 行;调用在 678-680 行 |
planetwide_sumval |
对 H、H2、D 逃逸通量数组求全行星总逃逸通量;MESOSCALE 分支打印不支持提示。 |
aeronomars\moldiff_MPF.F90 |
use 在 19 行;调用在 868-870 行 |
planetwide_sumval |
与 moldiff_red 同样对 H、H2、D 逃逸通量数组求全行星总逃逸通量;MESOSCALE 分支打印不支持提示。 |
输入
| 输入 |
来源 |
类型 / 维度 |
含义 |
values(:) |
调用方 |
integer 或 real 1D 数组 |
本地物理网格列上的待规约值;第一维对应本进程物理列。 |
values(:,:) |
调用方 |
integer 或 real 2D 数组 |
本地物理网格列与第二维类别、层或 tracer 维度组成的待规约值。 |
输出
| 输出 |
去向 |
类型 / 维度 |
含义 |
values_max |
调用方 |
integer 或 real scalar |
planetwide_maxval_* 返回全行星最大值。 |
values_max |
调用方 |
integer 或 real scalar |
planetwide_minval_* 返回全行星最小值;形参名仍沿用 values_max,复现时不要据名称误判操作。 |
values_sum |
调用方 |
integer 或 real scalar |
planetwide_sumval_* 返回全行星总和。 |
共享状态与副作用
- 模块本身没有
SAVE 业务变量,也不读写文件。
CPP_PARA 分支会执行跨进程通信:本地数组先 gather 到 master,再把结果 bcast 回所有进程。
- 整个模块主体包在
#ifndef MESOSCALE 内;MESOSCALE 构建下这些接口不会由本文件提供。
核心逻辑
- 每个泛型接口按实参类型和维度分派到 12 个具体例程之一。
- 串行路径直接对传入的
values 调用 maxval、minval 或 sum。
- 并行路径声明
values_glo(klon_glo[,size(values,2)]),调用 gather(values,values_glo)。
- 仅当
is_master 为真时,对 values_glo 做 intrinsic 规约。
- 调用
bcast 把标量结果发回所有进程,使调用方在任一进程上拿到一致结果。
伪代码
planetwide_operation(values, result):
if CPP_PARA:
values_glo = gather(values)
if is_master:
result = operation(values_glo)
bcast(result)
else:
result = operation(values)
参与的主题流程
| 主题 |
参与方式 |
| 并行诊断 |
为 physiq 质量积分、山顶地形极值和逃逸通量提供跨进程一致的全行星规约。 |
| 热羽流 |
把局地热羽流层数需求转成全行星最大层数,用于后续数组范围和循环控制。 |
| tracer 质量守恒 |
tracer_mass_fixer_dyn_mod 用全行星质量和构造修正因子,减小动力学传输后的质量漂移。 |
| 高层大气逃逸 |
moldiff_red 和 moldiff_MPF 都对本地 H/H2/D 逃逸通量数组求总通量,输出全行星逃逸量。 |
写法特点
- 三组泛型接口覆盖 integer/real 与 1D/2D 数组,避免调用方显式选择具体例程。
- 并行规约没有使用 MPI collective 名称,而是通过 LMDZ 物理并行层的
gather 和 bcast 封装。
- 2D 例程只把第一维扩展到
klon_glo,第二维保留 size(values,2);调用方需要保证第一维是本地物理列。
复现要点
- 并行 GCM 中不要把这些调用替换成本地
maxval/minval/sum,否则只会得到当前进程子域的规约值。
- 输入数组第一维应对应本地物理列;若传入其他布局,
gather 的全局拼接语义会失真。
- integer 求和结果仍是 integer scalar,极端大数组或大权重下需要注意溢出风险。
MESOSCALE 构建下本模块接口被预处理排除,调用方需要走相应 mesoscale 分支或避免依赖这些接口。
待确认
- 各具体例程导入
dimphy::klon,但源码中未直接引用;是否为旧版数组接口残留或预处理分支依赖,需要后续全仓构建配置确认。
相关页面