tracer_mod.F90
路径
LMDZ.MARS\libf\phymars\tracer_mod.F90
所属目录/模块
libf/phymars
文件定位
tracer_mod.F90 是 LMDZ.MARS 的tracer 共享定义核心模块。它声明了所有 tracer 相关的全局状态变量(tracer 数量、名称、分子量、物理属性、tracer 索引),并提供初始化(ini_tracer_mod)和释放(end_tracer_mod)子程序。被 30+ 个物理模块使用,是整个 tracer 系统的枢纽。
定义的符号
模块与子程序
| 符号 |
类型 |
行号 |
作用 |
tracer_mod |
module |
1 |
tracer 共享定义核心模块 |
ini_tracer_mod |
subroutine |
157 |
解析 tracer 配置文件、分配数组、检查 CO2 tracer 存在性 |
end_tracer_mod |
subroutine |
235 |
释放 allocatable 数组(未释放 nqchildren,疑似遗漏) |
核心标量
| 符号 |
类型 |
行号 |
作用 |
nqmx |
integer, save |
6 |
tracer 总数(由 ini_tracer_mod 初始化) |
nqparents |
integer, save |
146 |
parent 为 "air" 的 tracer 数量 |
varian |
real, save |
20 |
对数正态分布特征方差 |
r3n_q |
real, save |
21 |
用于从数浓度和质量混合比计算 r0 |
rho_dust |
real, save |
22 |
火星尘埃密度 (kg/m³) |
rho_ice |
real, save |
23 |
水冰密度 (kg/m³) |
rho_ice_co2 |
real, save |
27 |
CO2 冰密度 (kg/m³) |
nuice_ref / nuice_sed |
real, save |
24–25 |
水冰有效方差(反演/沉降) |
nuiceco2_ref / nuiceco2_sed |
real, save |
28–29 |
CO2 冰有效方差(反演/沉降) |
ref_r0 |
real, save |
26 |
reff = ref_r0 * r0 的系数 |
ccn_factor |
real, save |
34 |
水冰粒子成核比例 |
Allocatable 数组
| 符号 |
类型 |
行号 |
作用 |
noms(nqmx) |
character*30, save |
10 |
tracer 名称 |
mmol(nqmx) |
real, save |
11 |
tracer 分子量 (g/mol) |
radius(nqmx) |
real, save |
12 |
尘埃/冰粒子半径 (m) |
rho_q(nqmx) |
real, save |
13 |
tracer 密度 (kg/m³) |
alpha_lift(nqmx) |
real, save |
14 |
盐化垂直/水平通量比 (m⁻¹) |
alpha_devil(nqmx) |
real, save |
15 |
尘魔抬升系数 |
igcm_dustbin(nqmx) |
integer, save |
46 |
dust bin tracer 索引 |
nqdust(nqmx) |
integer, save |
38 |
尘埃 tracer 索引(用于 aeropacity) |
nqchildren(nqmx) |
integer, save |
147 |
每个 tracer 的子 tracer 数量 |
Tracer 索引(整数,save)
尘埃类(行 46–62):
| 符号 |
作用 |
igcm_dustbin(:) |
dust bin tracer 索引数组 |
igcm_dust_mass / igcm_dust_number |
传输尘埃质量/数浓度混合比 |
igcm_ccn_mass / igcm_ccn_number |
CCN 质量/数浓度混合比 |
igcm_dust_submicron |
亚微米尘埃混合比 |
igcm_stormdust_mass / igcm_stormdust_number |
风暴尘埃质量/数浓度 |
igcm_topdust_mass / igcm_topdust_number |
山顶尘埃质量/数浓度 |
CO2 云 CCN(行 64–74):
| 符号 |
作用 |
igcm_ccnco2_mass / igcm_ccnco2_number |
CO2 冰 CCN 质量/数浓度 |
igcm_ccnco2_meteor_mass / igcm_ccnco2_meteor_number |
流星体 CCN |
igcm_ccnco2_h2o_mass_ice / igcm_ccnco2_h2o_mass_ccn / igcm_ccnco2_h2o_number |
水冰 CCN for CO2 |
水/冰(行 76–84):
| 符号 |
作用 |
igcm_h2o_vap / igcm_h2o_ice |
水汽/水冰 |
igcm_hdo_vap / igcm_hdo_ice |
HDO 汽/HDO 冰 |
igcm_co2_ice |
CO2 冰 |
化学成分(行 86–109):
| 符号 |
作用 |
igcm_co2, igcm_co, igcm_o, igcm_o1d, igcm_o2, igcm_o3 |
碳氧化合物 |
igcm_h, igcm_h2, igcm_oh, igcm_ho2, igcm_h2o2 |
氢氧化合物 |
igcm_n2, igcm_ar, igcm_n, igcm_no, igcm_no2, igcm_n2d |
氮氩化合物 |
igcm_he, igcm_ch4 |
氦、甲烷 |
氘代物种(行 111–118):
| 符号 |
作用 |
igcm_od, igcm_d, igcm_hd, igcm_do2, igcm_hdo2 |
HDO 衍生氘代物种 |
离子(行 120–139):
| 符号 |
作用 |
igcm_co2plus, igcm_oplus, igcm_o2plus, igcm_coplus, igcm_cplus |
正离子 |
igcm_nplus, igcm_noplus, igcm_n2plus, igcm_hplus |
正离子 |
igcm_hco2plus, igcm_hcoplus, igcm_h2oplus, igcm_h3oplus, igcm_ohplus |
分子离子 |
igcm_elec |
电子 |
其他(行 141–151):
| 符号 |
作用 |
igcm_ar_n2 |
CO2 + 中性气体模拟 |
qparentmin |
parent 混合比阈值 (1e-16) |
masseqmin |
质量守恒阈值 (1e-16) |
依赖的模块
| use 模块 |
only 列表 |
用途 |
调用位置 |
mod_phys_lmdz_para |
is_master, bcast |
MPI 并行:仅主进程解析配置文件 |
ini_tracer_mod |
parse_traceur_file_mod |
get_nq_from_traceur_file, get_names_from_traceur_file |
解析旧格式 traceur.def |
ini_tracer_mod |
parse_tracer_file_mod |
get_nq_from_tracer_file, get_names_from_tracer_file, get_children_from_tracer_file |
解析新格式 tracer.def |
ini_tracer_mod |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
get_nq_from_traceur_file |
parse_traceur_file_mod |
行 182 |
从 traceur.def 获取 tracer 数量 |
get_names_from_traceur_file |
parse_traceur_file_mod |
行 186 |
从 traceur.def 获取 tracer 名称和父子关系 |
get_nq_from_tracer_file |
parse_tracer_file_mod |
行 198 |
从 tracer.def 获取 tracer 数量 |
get_names_from_tracer_file |
parse_tracer_file_mod |
行 201 |
从 tracer.def 获取 tracer 名称 |
get_children_from_tracer_file |
parse_tracer_file_mod |
行 204 |
从 tracer.def 获取父子关系 |
abort_physic |
物理基础设施 |
行 206, 220 |
无配置文件或无 CO2 tracer 时终止 |
输入
ini_tracer_mod
| 输入 |
来源 |
类型 |
含义 |
traceur.def 或 tracer.def |
运行目录文件 |
配置文件 |
tracer 定义(名称、数量、父子关系) |
输出
ini_tracer_mod
| 输出 |
去向 |
类型 |
含义 |
nqmx |
全局 |
integer |
tracer 总数 |
noms(nqmx) |
全局 |
character*30 |
tracer 名称 |
nqparents |
全局 |
integer |
parent tracer 数量 |
nqchildren(nqmx) |
全局 |
integer |
每个 tracer 的子 tracer 数量 |
mmol/radius/rho_q/alpha_lift/alpha_devil |
全局 |
real(nqmx) |
tracer 物理属性数组(分配,未赋值) |
igcm_dustbin/nqdust |
全局 |
integer(nqmx) |
tracer 索引数组(分配,未赋值) |
共享状态与副作用
- 所有变量都是
SAVE + !$OMP THREADPRIVATE:每个 OpenMP 线程有独立副本。
- allocatable 数组:
noms, mmol, radius, rho_q, alpha_lift, alpha_devil, igcm_dustbin, nqdust, nqchildren — 由 ini_tracer_mod 分配;end_tracer_mod 释放前 8 个,未释放 nqchildren(行 239-246 遗漏,疑似 bug)。
- tracer 索引(
igcm_*):源码注释"should be 0 if the corresponding tracer does not exist"(行 42-43),但无显式 = 0 初始化;实际由 initracer.F90 根据 tracer 名称匹配赋值。
- 物性常数(
rho_dust, rho_ice 等):由 initracer.F90 或 conf_phys.F 赋值。
核心逻辑
ini_tracer_mod(行 157–233)
- 查找配置文件(行 176–208):
- 先查
traceur.def(旧格式)→ 用 parse_traceur_file_mod 解析
- 不存在则查
tracer.def(新格式)→ 用 parse_tracer_file_mod 解析
- 都不存在 →
abort_physic 终止
- 检查 CO2 tracer(行 210–221):遍历所有 tracer 名称,必须有
"co2",否则终止
- 分配数组(行 224–231):分配
mmol, radius, rho_q, alpha_lift, alpha_devil, igcm_dustbin, nqdust
end_tracer_mod(行 235–248)
- 释放
noms, mmol, radius, rho_q, alpha_lift, alpha_devil, igcm_dustbin, nqdust 这 8 个 allocatable 数组(带 allocated() 保护);nqchildren 也是 allocatable,但源码未在此释放,已在待确认中标为疑似遗漏。
伪代码
ini_tracer_mod:
if traceur.def exists:
parse traceur.def → nqmx, noms, nqparents, nqchildren
elif tracer.def exists:
parse tracer.def → nqmx, noms, nqparents, nqchildren
else:
abort
if "co2" not in noms:
abort("co2 tracer is now mandatory")
allocate mmol, radius, rho_q, alpha_lift, alpha_devil, igcm_dustbin, nqdust
end_tracer_mod:
deallocate noms, mmol, radius, rho_q, alpha_lift, alpha_devil, igcm_dustbin, nqdust
! NOTE: nqchildren is NOT deallocated here — likely an oversight
参与的主题流程
| 主题 |
参与方式 |
| tracer 配置体系 |
提供 tracer 数量、名称和父子关系的全局存储 |
| 尘埃循环 |
igcm_dust_*, nqdust, rho_dust, alpha_lift 等 |
| 水循环 |
igcm_h2o_vap/ice, igcm_hdo_vap/ice |
| CO2 循环 |
igcm_co2, igcm_co2_ice, igcm_ccnco2_* |
| 辐射计算 |
radius, rho_q 用于粒子光学属性 |
| 化学 |
igcm_co, igcm_o, igcm_oh 等化学 species 索引 |
写法特点
- 纯声明模块:模块体只有变量声明,无可执行代码(除
contains 中的子程序)。
- 所有变量
SAVE + !$OMP THREADPRIVATE:确保 OpenMP 并行安全。
- 旧/新格式双轨:
ini_tracer_mod 先查 traceur.def,不存在再查 tracer.def。
- CO2 强制检查:
co2 tracer 是必须的(行 219–221),反映 CO2 在火星大气中的核心地位。
- tracer 索引由
initracer.F90 赋值:本模块只声明和分配,实际的索引匹配在 initracer 中完成。
复现要点
- 必须有
traceur.def 或 tracer.def 文件,且包含 "co2" tracer。
- tracer 物性(
mmol, radius, rho_q 等)由 initracer.F90 赋值,不在本模块。
- 所有
igcm_* 索引应为 0(未显式初始化),由 initracer.F90 根据 noms 匹配赋值。
待确认
igcm_ccnco2_meteor_mass/number(行 66–67)和 igcm_ccnco2_h2o_*(行 68–70)在 !$OMP THREADPRIVATE 声明中缺失(行 72–74 只列了部分),推断为遗漏(待确认:是否影响 OpenMP 并行)。
varian, r3n_q, rho_dust 等标量的赋值位置不在本文件(待确认:由 initracer 或 conf_phys 赋值)。
nqchildren(行 147)为 allocatable 数组,由 ini_tracer_mod 分配但 end_tracer_mod(行 239-246)未释放,疑似内存泄漏遗漏。
相关页面