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 把局地热羽流层索引 lmaxlalim 扩展为全行星最大层索引 limzllmax
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_* 返回全行星总和。

共享状态与副作用

核心逻辑

  1. 每个泛型接口按实参类型和维度分派到 12 个具体例程之一。
  2. 串行路径直接对传入的 values 调用 maxvalminvalsum
  3. 并行路径声明 values_glo(klon_glo[,size(values,2)]),调用 gather(values,values_glo)
  4. 仅当 is_master 为真时,对 values_glo 做 intrinsic 规约。
  5. 调用 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_redmoldiff_MPF 都对本地 H/H2/D 逃逸通量数组求总通量,输出全行星逃逸量。

写法特点

复现要点

待确认

相关页面