压力与质量算子 family

输入范围

dyn3d_common\pression.F90
dyn3d_common\massdair.F
dyn3d_common\massbar.F90
dyn3d_common\massbarxy.F90
dyn3d_common\psextbar.F
dyn3dpar\pression_p.F
dyn3dpar\massdair_p.F
dyn3dpar\massbar_p.F
dyn3dpar\massbarxy_p.F

Mars 运行参与度:必经。每次 ps 更新后都需要重新计算压力和空气质量;massbar/massbarxy 在初始化阶段必经,psextbar 仅串行初始化调用。

例程定位

这组短算子从地表压力 ps 和混合坐标系数 ap/bp 出发,依次构造 3D 压力场 p、每层空气质量 masse、质量在 U/V/Z 点的加权平均 massebx/masseby/massebxy 以及地表压力面积加权平均 psexbarxy。它们是 caldyn 初始化段和 leapfrog 主循环中压力/质量刷新的基础,被动力 tendency、能量诊断和耗散链路使用。

对照表

文件 行数 角色 并行变体
pression.F90 27 ap/bp/ps 计算层界压力 p pression_p.F(40 行)
massdair.F 108 从层界压力计算每层空气质量 masse massdair_p.F(119 行)
massbar.F90 66 质量在 U 和 V 点的加权平均 massbar_p.F(116 行)
massbarxy.F90 31 质量在 Z 点的四邻加权平均 massbarxy_p.F(54 行)
psextbar.F 108 地表压力面积加权在 Z 点的平均 _p 变体

核心流程

pression:层界压力

SUBROUTINE pression( ngrid, ap, bp, ps, p )
INTEGER, INTENT(IN)  :: ngrid
REAL,    INTENT(IN)  :: ap(llmp1), bp(llmp1), ps(ngrid)
REAL,    INTENT(OUT) :: p(ngrid,llmp1)

公式:p(:,l) = ap(l) + bp(l) * ps(:),对 l=1..llmp1 逐层计算。l=1 对应地表(p=ps),l=llm+1 对应模式顶(p=0,因为 ap(llmp1)=0, bp(llmp1)=0)。

Include:dimensions.hparamet.h

并行版 pression_p 额外 USE parallel_lmdz,用 ij_begin-iip1ij_end+2*iip1 的子域范围扩展(保证 halo 带也有压力值),极点处缩减到 ij_begin/ij_end。OMP DO 调度。

massdair:每层空气质量

SUBROUTINE massdair( p, masse )
REAL p(ip1jmp1,llmp1), masse(ip1jmp1,llm)

公式:masse(ij,l) = airesurg(ij) * (p(ij,l) - p(ij,l+1))。使用 airesurg(来自 comgeom.h,由 inigeom 初始化)把压力差转为质量。每层循环后做周期边界复制:masse(ij+iim,l) = masse(ij,l) 把第一列复制到 iip1 列。

Include:dimensions.hparamet.hcomgeom.h

注意:源码注释掉了极点质量面积加权平均的段(原用于极点一致性处理),当前活跃路径不做极点平均。

并行版 massdair_pij_begin-iip1ij_end+2*iip1 的扩展子域,极点缩减。OMP DO 调度。

massbar:U/V 点质量平均

SUBROUTINE massbar( masse, massebx, masseby )
REAL, INTENT(IN)  :: masse(ip1jmp1,llm)
REAL, INTENT(OUT) :: massebx(ip1jmp1,llm)
REAL, INTENT(OUT) :: masseby(ip1jm,llm)

按 C-grid staggered 网格的面积权重把标量点质量插值到风点:

alpha1p2/alpha3p4/alpha2p3/alpha1p4 来自 comgeom.h,由 iniconst/inigeom 初始化的面积权重组合系数。

周期边界修正:massebx(iip1,j) = massebx(1,j)

并行版 massbar_p 按子域范围执行,极点条件缩减。OMP DO 调度。

massbarxy:Z 点质量平均

SUBROUTINE massbarxy( masse, massebxy )
REAL, INTENT(IN)  :: masse(ip1jmp1,llm)
REAL, INTENT(OUT) :: massebxy(ip1jm,llm)

四邻加权:massebxy(ij,l) = masse(ij,l)*alpha2(ij) + masse(ij+1,l)*alpha3(ij+1) + masse(ij+iip1,l)*alpha1(ij+iip1) + masse(ij+iip2,l)*alpha4(ij+iip2)。定位于 Z 点(涡度/角点)。

使用原始 alpha1/alpha2/alpha3/alpha4(来自 comgeom.h),不是组合系数。周期边界修正同 massbar

并行版 massbarxy_pij_begin-iip1ij_end,极点各缩减 iip1。OMP DO 调度。

psextbar:地表压力面积加权平均

SUBROUTINE psextbar( ps, psexbarxy )
REAL ps(ip1jmp1), psexbarxy(ip1jm), pext(ip1jmp1)

先计算 pext(ij) = ps(ij) * aire(ij),再做四邻加权平均到 Z 点:psexbarxy(ij) = pext(ij)*alpha2(ij) + pext(ij+1)*alpha3(ij+1) + pext(ij+iip1)*alpha1(ij+iip1) + pext(ij+iip2)*alpha4(ij+iip2)

周期边界修正同上。

Include:dimensions.hparamet.hcomgeom.h

无并行变体caldyn_p.Fpsextbar 调用被注释掉(cym 标记),并行路径不产生 psexbarxy

调用链路

caldyn 初始化段(一次性)

caldyn.F(串行)和 caldyn_p.F(并行)在初始化阶段调用完整五步链:

  1. pression(ip1jmp1, ap, bp, ps, p) — 初始 3D 压力。
  2. psextbar(ps, psexbarxy) — 仅串行;并行注释掉。
  3. massdair(p, masse) — 初始空气质量。
  4. massbar(masse, massebx, masseby) — 初始 U/V 质量。
  5. massbarxy(masse, massebxy) — 初始 Z 质量。

leapfrog 主循环(反复刷新)

leapfrog.Fleapfrog_p.F 在主循环中每当 ps 更新后调用子集:

leapfrog_nogcm

MARS phymars/leapfrog_nogcm.F 同样调用 pressionmassdair,但不调用 massbar/massbarxy/psextbar(因为不走完整 caldyn 初始化路径)。

网格位置和面积权重

所有面积权重系数由 inigeom/iniconst 初始化并存储在 comgeom.h 中。C-grid staggered 网格的约定:

输出 网格位置 系数 用途
massebx U 点 alpha1p2, alpha3p4 纬向质量通量
masseby V 点 alpha2p3, alpha1p4 经向质量通量
massebxy Z 点 alpha1, alpha2, alpha3, alpha4 涡度/角点质量
psexbarxy Z 点 alpha1, alpha2, alpha3, alpha4 地表压力角点平均

alpha1(i,j) = aire(i+1/4,j-1/4) / aire(i,j) 等四个系数分别对应四个象限的面积比。组合系数如 alpha1p2 = alpha1 + alpha2 是两个相邻象限的和。

串并行差异

差异点 串行 并行
子域 全范围 1..ip1jmp1 ij_begin/ij_end 子域
halo 扩展 pression_p/massdair_pij_begin-iip1..ij_end+2*iip1 覆盖 halo 带
极点处理 massdair 无极点平均(注释掉) pole_nord/pole_sud 条件缩减排量范围
OMP 全部带 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
psextbar 有调用 caldyn_p.F 注释掉,无 _p 变体

复现要点

待确认

相关页面