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 分配 q,leapfrog*、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 识别、检查开关和映射表 | advtrac、qminimum、isotope 检查例程 |
type_trac |
character(len=4) | tracer 类型门控;非 Earth 分支被设为 plnt |
conf_gcm/conf_gcm_p 与初始化日志 |
qperemin 和 masseqmin 都是 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 初始化给出 nbtr,nqtrue=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
nqtrue 是 traceur.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=10、iadv=14 和 iadv=0,并要求 iadv=14 只用于第 1 个 tracer。因此 PPM/Prather/moments 分支在代码中保留为 contract 和历史兼容,但 Mars 当前可运行配置若触发它们会在初始化阶段被挡住。
Family 和 isotope
tnom_transp(iq) 是父子关系的来源:
| carrier | 结果 |
|---|---|
air |
tracer 直接由空气输送,iqpere(iq)=0,nqperes 加一。 |
| 已出现的 tracer 名 | 当前 tracer 是该父 tracer 的子 tracer,写入 iqpere/iqfils/nqfils。 |
| 找不到父 tracer | abort_gcm('infotrac_init','Un traceur est orphelin',1)。 |
直接子表构造完成后,源码沿父链回溯,累计 nqdesc 和 nqdesc_tot,让 Van Leer family transport 能找到全部后代。随后强制子 tracer 使用 iadv=10,有子 tracer 的父 tracer只能使用 10 或 14。
infotrac_isoinit 只按字符串规则识别水 isotope:eau、HDO、O18、O17、HTO。Mars 若没有符合命名的水同位素 family,相关表会保持空/零状态;若存在,则会检查各 phase 的 isotope 和子 tracer 数量一致,并读取 ok_iso_verif、ok_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 主链。 |
复现检查点
- 保留运行时
traceur.def,不要只记录nqtot。tname和 family 关系来自文件内容。 - Mars/planetary 缺
traceur.def会 abort;这和 Earth 默认nqtrue=4不同。 nbtr、nqtrue和nqtot不能混用。q的维度必须用nqtot。tname(:)是 restart/archive 变量名约定。旧 restart 中缺少当前 tracer 名时,可能读入零场。- 当前初始化白名单会阻止很多
advtrac中仍保留的历史 scheme;排查 PPM/Prather 是否可达时,先看infotrac_init是否允许对应iadv。 - 如果使用父子 tracer,父 tracer 必须先于子 tracer 出现在
traceur.def,且子 tracer 只能走iadv=10。 - isotope 检查不是只靠命名自动启用;
ok_iso_verif还要由getin控制。