压力与质量算子 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.h、paramet.h。
并行版 pression_p 额外 USE parallel_lmdz,用 ij_begin-iip1 到 ij_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.h、paramet.h、comgeom.h。
注意:源码注释掉了极点质量面积加权平均的段(原用于极点一致性处理),当前活跃路径不做极点平均。
并行版 massdair_p 用 ij_begin-iip1 到 ij_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 网格的面积权重把标量点质量插值到风点:
massebx(ij,l) = masse(ij,l)*alpha1p2(ij) + masse(ij+1,l)*alpha3p4(ij+1)— 定位于 U 点(纬向风点)。masseby(ij,l) = masse(ij,l)*alpha2p3(ij) + masse(ij+iip1,l)*alpha1p4(ij+iip1)— 定位于 V 点(经向风点)。
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_p 用 ij_begin-iip1 到 ij_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.h、paramet.h、comgeom.h。
无并行变体:caldyn_p.F 中 psextbar 调用被注释掉(cym 标记),并行路径不产生 psexbarxy。
调用链路
caldyn 初始化段(一次性)
caldyn.F(串行)和 caldyn_p.F(并行)在初始化阶段调用完整五步链:
pression(ip1jmp1, ap, bp, ps, p)— 初始 3D 压力。psextbar(ps, psexbarxy)— 仅串行;并行注释掉。massdair(p, masse)— 初始空气质量。massbar(masse, massebx, masseby)— 初始 U/V 质量。massbarxy(masse, massebxy)— 初始 Z 质量。
leapfrog 主循环(反复刷新)
leapfrog.F 和 leapfrog_p.F 在主循环中每当 ps 更新后调用子集:
pression/pression_p:每次ps变化后刷新 3D 压力(约 4 处调用点:初始化、tendency 后、conservation 前、physics 后)。massdair/massdair_p:当需要质量相关量(如flumass、convmas)时刷新(约 2 处调用点)。massbar/massbarxy:主循环中不调用,仅初始化时使用。
leapfrog_nogcm
MARS phymars/leapfrog_nogcm.F 同样调用 pression 和 massdair,但不调用 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_p 用 ij_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 变体 |
复现要点
pression是所有压力相关计算的起点;ap/bp来自comvert_mod,ps是 prognostic 变量。airesurg、alpha1..alpha4、alpha1p2..alpha1p4等几何系数必须在inigeom/iniconst之后才可用。- 并行版的 halo 扩展范围意味着
pression_p和massdair_p的输出覆盖了 halo 带,调用方无需额外 halo 交换即可使用。 massbar/massbarxy只在初始化时被调用一次;后续主循环中不再刷新,因此假设massebx/masseby/massebxy在时间推进中保持不变或由其使用方自行更新。psextbar的并行缺失不影响 Mars 正常运行,因为psexbarxy在并行路径中不被使用。
待确认
psexbarxy在串行caldyn.F中的使用方需在 caldyn 文件页中追踪确认。massbar/massbarxy输出massebx/masseby/massebxy在caldyn中的使用链路需逐行确认(可能被flumass、bernoui或 tendency 组装使用)。massdair注释掉的极点面积加权平均在 Mars 配置下是否有激活路径。