ppm3d 入口约定与串并行可达性

输入范围

dyn3d_common\ppm3d.F
dyn3d\advtrac.F90
dyn3dpar\advtrac_p.F90
dyn3d_common\interpre.F
dyn3d_common\interpost.F
dyn3d_common\adaptdt.F

Mars 运行参与度:条件经过ppm3d 是 Lin & Rood PPM 三维输送内核,由串行 advtraciadv=11/16/17/18 时调用。但当前 infotrac_init 白名单只允许 iadv=10/14/0 通过初始化检查,因此 Mars 默认配置下 PPM 路径不可达。并行 advtrac_pGOTO 1234 跳过全部 scheme-specific 代码,只用 vlspltgen_p 处理所有 advection。

例程定位

ppm3d 是 NASA/GSFC Transport Core Version 4.5 的 Fortran 77 输送内核,2078 行。它实现 Lin & Rood 的 Piece-wise Parabolic Method,支持 E-W/N-S/vertical 三方向多阶单调性选项。LMDZ 通过 interpre/interpost 做格点格式互转,通过 adaptdt 做自适应子步长保证 CFL<1。

ppm3d 签名

subroutine ppm3d(IGD, Q, PS1, PS2, U, V, W, NDT,
     &           IORD, JORD, KORD, NC, IMR, JNP, j1, NLAY,
     &           AP, BP, PT, AE, fill, dum, Umax)
参数 类型 方向 LMDZ 调用值 说明
IGD integer IN 1 网格类型。0=A-Grid,1=GEOS C-Grid(LMDZ 使用)。
Q real(IMR,JNP,NLAY,NC) INOUT 单 tracer 混合比,入口为当前值,出口为 t+NDT 值。
PS1 real(IMR,JNP) IN psppm t 时刻地面气压。
PS2 real(IMR,JNP) INOUT psppm t+NDT 时刻地面气压(由质量连续方程更新)。
U real(IMR,JNP,NLAY) IN unatppm C-Grid 纬向风速(m/s),mid-time-level。
V real(IMR,JNP,NLAY) IN vnatppm C-Grid 经向风速(m/s),mid-time-level。
W real(IMR,JNP,NLAY) IN fluxwppm 垂直质量通量,单位与 PS 一致。
NDT real IN dtbon 时间步长(秒)。
IORD integer IN 2/3/4/5 E-W 方向阶数选项。
JORD integer IN 2/3/4/5 N-S 方向阶数选项。
KORD integer IN 2/3/4/5 垂直方向阶数选项。
NC integer IN 1 tracer 个数。LMDZ 逐 tracer 调用。
IMR integer IN iim 经向格点数。必须为偶数(j1=2 时)。
JNP integer IN jjp1 纬向格点数(含极点)。
j1 integer IN 2 极冠大小参数。LMDZ 使用 j1=2。
NLAY integer IN llm 垂直层数。必须 >= 6。
AP real(NLAY+1) IN apppm 混合 sigma-P 坐标 A 系数(翻转后)。
BP real(NLAY+1) IN bpppm 混合 sigma-P 坐标 B 系数(翻转后)。
PT real IN 0.01 参考气压(mb)。
AE real IN 6400000 球体半径(m)。LMDZ 使用 6.4E6。
fill logical IN .true. 是否做负值填充。
dum logical IN .true. 交叉极区填充标志。
Umax real IN 220. 最大风速估计上限(m/s)。

IORD/JORD/KORD 方案选项

源码 L182-197 文档化六个选项:

_ORD 含义 隐式扩散 适用场景
1 一阶上游(过于扩散,调试用) 最大 唯一线性单调格式
2 二阶 van Leer(全单调约束) 较大 正定标量
3 单调 PPM(Colella & Woodward 1984 改进版) 中等 正定标量推荐
4 半单调 PPM(允许过冲) 较小 不用于非正定标量
5 正定 PPM(仅防止负值) 较小 需显式扩散配合
6 无约束 PPM(近无扩散) 最小 仅用于极平滑场

LMDZ 调用映射:

iadv IORD/JORD/KORD 方案名称 说明
11 2,2,2 VL 水平 + PPM 垂直 水平用 van Leer,垂直用 PPM
16 3,3,3 Monotonic PPM 全方向单调 PPM
17 4,4,4 Semi-Monotonic PPM 允许过冲
18 5,5,5 Positive-Definite PPM 仅防负值

注意:源码 L199 明确注明 KORD <= 2 不再支持,且选项 4/5 不得用于非正定标量(如 Ertel 位涡)。

接口层

interpre:LMDZ.4 → PPM3d 格式转换

interpre 把 LMDZ 的质量通量、tracer 和气压场转为 PPM3d 所需的格式,包含四步变换:

  1. 地面气压:对垂直方向积分 masse 得到柱质量 smasspsppm = smass / aire * g * 0.01(Pa → mb)。
  2. 风场还原unat = pbaru / massebx * cuvnat = -pbarv / masseby * cv。质量通量除以质量得到速度,cu/cv 是网格几何系数。经向风取反以匹配 PPM 的纬度递增方向约定。
  3. 垂直质量通量fluxw = w * g * 0.01 / aire,地面层置零。
  4. 垂直翻转:PPM3d 的 k=1 是大气顶,LMDZ 的 l=1 是地面。所有三维场和 ap/bp 都做 field_ppm(l) = field(llm-l+1) 翻转。

interpost:PPM3d → LMDZ.4 格式回转

interpost 在 PPM3d 完成后执行两步:

  1. 垂直再翻转q(i,j,l) = qppm(i,j, llm-l+1),恢复 LMDZ 层序。
  2. 经向周期q(iip1,j,l) = q(1,j,l),闭合经向周期边界。PPM3d 内部不做经向周期包裹。

adaptdt:自适应子步长

adaptdt 扫描全域纬向质量通量,找到最大 CFL 数,计算子步数 n = int(CFLmax) + 1,返回子步长 dtbon = dtvr / n,保证每个子步 CFL < 1。纬度扫描排除极点 j=1j=jjp1,避免奇异极区格。

核心算法流程

ppm3d 首次调用时执行初始化(L316-417):

  1. 打印 NASA/GSFC Transport Core Version 4.5 和网格参数。
  2. 参数检查:NLAY >= 6JNP >= NLAY,j1=2 时 IMR 必须为偶数,Jmax/kmax 足够。
  3. 构造混合 sigma-P 层厚度系数 DAP(k) = (AP(k+1)-AP(k))*PTDBK(k) = BP(k+1)-BP(k)
  4. 计算网格几何:经向间距 DL = 2π/IMR,纬向间距 DP = π/JMR,cosine 数组(IGD=0 用解析,IGD=1 用 C-Grid 一致 cosine),极冠面积倒数 RCAP
  5. 计算方向 Courant 数系数 DTDX/DTDY,并根据 Umax 估计最大允许时间步和 FFSL 切换阈值 JS0/JN0

主输送流程使用 x-y-z directional splitting,详见 ppm3d-horizontal-transportppm3d-vertical-transport

串行调用链

advtrac.F90
  ├─ groupe(...)                    # 质量通量准备
  ├─ massbar(...)                   # staggered 质量平均
  ├─ adaptdt(iadv, dtbon, n, ...)   # 自适应子步长
  ├─ interpre(q, qppm, ...)         # LMDZ → PPM 格式
  ├─ do indice=1,n
  │   └─ ppm3d(1, qppm, ...)       # PPM 输送内核
  ├─ interpost(q, qppm)             # PPM → LMDZ 格式
  └─ ...

串行 advtrac.F90iadv=11/16/17/18 时进入 PPM 分支(L292-377),使用 interpre → ppm3d → interpost 模式,外层做 adaptdt 子步循环。

并行路径:PPM 不可达

并行 advtrac_p.F90 的结构完全不同:

  1. L273-274:直接调用 vlspltgen_p 处理所有 tracer advection。
  2. L282:GOTO 1234 跳转到 L463,跳过全部 scheme-specific 代码
  3. L288-460:PPM/advn/prather/pentes_ini 代码仍存在但标记为死代码。PPM 分支(L396-443)入口有 stop 'advtrac : schema non parallelise'
  4. L463 1234 CONTINUE:代码在此恢复,执行 qminimum_p(仅 Earth)和 force_conserv_tracer 守恒修正。

结论:当前 COMMON 并行构建中 PPM 路径完全不可达。只有 vlspltgen_p 承担并行 tracer 输送。

infotrac_init 白名单与 Mars 可达性

infotrac-advection-schemes 记录了 infotrac_init 最终可用性检查:

条件 结果
iadv 不是 10140 abort,提示当前版本只测试 1014
iadv==14iq/=1 abort,14 只允许水汽

因此 PPM 方案(iadv=11/16/17/18)在当前版本初始化阶段就会被 abort。即使 advtrac 中存在完整 PPM 调用路径,Mars 默认配置下不会到达。PPM 代码在当前 COMMON 中属于历史遗留但未删除的状态。

分辨率限制

ppm3d 内部使用静态数组(L272、L297-298):

参数 说明
Jmax 361 最大纬向格点数
kmax 150 最大垂直层数

超过这些限制需要修改 ppm3d.F 源码中的 parameter 声明。L246 注释提到 0.5 度 N-S 分辨率或 150 层以上需要调整。

复现要点

  1. 复现 PPM 输送结果需要确认 traceur.defhadv/vadv 的值。只有 hadv=10, vadv=16 组合产生 iadv=11 才能进入 PPM 路径,但当前 infotrac_init 会 abort。
  2. 若要在 Mars 运行中使用 PPM,必须修改 infotrac_init 白名单或绕过最终可用性检查。
  3. 并行构建下无论 iadv 取何值都不会调用 ppm3d,因为 GOTO 1234vlspltgen_p 之后直接跳过。
  4. interpre 的垂直翻转和经向风取反是复现串行 PPM 结果的关键数值等价点。
  5. adaptdt 保证水平 CFL<1,但垂直 CFL 由 advtrac 自行检查(L302-314)并在 CFLmaxz >= 1 时打印 WARNING。

相关页面

待确认