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、advnpentes_ini 分支保留在源码中,但标准初始化通常会在进入本文件前阻断对应 iadv

文件角色

advtrac.F90 是串行动力 tracer advection 调度器,不是具体数值格式内核。它负责:

并行构建不使用本文件;对应源码是 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_tracvlconf_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 边界

复现检查点

  1. 必须连续模拟从 iadvtr=0iapp_tracvl 的多次调用;只截取最后一步会漏掉累计通量。
  2. massem 来自本轮第一个累计步,不是实际输送步的当前 masse
  3. flxwwg/iapp_tracvl,不是原始 wg
  4. nqperes 只覆盖父 tracer;子 tracer 的更新由具体内核的 family 逻辑处理。
  5. ok_iso_verif 检查不改变正常数值路径,但会引入额外输出和 abort 风险。
  6. massbar 即使在标准 iadv=10/14 路径中也会被调用;它主要服务保留 PPM 分支。
  7. CFL 诊断使用当前实参 masse,而通量 grouping 使用 massem;复现时不要混淆。
  8. iadvtrSAVE 状态,单元测试之间需要重新加载程序或显式设计调用序列。

相关页面

待确认