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 三维输送内核,由串行 advtrac 在 iadv=11/16/17/18 时调用。但当前 infotrac_init 白名单只允许 iadv=10/14/0 通过初始化检查,因此 Mars 默认配置下 PPM 路径不可达。并行 advtrac_p 用 GOTO 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 所需的格式,包含四步变换:
- 地面气压:对垂直方向积分 masse 得到柱质量
smass,psppm = smass / aire * g * 0.01(Pa → mb)。 - 风场还原:
unat = pbaru / massebx * cu,vnat = -pbarv / masseby * cv。质量通量除以质量得到速度,cu/cv是网格几何系数。经向风取反以匹配 PPM 的纬度递增方向约定。 - 垂直质量通量:
fluxw = w * g * 0.01 / aire,地面层置零。 - 垂直翻转:PPM3d 的 k=1 是大气顶,LMDZ 的 l=1 是地面。所有三维场和
ap/bp都做field_ppm(l) = field(llm-l+1)翻转。
interpost:PPM3d → LMDZ.4 格式回转
interpost 在 PPM3d 完成后执行两步:
- 垂直再翻转:
q(i,j,l) = qppm(i,j, llm-l+1),恢复 LMDZ 层序。 - 经向周期:
q(iip1,j,l) = q(1,j,l),闭合经向周期边界。PPM3d 内部不做经向周期包裹。
adaptdt:自适应子步长
adaptdt 扫描全域纬向质量通量,找到最大 CFL 数,计算子步数 n = int(CFLmax) + 1,返回子步长 dtbon = dtvr / n,保证每个子步 CFL < 1。纬度扫描排除极点 j=1 和 j=jjp1,避免奇异极区格。
核心算法流程
ppm3d 首次调用时执行初始化(L316-417):
- 打印
NASA/GSFC Transport Core Version 4.5和网格参数。 - 参数检查:
NLAY >= 6,JNP >= NLAY,j1=2 时 IMR 必须为偶数,Jmax/kmax 足够。 - 构造混合 sigma-P 层厚度系数
DAP(k) = (AP(k+1)-AP(k))*PT,DBK(k) = BP(k+1)-BP(k)。 - 计算网格几何:经向间距
DL = 2π/IMR,纬向间距DP = π/JMR,cosine 数组(IGD=0 用解析,IGD=1 用 C-Grid 一致 cosine),极冠面积倒数RCAP。 - 计算方向 Courant 数系数
DTDX/DTDY,并根据Umax估计最大允许时间步和 FFSL 切换阈值JS0/JN0。
主输送流程使用 x-y-z directional splitting,详见 ppm3d-horizontal-transport 和 ppm3d-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.F90 在 iadv=11/16/17/18 时进入 PPM 分支(L292-377),使用 interpre → ppm3d → interpost 模式,外层做 adaptdt 子步循环。
并行路径:PPM 不可达
并行 advtrac_p.F90 的结构完全不同:
- L273-274:直接调用
vlspltgen_p处理所有 tracer advection。 - L282:
GOTO 1234跳转到 L463,跳过全部 scheme-specific 代码。 - L288-460:PPM/advn/prather/pentes_ini 代码仍存在但标记为死代码。PPM 分支(L396-443)入口有
stop 'advtrac : schema non parallelise'。 - L463
1234 CONTINUE:代码在此恢复,执行qminimum_p(仅 Earth)和force_conserv_tracer守恒修正。
结论:当前 COMMON 并行构建中 PPM 路径完全不可达。只有 vlspltgen_p 承担并行 tracer 输送。
infotrac_init 白名单与 Mars 可达性
infotrac-advection-schemes 记录了 infotrac_init 最终可用性检查:
| 条件 | 结果 |
|---|---|
iadv 不是 10、14、0 |
abort,提示当前版本只测试 10 和 14 |
iadv==14 且 iq/=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 层以上需要调整。
复现要点
- 复现 PPM 输送结果需要确认
traceur.def中hadv/vadv的值。只有hadv=10, vadv=16组合产生iadv=11才能进入 PPM 路径,但当前infotrac_init会 abort。 - 若要在 Mars 运行中使用 PPM,必须修改
infotrac_init白名单或绕过最终可用性检查。 - 并行构建下无论
iadv取何值都不会调用 ppm3d,因为GOTO 1234在vlspltgen_p之后直接跳过。 interpre的垂直翻转和经向风取反是复现串行 PPM 结果的关键数值等价点。adaptdt保证水平 CFL<1,但垂直 CFL 由advtrac自行检查(L302-314)并在CFLmaxz >= 1时打印 WARNING。
相关页面
- advtrac 串并行对照
- infotrac advection scheme
- ppm3d 垂直输送
- ppm3d 水平输送
- vlspltgen_p 并行通用 Van Leer
- prather moments 输送
- advect 文件组
待确认
iadv=11路径在 LMDZ 历史版本中是否曾被 Mars 配置实际使用,需要 主页面或历史版本比对确认。ppm3d的cross标志(L300data cross /.true./)和fill参数在 LMDZ 调用中均为.true.,其对 Mars 干大气 tracer 的具体影响需子页进一步说明。