dyn1d/infotrac.F90
路径
LMDZ.MARS\libf\phymars\dyn1d\infotrac.F90
文件定位
dyn1d/infotrac.F90 在当前源码树中不是独立实现,而是一行相对路径:
../../../../LMDZ.COMMON/libf/dyn3d_common/infotrac.F90
它把 dyn1d 编译路径中的 infotrac 模块解析到公共动力 tracer 信息模块。目标模块保存 tracer 数量、名字、advection schema、父子 tracer 关系和同位素索引。当前 1D 初始化并不调用公共 infotrac_init,而是在 init_testphys1d_mod.F90 中直接读取 traceur.def,写入 infotrac::nqtot/tname/nqperes/nqfils,再把这些名字交给 tracer_mod::initracer、profile 读取和 physiq。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
infotrac.F90 |
path stub | dyn1d line 1 | 指向 LMDZ.COMMON/libf/dyn3d_common/infotrac.F90。 |
infotrac |
module | common target line 3 | 保存 tracer 元数据、advection schema、父子关系和同位素索引。 |
infotrac_init |
subroutine | common target line 82 | 公共 3D tracer 初始化;读取 traceur.def/modern planetary traceur.def,构造 tname/ttext/iadv/niadv 等。 |
infotrac_isoinit |
subroutine | common target line after infotrac_init |
识别 HDO/O18/O17/HTO 等同位素 tracer 并填充同位素索引。 |
iniadvtrac |
subroutine | common target tail | Mars/generic 旧式 tracer 名和 Van-Leer advection 初始化辅助。 |
关键模块状态
| 状态 | 类型 | 含义 |
|---|---|---|
nqtot |
integer | 动力侧总 tracer 数,包括高阶矩扩展。dyn1d 简化路径直接令 nqtot=nq。 |
nbtr, nqo |
integer | 物理 tracer 数和水相 tracer 数;公共 infotrac_init 中使用。 |
tname(:) |
allocatable character | tracer 短名,供 restart、profile 读取和诊断使用。 |
ttext(:) |
allocatable character | 带 advection schema 后缀的诊断长名;dyn1d 简化路径未分配/填充。 |
iadv(:), niadv(:) |
allocatable integer | tracer advection schema 和 true/expanded tracer 对应关系;dyn1d 简化路径未使用。 |
nqperes, nqfils(:), iqfils(:,:), iqpere(:), nqdesc(:) |
tracer family state | 父 tracer、子 tracer 和多代后代关系。dyn1d 简化路径只分配并填充 nqfils 和 nqperes。 |
qperemin, masseqmin |
parameters | 同位素 ratio 输运阈值,均为 1.e-16。 |
ok_isotopes, iqiso, iso_num, phase_num, index_trac 等 |
isotope state | 公共同位素识别和索引状态;dyn1d 简化路径没有调用 infotrac_isoinit。 |
dyn1d 初始化路径
init_testphys1d_mod.F90 第 19 行:
use infotrac, only: nqtot, tname, nqperes, nqfils实际 1D 读取流程在第 177-250 行:
- 打开
traceur.def;若缺失,打印错误并error stop。 - 读取第一行到
nq,同时执行nqtot = nq。 - 检查
nq >= 1。 - 分配
tname(nq)、q(1,nlayer,nq)、dq(1,nlayer,nq)、dqdyn(1,nlayer,nq)、tnom_transp(nq)等数组。 - 对每个 tracer 读取一整行:
- 尝试按
tname(iq), tnom_transp(iq)解析,用于同位素或携带流体关系。 - 如果两列解析失败,只读取
tname(iq),并设置tnom_transp(iq)='air'。
- 尝试按
- 分配
nqfils(nqtot),遍历所有 tracer:tnom_transp=='air'视为父 tracer,nqperes加 1。- 否则向前搜索名字等于
tnom_transp(iq)的父 tracer,找到后给父 tracer 的nqfils加 1。 - 若搜索超过
nqtot,调用abort_gcm('infotrac_init','Un traceur est orphelin',1)。
这个 1D 流程没有读取 advection schema,也没有构造 ttext/iadv/niadv/iqpere/iqfils/nqdesc。
与 tracer_mod 的关系
1D 初始化后还会调用 initracer(ngrid,nq)。tracer_mod.F90 会重新寻找 traceur.def;若缺失,再寻找 tracer.def。它通过 parse_traceur_file 或 parse_tracer_file 建立物理侧 noms(:)、nqparents、nqchildren 和 igcm_* 索引。
因此 dyn1d 里存在两条相关但不完全相同的 tracer 解析链:
| 链路 | 读取方 | 主要输出 |
|---|---|---|
| 1D 初始数组链 | init_testphys1d_mod.F90 直接读 traceur.def |
nq, infotrac::nqtot, infotrac::tname, q/dq/dqdyn, nqperes/nqfils。 |
| 物理索引链 | tracer_mod::initracer |
tracer_mod::noms, igcm_h2o_vap/ice、尘埃/CO2/化学等物理索引。 |
复现时这两条链路必须看到同一套 tracer 名,否则 read_profile、physiq 和后续物理索引会不一致。
使用方
| 文件 | 使用符号 | 作用 |
|---|---|---|
init_testphys1d_mod.F90 |
nqtot, tname, nqperes, nqfils |
读取 traceur.def、分配 1D tracer 数组、建立简化父子关系。 |
read_profile_mod.F90 |
tname |
把 traceur.def 中的 tracer 名复制到 name_tracer,查找 h2o_vap/h2o_ice/hdo_vap/hdo_ice/dust_* 等 profile 输入目标。 |
testphys1d.F90 |
经 q/nq/noms 使用 |
把 tracer 数组传入 physiq,并在 restart 写出时传入 noms。 |
公共 3D 使用方还包括 infotrac_init 的调用路径和公共动力 tracer 平流,但当前 dyn1d 文件中未发现直接调用 infotrac_init。
输入格式
dyn1d 简化读取期望旧式 traceur.def:
<nq>
<tracer_name_1> [transporting_fluid_1]
<tracer_name_2> [transporting_fluid_2]
...
其中第二列可选;缺省为 air。若第二列不是 air,必须等于某个已声明 tracer 名,否则视为孤儿 tracer 并中止。
公共 infotrac_init 对非 Earth 还支持 #ModernTrac-v1 header 的 modern planetary traceur.def,但 dyn1d 简化读取路径没有识别该 header 的代码。
副作用和 I/O
| 项目 | 说明 |
|---|---|
| 文件 I/O | dyn1d 初始化读取 traceur.def;缺失时 error stop。公共 infotrac_init 也读取 traceur.def。 |
| 分配 | dyn1d 分配 infotrac::tname(nq) 和 nqfils(nqtot);公共 infotrac_init 会分配更多状态数组。 |
| 全局状态 | nqtot/tname/nqperes/nqfils 会被 1D 初始化写入,并供 profile 读取使用。 |
| 程序控制 | 缺 traceur.def、第一行读失败、nq<1、孤儿 tracer 都会中止。 |
复现要点
- dyn1d 必须提供
traceur.def;与 3Dtracer_mod可以回退到tracer.def不同,init_testphys1d_mod缺traceur.def会直接停止。 traceur.def首行数量必须等于后续 tracer 行数,且名称顺序会决定q(:,:,iq)和 profile/restart 对应关系。- 带第二列的子 tracer 必须写在父 tracer 之后可被搜索到的位置;否则触发孤儿 tracer 中止。
- 若使用 modern
tracer.def或#ModernTrac-v1,需要确认 dyn1d 初始化路径是否支持;本源码片段只支持旧式首行计数格式。 read_profile_mod用infotrac::tname识别水、HDO 和尘埃 profile,因此 profile 文件名/列名必须与traceur.def一致。
待确认
- 当前 Windows 工作树把链接文件呈现为一行路径文本;在原始类 Unix 工作树中它可能是符号链接。
- dyn1d 是否在其他构建配置中调用公共
infotrac_init,当前定向搜索未发现。 - modern planetary
traceur.def或新式tracer.def与 1D 简化初始化的兼容性需要实测或构建脚本确认。
相关页面
- dyn1d/index.md - dyn1d 子目录索引。
- tracer_mod - 物理侧 tracer 索引初始化。
- parse_traceur_file - 旧式
traceur.def解析。 - parse_tracer_file - 新式
tracer.def解析。 - testphys1d 配置 - 1D 配置和
traceur.def要求。 - read_profile_mod.F90 - 使用 tracer 名称读取初始廓线。
- init_testphys1d_mod.F90 - 读取
traceur.def并填充 tracer 元数据。 - testphys1d.F90 - 1D 主程序和 tracer 时间更新。