infotrac.F90

源码路径:LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\infotrac.F90

Mars 运行参与度:必经 + 接口兼容。Mars 3D 主运行、Mars newstart/start2archive 工具链和 1D/testphys 路径都依赖 infotrac 给出的 tracer 数量、名称、advection 标识和父子关系。3D GCM 入口调用 infotrac_init;1D/testphys 路径通过 MARS dyn1d 转发文件使用同一模块状态,但局部读取并写入 nqtot/tname/nqperes/nqfils

文件定位

infotrac 是 COMMON 动力侧 tracer 元数据模块,不做实际输送。它的核心作用是把运行目录中的 traceur.def 解析成全局 SAVE 状态,供动力数组分配、Mars physics 接口、restart/archive 变量名、history 输出和输送调度共同使用。

另有 readTracFiles_mod 这个新 tracer parser;但源码确认显示 infotrac.F90 本身没有 USE readTracFiles_mod,仍在 infotrac_init 内直接解析 traceur.def。因此本页按 infotrac.F90 现有主链说明,readTracFiles_mod 作为相邻 parser 页面处理。

公开状态

状态 维度/类型 含义 主要使用位置
nqtot integer 动力数组中的 tracer 总数,包含真实 tracer 和可能的 moments 附加条目 gcm/gcm_p 分配 qleapfrog*calfis*、restart/history 循环
nqo integer Earth/INCA 水相数;Mars/planetary 分支置 0 isotope 初始化边界
nbtr integer physics 侧 tracer/species 数;现代 planetary 格式中可包含非动态 species nqtrue 过滤和说明输出
tname(:) character restart、archive、physics 形参使用的短名 dynetat0/dynredem、Mars newstart/start2archive/lect_start_archive
ttext(:) character history/dynav 输出用长名 inithist/writehist/initdynav/writedynav
iadv(:) integer 每个动力 tracer 的输送 scheme advtrac/advtrac_p/vlspltgen_p
niadv(:) integer physics/真实 tracer 序号到动力 nqtot 序号的映射 calfis/calfis_p
nqfils/nqdesc/iqfils/iqpere arrays 父子 tracer 和全部后代表 Van Leer family transport、Mars 1D family 检查
ok_isotopes/ok_iso_verif/iqiso/index_trac mixed isotope 识别、检查开关和映射表 advtracqminimum、isotope 检查例程
type_trac character(len=4) tracer 类型门控;非 Earth 分支被设为 plnt conf_gcm/conf_gcm_p 与初始化日志

qpereminmasseqmin 都是 1.e-16,用于父子 tracer 比例输送时避免父 tracer 或质量过小导致除零。

入口例程

例程 源码范围 当前角色
infotrac_init line 74-893 主入口。读取 traceur.def,计算 nqtot,分配 tname/ttext/iadv/niadv,构造 family 和 isotope 状态。
infotrac_isoinit line 897-1096 识别水同位素命名关系,分配 iqiso/index_trac,读取 ok_iso_verif/ok_init_iso
iniadvtrac line 1102-1224 Mars/generic 旧兼容例程,源码注释称和 infotrac_init 做类似工作、待清理合并;现代 3D 主入口不以它为标准初始化路径。

初始化流程

planet_type/type_trac gate
  -> open traceur.def
  -> read nqtrue or ModernTrac-v1 nbtr + dynamic tracers
  -> read hadv/vadv/name/carrier
  -> expand nqtrue to nqtot for schemes 20/30
  -> fill tname/ttext/iadv/niadv
  -> enforce current scheme whitelist
  -> build parent/son tables
  -> detect isotope tables and getin flags

traceur.def 分支

分支 缺文件行为 读取语义
Earth lmdz/repr/coag 警告后默认 nqtrue=4 第一行为 tracer 数,后续读取 hadv/vadv/name[/carrier]
Earth inca nqo 默认 2 INCA 初始化给出 nbtrnqtrue=nbtr+nqo
Mars/planetary old format abort 第一行 nqtrue,后续可接受多种列顺序;缺省 hadv/vadv=10,缺省 carrier 为 air
Mars/planetary #ModernTrac-v1 abort 第一段读 nbtr,随后用 is_dyn=0 过滤非动态 species,再读 hadv=, vadv=, tnom_transp=

Mars/planetary 分支不能依赖 Earth 的默认 tracer 列表。复现 Mars 运行时,traceur.def 的存在性、格式和 is_dyn 标记会直接决定 nqtot

nqtrue -> nqtot

nqtruetraceur.def 给出的动态真实 tracer 数。nqtot 是动力数组真正分配的总数:

hadv/vadv nqtot 增量 后续状态
都小于 20 +1 普通 tracer。
都等于 20 +4 主 tracer 加 3 个 -20 moments 条目。
都等于 30 +10 主 tracer 加 9 个 -30 moments 条目。
一边 20/30 另一边不匹配 abort Bad choice of advection schema - 1

随后又执行白名单检查,只允许 iadv=10iadv=14iadv=0,并要求 iadv=14 只用于第 1 个 tracer。因此 PPM/Prather/moments 分支在代码中保留为 contract 和历史兼容,但 Mars 当前可运行配置若触发它们会在初始化阶段被挡住。

Family 和 isotope

tnom_transp(iq) 是父子关系的来源:

carrier 结果
air tracer 直接由空气输送,iqpere(iq)=0nqperes 加一。
已出现的 tracer 名 当前 tracer 是该父 tracer 的子 tracer,写入 iqpere/iqfils/nqfils
找不到父 tracer abort_gcm('infotrac_init','Un traceur est orphelin',1)

直接子表构造完成后,源码沿父链回溯,累计 nqdescnqdesc_tot,让 Van Leer family transport 能找到全部后代。随后强制子 tracer 使用 iadv=10,有子 tracer 的父 tracer只能使用 1014

infotrac_isoinit 只按字符串规则识别水 isotope:eauHDOO18O17HTO。Mars 若没有符合命名的水同位素 family,相关表会保持空/零状态;若存在,则会检查各 phase 的 isotope 和子 tracer 数量一致,并读取 ok_iso_verifok_init_iso

Mars 使用链路

使用方 使用内容 复现影响
dyn3d/gcm, dyn3dpar/gcm 调用 infotrac_init 后按 nqtot 分配 q tracer 维度先于 start/restart 读取确定。
dynetat0/dynredem nqtot/tname/ttext/type_trac restart 变量名由当前 tname(:) 决定;缺失 tracer 可被置零。
advtrac/advtrac_p nqtot/iadv/ok_iso_verif advection scheme 和 isotope 检查门控来自本模块。
calfis, calfis_p nqtot/niadv/tname physics tendency 与动力 tracer 序号的桥接。
history/dynav nqtot/ttext tracer 输出字段长名来自初始化结果。
Mars newstart/start2archive/lect_start_archive infotrac_init/nqtot/tname archive/restart 中 tracer 名称必须和当前配置对齐。
Mars 1D/testphys nqtot/tname/nqperes/nqfils 通过转发模块复用状态,但不走完整 infotrac_init 主链。

复现检查点

  1. 保留运行时 traceur.def,不要只记录 nqtottname 和 family 关系来自文件内容。
  2. Mars/planetary 缺 traceur.def 会 abort;这和 Earth 默认 nqtrue=4 不同。
  3. nbtrnqtruenqtot 不能混用。q 的维度必须用 nqtot
  4. tname(:) 是 restart/archive 变量名约定。旧 restart 中缺少当前 tracer 名时,可能读入零场。
  5. 当前初始化白名单会阻止很多 advtrac 中仍保留的历史 scheme;排查 PPM/Prather 是否可达时,先看 infotrac_init 是否允许对应 iadv
  6. 如果使用父子 tracer,父 tracer 必须先于子 tracer 出现在 traceur.def,且子 tracer 只能走 iadv=10
  7. isotope 检查不是只靠命名自动启用;ok_iso_verif 还要由 getin 控制。

相关页面