dyn3d/advtrac.F90
源码路径:LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d\advtrac.F90
Mars 运行参与度:条件经过。串行 Mars 3D 动力时间步在 leapfrog -> caladvtrac -> advtrac 链中进入本文件;只有累计步数 iadvtr == iapp_tracvl 时才真正执行 tracer advection。当前 infotrac_init 标准白名单只允许 iadv=0/10/14,因此 Mars 标准可达的串行输送主要是 Van Leer vlsplt 和第 1 个 tracer 的饱和水汽 vlspltqs 路径。PPM、Prather、advn、pentes_ini 分支保留在源码中,但标准初始化通常会在进入本文件前阻断对应 iadv。
文件角色
advtrac.F90 是串行动力 tracer advection 调度器,不是具体数值格式内核。它负责:
- 累计多个动力步的水平质量通量
pbaru/pbarv。 - 在一轮 tracer 输送的第一个动力步保存空气质量
massem。 - 到第
iapp_tracvl步时调用groupe生成 pole-grouped 通量和垂直通量wg。 - 计算
flxw、DP/P 风险诊断和每日 CFL 诊断。 - 对
iq=1,nqperes的父 tracer 按iadv(iq)选择具体输送格式。 - 在
ok_iso_verif时执行输送前后 isotope 一致性检查。 - 完成实际输送后把内部累计计数
iadvtr复位为 0。
并行构建不使用本文件;对应源码是 dyn3dpar/advtrac_p.F90 中被 leapfrog_p 调用的 advtrac_p,其当前可达数值调度集中在 vlspltgen_p。
例程清单
| 符号 | 类型 | 源码行 | 作用 |
|---|---|---|---|
advtrac |
subroutine | 3 | 串行 tracer advection 调度器;累计通量、门控输送、分派 iadv 格式。 |
文件总行数:407。
USE、include 和外部例程
| 依赖 | 符号 | 用途 |
|---|---|---|
infotrac |
nqtot, iadv, nqperes, ok_iso_verif |
tracer 数量、父 tracer 数、advection scheme 和 isotope 检查开关。 |
control_mod |
iapp_tracvl, day_step |
tracer advection 累计频率和 CFL 诊断输出周期。 |
comconst_mod |
dtvr |
动力时间步,用于 DP/P、CFL 和下游输送时间步。 |
dimensions.h, paramet.h |
ip1jmp1, ip1jm, llm, iip1, jjm 等 |
水平/垂直数组维度和网格常数。 |
comgeom2.h |
几何/网格常数 | 被下游质量平均和通量处理使用。 |
iniprint.h |
lunout, prt_level 等 |
CFL 和诊断输出。 |
minmax |
external | DP/P 范围诊断。 |
主要被调用例程:
| 例程 | 当前角色 |
|---|---|
groupe |
把累计质量通量整理成 pbarug/pbarvg/wg,并处理极区 grouping。 |
massbar |
计算 massebx/masseby,供 PPM 格式转换使用。当前标准 Mars 白名单通常阻断 PPM,但调用仍位于实际输送段内。 |
check_isotopes_seq |
ok_iso_verif 条件下,输送前后检查 isotope 一致性。 |
vlsplt |
iadv=10 标准 Van Leer split 主路径。 |
vlspltqs |
iadv=14 饱和水汽路径;当前白名单只允许第 1 个 tracer。 |
adaptdt |
为 advn/Prather/PPM 保留分支计算子步长。 |
advn |
iadv=12/13 历史 pseudo amont 格式。 |
pentes_ini |
iadv=20 slope/moments 初始化格式。 |
prather |
iadv=30 moments 格式。 |
interpre, ppm3d, interpost |
iadv=11/16/17/18 的 PPM 格式转换、输送和写回。 |
参数约定
SUBROUTINE advtrac(pbaru,pbarv,p,masse,q,iapptrac,teta,flxw,pk)| 参数 | Intent | 维度 | 说明 |
|---|---|---|---|
pbaru |
IN | (ip1jmp1,llm) |
当前动力步 U 点水平质量通量。 |
pbarv |
IN | (ip1jm,llm) |
当前动力步 V 点水平质量通量。 |
p |
IN | (ip1jmp1,llmp1) |
层界压力;饱和路径 vlspltqs 使用。 |
masse |
IN | (ip1jmp1,llm) |
当前空气质量;首个累计步复制到 massem。 |
q |
INOUT | (ip1jmp1,llm,nqtot) |
tracer mixing ratio/state;具体内核原地更新。 |
iapptrac |
OUT | scalar | 当前累计步号,等于内部 iadvtr。 |
teta |
IN | (ip1jmp1,llm) |
位温;饱和路径使用。 |
flxw |
OUT | (ip1jmp1,llm) |
实际输送轮次的垂直质量通量诊断,wg/REAL(iapp_tracvl)。 |
pk |
IN | (ip1jmp1,llm) |
Exner 相关状态;饱和路径使用。 |
注意:当 iadvtr 尚未达到 iapp_tracvl 时,本例程不会设置 flxw 新值,也不会更新 q;它只累计 pbaruc/pbarvc 并返回 iapptrac。
持久状态和工作数组
| 名称 | 属性 | 维度 | 作用 |
|---|---|---|---|
iadvtr |
SAVE, DATA 0 |
scalar | 当前 tracer advection 累计步数;达到 iapp_tracvl 后复位。 |
pbaruc, pbarvc |
SAVE |
U/V 通量维度 | 累计多个动力步的水平质量通量。 |
massem |
SAVE |
(ip1jmp1,llm) |
本轮 tracer advection 开始时的空气质量。 |
countcfl |
SAVE |
scalar | CFL 诊断累计步数,达到 day_step 时输出并清零。 |
cflxmax/cflymax/cflzmax |
SAVE |
(llm) |
每日最大 CFL 诊断缓存。 |
massebx/masseby |
local | U/V massbar 维度 | PPM 格式转换使用的质量平均。 |
qppm, fluxwppm, apppm/bpppm, unatppm/vnatppm, psppm |
local | PPM 工作维度 | interpre -> ppm3d -> interpost 保留路径使用。 |
pbaruc/pbarvc 只在 iadvtr==0 时清零;如果外部调用序列被打断,下一次调用会继续累积上一次未完成轮次的通量。
控制流
1. 初始化和累计
if iadvtr == 0:
pbaruc = 0
pbarvc = 0
for each level:
pbaruc += pbaru
pbarvc += pbarv
if iadvtr == 0:
massem = masse
iadvtr = iadvtr + 1
iapptrac = iadvtr
massem 保存的是本轮输送开始时的空气质量,之后即使后续动力步的 masse 变化,本轮 tracer advection 仍以 massem 作为输送前质量基准。
2. iapp_tracvl 门控
if iadvtr != iapp_tracvl:
return
只有门控满足时才进入实际输送。iapp_tracvl 由 conf_gcm 设置,默认等于 iperiod,也可由 getin("iapp_tracvl") 覆盖。
3. 通量整理与诊断
达到门控时:
groupe(massem,pbaruc,pbarvc) -> pbarug,pbarvg,wg
flxw = wg / REAL(iapp_tracvl)
随后源码计算每层 DP/P 估计:
zdp = pbarug(i-1)-pbarug(i) - pbarvg(j-1)+pbarvg(j) + wg(l+1)-wg(l)
zdp = zdp * dtvr / massem
if max(abs(zdpmin),abs(zdpmax)) > 0.5:
print WARNING DP/P
CFL 诊断分别按通量正负选择上游质量:
| CFL | 正通量分母 | 负通量分母 |
|---|---|---|
cflx |
masse(ij,l) |
masse(ij+1,l) |
cfly |
masse(ij,l) |
masse(ij+iip1,l) |
cflz |
masse(ij,l) |
masse(ij,l-1) |
countcfl 每次实际输送增加 iapp_tracvl;当 countcfl==day_step 时按垂直层写出 L, CFL[xyz]max,随后 countcfl=0。
4. 按 iadv 分派
实际输送前先调用 massbar(massem,massebx,masseby),然后在 ok_iso_verif 条件下检查 q。主循环只遍历 iq=1,nqperes,即由 infotrac 判定为直接由空气输送的父 tracer。
iadv(iq) |
调用链 | 当前 当前 Mars 标准可达性 |
|---|---|---|
0 |
cycle |
可达;该 tracer 不由此处输送。 |
10 |
vlsplt(q,2.,massem,wg,pbarug,pbarvg,dtvr,iq) |
标准主路径。 |
14 |
vlspltqs(q,2.,massem,wg,pbarug,pbarvg,dtvr,p,pk,teta,iq) |
仅第 1 个 tracer 可通过白名单。 |
12 |
adaptdt -> advn(...,mode=1) |
源码保留,标准白名单阻断。 |
13 |
adaptdt -> advn(...,mode=2) |
源码保留,标准白名单阻断。 |
20 |
pentes_ini(q,...) |
源码保留,标准白名单阻断。 |
30 |
adaptdt -> prather |
源码保留,标准白名单阻断。 |
11 |
adaptdt -> interpre -> ppm3d(IORD/JORD/KORD=2) -> interpost |
源码保留,标准白名单阻断。 |
16 |
adaptdt -> interpre -> ppm3d(3/3/3) -> interpost |
源码保留,标准白名单阻断。 |
17 |
adaptdt -> interpre -> ppm3d(4/4/4) -> interpost |
源码保留,标准白名单阻断。 |
18 |
adaptdt -> interpre -> ppm3d(5/5/5) -> interpost |
源码保留,标准白名单阻断。 |
循环结束后若 ok_iso_verif 为真,再执行一次 check_isotopes_seq。最后 iadvtr=0,下一次调用会开启新的累计轮次。
PPM 保留分支
PPM 分支在单文件内占用较长代码段,复现时要注意它不是直接调用 ppm3d 就结束:
adaptdt(iadv,dtbon,n,pbarug,massem)
检查垂直 CFLmaxz
interpre(q,qppm,wg,fluxwppm,massem,apppm,bpppm,massebx,masseby,pbarug,pbarvg,unatppm,vnatppm,psppm)
for indice = 1..n:
ppm3d(..., IORD,JORD,KORD by iadv)
interpost(q,qppm)
interpre/interpost 负责 LMDZ 与 PPM3d 的数组、垂直层序和通量格式转换;只测试 ppm3d 内核不能代表 advtrac 的 PPM 分支。当前 初始化通常阻断 11/16/17/18,所以这段主要用于历史兼容或本地补丁审查。
Mars 边界
- Mars 串行动力若启用 tracer,会通过
leapfrog -> caladvtrac -> advtrac条件经过本文件。 - 本文件本身不读取
planet_type;Mars/Earth 后处理差异在调用者caladvtrac中处理。 - 本文件直接使用
infotrac的nqtot/nqperes/iadv,因此traceur.def与infotrac_init是复现入口。 - 标准 Mars 可达输送格式应先按
iadv=10/14/0判断;旧格式分支存在不等于可达。 - 并行 Mars 构建应读
advtrac_p和vlspltgen_p,不要把本页的串行局部数组和循环范围套到并行 band/halo 上。
复现检查点
- 必须连续模拟从
iadvtr=0到iapp_tracvl的多次调用;只截取最后一步会漏掉累计通量。 massem来自本轮第一个累计步,不是实际输送步的当前masse。flxw是wg/iapp_tracvl,不是原始wg。nqperes只覆盖父 tracer;子 tracer 的更新由具体内核的 family 逻辑处理。ok_iso_verif检查不改变正常数值路径,但会引入额外输出和 abort 风险。massbar即使在标准iadv=10/14路径中也会被调用;它主要服务保留 PPM 分支。- CFL 诊断使用当前实参
masse,而通量 grouping 使用massem;复现时不要混淆。 iadvtr是SAVE状态,单元测试之间需要重新加载程序或显式设计调用序列。
相关页面
- caladvtrac 到 tracer advection 循环
- advtrac 串并行对照
- Transport And Advection
- infotrac
- infotrac advection schemes
- vlsplt
- vlspltqs
- ppm3d
- advn
- prather
- pentes_ini
- vlspltgen_p
待确认
- 目标 Mars 生产
traceur.def中iadv的实际分布和父子 tracer family 情况。 countcfl==day_step使用严格相等判断;若day_step不是iapp_tracvl的整数倍,CFL 日输出是否会被跳过需运行配置验证。massbar在标准iadv=10/14路径中仍被调用的性能影响,源码未说明是否有意保留。