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=20 调 pentes_ini,iadv=30 调 prather,iadv=11/16/17/18 走 interpre -> 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_p 和 vlsplt_p 阅读。
文件职责
| 文件 | 行数 | 职责 |
|---|---|---|
pentes_ini.F |
479 | 构造 SM/S0/sx/sy/sz moments 工作表示,调 limx/limy/limz 和 advx/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_ini 是 iadv=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.F 在 iadv=30 分支中被 advtrac 调用。调用前先通过 adaptdt 计算子步数 n 和 dtbon,随后:
prather(q(1,1,iq), wg, massem, pbarug, pbarvg, n, dtbon)
Prather 的核心接口把 tracer 表示成 10 个 moments:
q(...,0)是平均 tracer。q(...,1:9)是单元内分布 moments。- x/y 用半步,z 用整步,再 y/x 半步收尾。
- 底层方向例程是
advxp/advyp/advzp,不是pentes_ini的advx/advy/advz。
若只保留 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(:) 做强检查:
- 只允许
iadv=10、14或0。 iadv=14只允许第 1 个 tracer。- 父子 tracer 还要求子 tracer 使用
10,父 tracer 使用10或14。
因此 20/30/11/16/17/18 在标准 初始化阶段就会 abort_gcm。这些源码在 wiki 中仍需记录,因为:
- 旧版运行或本地补丁可能放宽白名单。
- 文件仍参与编译/维护成本和误读风险。
advtrac.F90内的分支文本需要有出处解释。
复现检查点
- 先确认
infotrac_init是否允许目标iadv;不要只看advtrac是否有下游分支。 - PPM 路径必须完整复现
adaptdt -> interpre -> ppm3d -> interpost,不能只调用ppm3d。 interpre的经向风取反和垂直层序翻转是 PPM 结果等价的关键。- Prather 必须保留
0:9moments;q(...,0)只是平均量。 pentes_ini使用SM/S0/sx/sy/szmoments 工作数组,并在每个方向输送前调用 limiter。- 并行
advtrac_p的旧 scheme-specific 分支在GOTO 1234后不可达。 adaptdt只按水平pbaru切子步;PPM 垂直 CFL 只打印 warning。
相关页面
- dyn3d/advtrac
- Transport And Advection
- COMMON tracer advection operator family
- ppm3d
- ppm3d 入口约定
- prather
- pentes_ini
- infotrac advection schemes
待确认
- 是否存在目标 Mars 生产分支放宽了
infotrac_init白名单并重新启用20/30/11/16/17/18。 iadv=11在 Mars 历史配置中是否实际使用过,需要历史版本或运行配置证据。- PPM
fill=.true.负值填充对 Mars tracer 质量守恒的影响需要运行样例验证。