COMMON tracer advection schemes

源码范围:

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\prather.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\ppm3d.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\pentes_ini.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\interpre.F
LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\interpost.F

Mars 运行参与度:条件经过 + 历史兼容。这些是串行 advtrac.F90 中保留的高阶或历史 tracer 输送方案支撑文件:iadv=20pentes_iniiadv=30pratheriadv=11/16/17/18interpre -> ppm3d -> interpost。当前 infotrac_init 标准白名单只允许 iadv=0/10/14,因此 Mars 标准配置通常不会到达这些分支;它们主要用于解释保留源码、历史配置或本地补丁风险。

方案选择表

iadv 方案 串行 advtrac 调用链 当前 Mars 标准状态
10 Van Leer split vlsplt 标准主路径,不属于本页高阶集合。
14 饱和水汽 Van Leer vlspltqs 只允许第 1 tracer,不属于本页高阶集合。
20 slope / moments 初始化 pentes_ini 源码保留,标准白名单阻断。
30 Prather moments adaptdt -> prather 源码保留,标准白名单阻断。
11 VL/PPM 兼容映射 adaptdt -> interpre -> ppm3d(2/2/2) -> interpost 源码保留,标准白名单阻断。
16 monotonic PPM adaptdt -> interpre -> ppm3d(3/3/3) -> interpost 源码保留,标准白名单阻断。
17 semi-monotonic PPM adaptdt -> interpre -> ppm3d(4/4/4) -> interpost 源码保留,标准白名单阻断。
18 positive-definite PPM adaptdt -> interpre -> ppm3d(5/5/5) -> interpost 源码保留,标准白名单阻断。

并行 advtrac_p.F90 当前先调用 vlspltgen_p(q,iadv,...),再 GOTO 1234 跳过 PPM、Prather、pentes 和 advn 等 scheme-specific 保留分支。因此本页只描述串行可读路径;并行标准路径应从 vlspltgen_pvlsplt_p 阅读。

文件职责

文件 行数 职责
pentes_ini.F 479 构造 SM/S0/sx/sy/sz moments 工作表示,调 limx/limy/limzadvx/advy/advz 做 x-y-z-y-x 预输送。
prather.F 362 使用 q(...,0:9) 的 10 个 Prather moments,按 advxp/advyp/advzp 做 x-y-z-y-x split。
ppm3d.F 2078 NASA/GSFC Lin & Rood PPM 三维输送核心;需要 LMDZ 格式转换层包裹。
interpre.F 129 LMDZ -> PPM3d 格式转换:地面压强、风速、垂直通量、ap/bp 和层序翻转。
interpost.F 43 PPM3d -> LMDZ 格式回转:垂直层序翻回和经向周期闭合。

pentes_ini: slope / moments 预输送

pentes_iniiadv=20 分支的入口。它不是独立完整长期输送格式,而是把 tracer 转成 moments 工作数组,并用 limiter + directional advection 做一次对称预输送:

prepare SM/S0/sx/sy/sz from q and masse
limx -> advx(0.5*dtvr)
limy -> advy(0.5*dtvr)
limz -> advz(dtvr)
limy -> advy(0.5*dtvr)
limx -> advx(0.5*dtvr)
write back state/slopes

它调用的外部 advx/advy/advz moments 算子详见 COMMON tracer advection operator family。这些例程与 advn.F 内部的 advnx/advny/advnz 不同。

Prather: 10 moments 输送

prather.Fiadv=30 分支中被 advtrac 调用。调用前先通过 adaptdt 计算子步数 ndtbon,随后:

prather(q(1,1,iq), wg, massem, pbarug, pbarvg, n, dtbon)

Prather 的核心接口把 tracer 表示成 10 个 moments:

若只保留 q(...,0),就无法复现 Prather scheme;moments 维度是方案定义的一部分。

PPM: LMDZ wrapper + NASA core

PPM 分支是本集合里接口层最厚的一条路径。串行 advtrac 的实际结构是:

adaptdt(iadv,dtbon,n,pbarug,massem)
vertical CFL warning check
interpre(q,qppm,wg,fluxwppm,massem,apppm,bpppm,massebx,masseby,pbarug,pbarvg,unatppm,vnatppm,psppm)
for indice = 1..n:
  ppm3d(1,qppm,psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon,
        IORD,JORD,KORD,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
interpost(q,qppm)

interpre

interpre 负责把 LMDZ 动力状态变成 PPM3d 需要的变量:

输出 公式或处理 说明
psppm sum_l(masse) / aire * g * 0.01 地面压强,单位从 Pa 转 mb。
unatppm pbaru / massebx * cu 后垂直翻转 从 U 质量通量还原纬向风。
vnatppm -pbarv / masseby * cv 后垂直翻转 经向风取反以适配 PPM 纬度方向。
fluxwppm w * g * 0.01 / aire 后垂直翻转 垂直质量通量格式转换。
qppm q(:,:,llm-l+1) PPM3d 的第 1 层是大气顶。
apppm/bpppm ap/bp(llm+2-l) 混合坐标系数翻转。

interpost

interpost 很短,但对数值等价是硬要求:

q(i,j,l) = qppm(i,j,llm-l+1)
q(iip1,j,l) = q(1,j,l)

也就是先把 PPM3d 层序翻回 LMDZ,再补上经向周期边界。若单独调用 ppm3d 而不做 interpost,输出不等价于 LMDZ advtrac 分支。

可达性和白名单

当前 infotrac_init 对最终 iadv(:) 做强检查:

因此 20/30/11/16/17/18 在标准 初始化阶段就会 abort_gcm。这些源码在 wiki 中仍需记录,因为:

复现检查点

  1. 先确认 infotrac_init 是否允许目标 iadv;不要只看 advtrac 是否有下游分支。
  2. PPM 路径必须完整复现 adaptdt -> interpre -> ppm3d -> interpost,不能只调用 ppm3d
  3. interpre 的经向风取反和垂直层序翻转是 PPM 结果等价的关键。
  4. Prather 必须保留 0:9 moments;q(...,0) 只是平均量。
  5. pentes_ini 使用 SM/S0/sx/sy/sz moments 工作数组,并在每个方向输送前调用 limiter。
  6. 并行 advtrac_p 的旧 scheme-specific 分支在 GOTO 1234 后不可达。
  7. adaptdt 只按水平 pbaru 切子步;PPM 垂直 CFL 只打印 warning。

相关页面

待确认