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 简化路径只分配并填充 nqfilsnqperes
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 行:

  1. 打开 traceur.def;若缺失,打印错误并 error stop
  2. 读取第一行到 nq,同时执行 nqtot = nq
  3. 检查 nq >= 1
  4. 分配 tname(nq)q(1,nlayer,nq)dq(1,nlayer,nq)dqdyn(1,nlayer,nq)tnom_transp(nq) 等数组。
  5. 对每个 tracer 读取一整行:
    • 尝试按 tname(iq), tnom_transp(iq) 解析,用于同位素或携带流体关系。
    • 如果两列解析失败,只读取 tname(iq),并设置 tnom_transp(iq)='air'
  6. 分配 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_fileparse_tracer_file 建立物理侧 noms(:)nqparentsnqchildrenigcm_* 索引。

因此 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_profilephysiq 和后续物理索引会不一致。

使用方

文件 使用符号 作用
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 都会中止。

复现要点

  1. dyn1d 必须提供 traceur.def;与 3D tracer_mod 可以回退到 tracer.def 不同,init_testphys1d_modtraceur.def 会直接停止。
  2. traceur.def 首行数量必须等于后续 tracer 行数,且名称顺序会决定 q(:,:,iq) 和 profile/restart 对应关系。
  3. 带第二列的子 tracer 必须写在父 tracer 之后可被搜索到的位置;否则触发孤儿 tracer 中止。
  4. 若使用 modern tracer.def#ModernTrac-v1,需要确认 dyn1d 初始化路径是否支持;本源码片段只支持旧式首行计数格式。
  5. read_profile_modinfotrac::tname 识别水、HDO 和尘埃 profile,因此 profile 文件名/列名必须与 traceur.def 一致。

待确认

相关页面