infotrac 的 traceur.def 读取逻辑

输入范围

LMDZ.COMMON-6.3\LMDZ.COMMON\libf\dyn3d_common\infotrac.F90

Mars 运行参与度:必经。Mars 全 GCM、newstartstart2archive 都依赖 infotrac_init 给出的 tracer 列表;planetary/Mars 分支缺少 traceur.def 会直接 abort。

入口和配置门

infotrac_init 首先读取 planet_typeconfig_inca,再按 type_trac 分支。源码对 chemistry 类型有预处理宏保护:inca 需要 INCA,repr 需要 REPROBUS,coag 需要 StratAer;配置不匹配时调用 abort_gcm

分支 行为
Earth lmdz/repr/coag 打开 traceur.def,读取第一行 nqtrue;缺文件时使用默认 nqtrue=4,并设 nbtr=nqtrue-2
Earth inca/inco 读取水相数 nqo,缺省为 2;nqo 只能为 2 或 3;调用 INCA tracer 初始化得到 nbtrnqtrue=nbtr+nqo
非 Earth / planetary 必须打开 traceur.def;缺文件 abort;识别旧格式或 #ModernTrac-v1 现代格式

旧格式

非现代格式把第一条有效行解释为 tracer 数。随后每个 tracer 行用类似格式读取:

READ(90,'(I2,X,I2,X,A)',IOSTAT=IOstatus) hadv(iq), vadv(iq), tchaine

hadv/vadv 分别给水平和垂直 advection 标识。tchaine 中可能只有 tracer 名,也可能包含 tracer 名和 carrier 名。若没有显式 carrier,旧格式分支会保持向后兼容,把 tracer 视为直接由空气输送或按旧逻辑补全。

ModernTrac-v1

planetary 分支先读第一行;如果等于 #ModernTrac-v1,则进入现代格式:

  1. 跳过以 # 开头的 header/comment。
  2. 读取 nbtr,这里表示 physics 认为的 species/tracer 总数,可能包含非动态 species。
  3. 后续读取每个 tracer 的字段和 flag,并据此确定哪些进入动态输送,最终再得到 nqtrue

现代格式的关键影响是:nbtr 不再等同于动力数组维度,nqtrue 是按动态 flag 过滤后的真实输送 tracer 数。

缺文件与错误处理

场景 行为
Earth lmdz/repr/coagtraceur.def 只警告,使用默认 nqtrue=4
Earth INCA 缺 traceur.def 使用默认 nqo=2
planetary/Mars 缺 traceur.def abort_gcm(modname,"file traceur.def not found!",1)
Earth 分支 nqtrue<2 abort,至少需要 2 个 tracer
行格式无法读取 hadv/vadv/tchaine abort,提示读取 traceur.def 出错
ModernTrac-v1 找不到 tracer 数 abort,提示无法读取 tracer 数

读取后的状态

读取阶段得到的是中间数组:

临时状态 用途
tnom_0(iq) 原始 tracer 名
tnom_transp(iq) carrier/父 tracer 名,air 表示父 tracer
hadv(iq) 水平方向 scheme
vadv(iq) 垂直方向 scheme
nqtrue 未展开 moments 前的真实动态 tracer 数

后续 nqtrue 会经过 scheme 扩展成为 nqtot,再写入全局 tname/ttext/iadv/niadv

复现要点

待确认

相关页面