initracer.F90
路径
LMDZ.MARS\libf\phymars\initracer.F90
所属目录 / 模块
libf/phymars
文件定位
initracer.F90 定义模块 initracer_mod 和唯一例程 initracer(ngrid,nq)。它位于 tracer 配置解析之后、物理过程使用 tracer 之前:tracer_mod 已经持有 noms(:)、mmol(:)、radius(:)、rho_q(:)、alpha_lift(:)、alpha_devil(:) 等数组,本例程按 tracer 名称逐项识别 igcm_* 索引,填充分子量和物理属性,并根据 callkeys_mod / dust_param_mod 中的物理开关执行一致性检查。
本文件不是 traceur.def / tracer.def 解析器;配置文件读取由 tracer_mod、parse_traceur_file 和 parse_tracer_file 完成。initracer 的职责是把已经读入的名字映射为物理包约定的索引和属性,使尘埃、水、HDO、CO2 云、化学、热层和 NLTE 路径能通过 igcm_* 访问正确的 tracer。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
initracer_mod |
module |
1 |
tracer 初始化模块。 |
initracer |
subroutine |
7 |
识别 tracer 名称,设置 igcm_* 索引、mmol/radius/rho_q/alpha_*,并检查开关所需 tracer 是否存在。 |
popratio |
local parameter |
50 |
doubleq 与 submicron 同时开启时,小粒径尘埃相对大粒径尘埃的数量比例,当前为 25.。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
tracer_mod |
全量导入 |
读写 noms/mmol/radius/rho_q/alpha_lift/alpha_devil/r3n_q/ref_r0/varian/rho_* 和大量 igcm_* 索引。 |
否 |
comcstfi_h |
pi |
尘埃粒径和数浓度换算公式中的圆周率。 |
否 |
dust_param_mod |
doubleq, submicron, dustbin |
控制尘埃 tracer 识别和物性初始化分支。 |
否 |
callkeys_mod |
water, microphys, scavenging, rdstorm, topflows, photochem, callthermos, hdo, callnlte, nltemodel, dustinjection, co2clouds, co2useh2o, meteo_flux |
控制水循环、HDO、尘暴、山顶尘流、化学、热层、NLTE 和 CO2 云 tracer 要求。 |
否 |
ioipsl_getin_p_mod |
getin_p |
读取 reff_lift_dust 覆盖默认 lifted dust 有效半径。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
abort_physic |
公共物理错误终止例程 |
多处,如第 68、544、803、858 行等 |
tracer 数量、名称或开关依赖不一致时中止。 |
getin_p |
ioipsl_getin_p_mod |
第 621 行 |
从运行配置读取 reff_lift_dust,覆盖默认 3.0e-6 m。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
调用方实参 |
integer scalar |
grid columns |
本文件当前没有直接使用,保留在接口中。 |
nq |
调用方实参 |
integer scalar |
tracer count |
tracer 数量;必须 >=1,且识别出的 tracer 数必须等于它。 |
noms(1:nq) |
tracer_mod |
character array |
- |
已由 tracer 配置解析得到的 tracer 名称列表。 |
| 物理开关 |
dust_param_mod / callkeys_mod |
logical/integer scalars |
- |
决定哪些 tracer 必须存在、哪些物性分支需要初始化。 |
reff_lift_dust |
getin_p 配置键 |
real scalar |
m |
lifted dust 有效半径,默认 3.0e-6。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
igcm_* 索引 |
tracer_mod / 全物理包 |
integer scalars/array |
- |
各命名 tracer 在 pq(:,:,iq) 等数组中的位置。 |
mmol(1:nq) |
tracer_mod |
real array |
g mol-1 |
tracer 分子量;化学、热层和平均分子量路径使用。 |
radius(1:nq) |
tracer_mod |
real array |
m |
aerosol/冰粒有效半径或 0。 |
rho_q(1:nq) |
tracer_mod |
real array |
kg m-3 |
tracer 物质密度。 |
alpha_lift(1:nq) |
tracer_mod |
real array |
m-1 |
风应力起尘垂直/水平通量比。 |
alpha_devil(1:nq) |
tracer_mod |
real array |
mixed |
尘卷风起尘系数。 |
r3n_q, ref_r0, varian |
tracer_mod |
real scalars |
mixed |
doubleq 尘埃质量/数浓度到粒径分布的换算常数。 |
rho_dust, rho_ice, rho_ice_co2 |
tracer_mod |
real scalars |
kg m-3 |
尘埃、水冰和 CO2 冰密度。 |
共享状态与副作用
- 本例程大量写入
tracer_mod 的模块状态,并通过 write(*,*) 打印识别结果、尘埃起尘参数和物性数组。
- 它只按
noms(:) 字符串识别 tracer;名称大小写和拼写必须与源码中的字面量一致,例如 dust_mass、h2o_vap、ccnco2_mass、Ar_N2。
- 若识别数量
count 不等于 nq,或某个开启的物理过程缺少必需 tracer,会调用 abort_physic 终止。
rho_q/radius/alpha_lift/alpha_devil 在物性初始化前先整体清零;后续分支只为相关 tracer 写非零值。
核心逻辑
- 数量和索引清零:若
nq<1 直接中止;随后把所有 igcm_* 索引重置为 0,避免旧状态残留。
- 尘埃族识别:按
dustbin>0 查找 dust01、dust02 等 bin 名称;按 doubleq 查找 dust_mass/dust_number;按 microphys 查找 ccn_mass/ccn_number;按 submicron、rdstorm、topflows 分别查找 dust_submicron、stormdust_* 和 topdust_*。
- 化学、水和离子名称识别:对所有
iq=1..nq 扫描 CO2、CO、O、H、HOx、NOx、CH4、N2、Ar、He、离子、电子、水汽/水冰、HDO、CO2 冰等名称,并写入对应 igcm_* 和 mmol。
- CO2 云附加 tracer 识别:若
co2clouds,识别 ccnco2_mass/number;若 meteo_flux,再识别 ccnco2_meteor_*;若 co2useh2o,识别 ccnco2_h2o_*。
- 全量匹配检查:要求
count == nq;否则打印已识别 tracer 并中止。这意味着配置中出现源码未知名称也会失败。
- HDO 顺序和父子关系检查:开启
hdo 时,要求 H2O 先于 HDO 初始化、HDO 作为 H2O 子 tracer,且 HDO tracer 位于列表末尾附近。
- 物性默认清零和密度常数:清零
rho_q/radius/alpha_lift/alpha_devil,设置 rho_dust=2500、rho_ice=920、rho_ice_co2=1650。
- 尘埃物性初始化:
doubleq 分支检查 dust_mass/dust_number,设 nueff_lift=0.5,由 varian 推导 r3n_q/ref_r0,读取 reff_lift_dust,再设置 mass/number 的 radius 和起尘系数;rdstorm/topflows 复用 lifted dust 半径。非 doubleq 且 dustbin==1 时使用单粒径 3.e-6。
- 水、HDO、submicron、CCN 和 CO2 云物性:水汽/HDO 汽相半径为 0,水冰/HDO 冰半径
3.e-6、密度 rho_ice;CO2 冰半径 1.e-8、密度 rho_ice_co2;CCN 多数继承尘埃属性并把起尘系数设为极小值。
- 开关依赖检查:分别检查
water、hdo、microphys、co2clouds、rdstorm、topflows、callnlte/nltemodel、scavenging、photochem/callthermos 所需 tracer 是否存在。
伪代码
initracer(ngrid, nq):
require nq >= 1
reset all igcm_* indexes to 0
for each enabled tracer family:
scan noms(1:nq)
if a known name is found:
set igcm_* index
set mmol when known
append to identified list
require identified_count == nq
if hdo:
require H2O before HDO, HDO as child tracer, HDO near end
clear rho_q, radius, alpha_lift, alpha_devil
set rho_dust, rho_ice, rho_ice_co2
if doubleq:
require dust_mass and dust_number
derive varian, r3n_q, ref_r0
read reff_lift_dust
set dust mass/number radius and lifting coefficients
optionally initialize stormdust/topdust
else if dustbin == 1:
set single-bin dust properties
initialize scavenging CCN, submicron dust, water, HDO, CO2 cloud properties
run feature-specific tracer dependency checks
参与的主题流程
| 主题 |
参与方式 |
| 尘埃循环 |
识别尘埃质量/数浓度、bin、submicron、stormdust、topdust tracer,并设置起尘系数、半径和密度。 |
| 水循环 |
识别 h2o_vap/h2o_ice、水云 CCN 和 HDO tracer,并检查水循环/微物理依赖。 |
| CO2 循环 |
识别 CO2、CO2 冰、CO2 云 CCN、流星尘 CCN 和 H2O 来源 CO2 CCN。 |
| 高层大气/化学 |
识别 CO/O/H/N/离子/电子等化学与热层 tracer,并在 photochem、callthermos、callnlte 开启时做依赖检查。 |
写法特点
- 该例程采用长串
if (noms(iq) == "...") 字符串匹配,而不是表驱动映射;新增 tracer 名称时必须同步维护识别、分子量、属性和依赖检查。
idtracers(count) 用于记录识别顺序;count /= nq 时会把已识别名称打印出来,便于定位配置中未知 tracer。
ngrid 在当前源码中未被使用,但保留在接口里。
meteo_flux 检查块中 igcm_ccnco2_meteor_mass 被连续检查两次,其中第一条错误消息提到 ccnco2_h2o_mass_ice;这是已在 CO2 tracer 段页标注过的文案/重复检查疑点。
复现要点
traceur.def / tracer.def 中每个 tracer 名称都必须被源码识别,否则 count /= nq 会中止。
- 开启
doubleq 必须有 dust_mass 和 dust_number;开启 water 必须有 h2o_vap/h2o_ice;开启 microphys 必须有 ccn_mass/ccn_number。
- 开启
co2clouds 至少需要 co2/co2_ice/ccnco2_mass/ccnco2_number;co2useh2o 和 meteo_flux 会进一步增加 tracer 要求。
reff_lift_dust 改变会影响 radius(dust_mass/dust_number)、alpha_lift 和 alpha_devil 的换算。
- HDO tracer 的顺序和 parent/child 关系是硬检查,配置文件顺序不满足时会中止。
待确认
ngrid 在当前文件内未使用,是否保留给旧接口兼容或未来按网格初始化逻辑。
meteo_flux 检查块重复检查 igcm_ccnco2_meteor_mass 是否为有意冗余,或应有一项检查 igcm_ccnco2_meteor_number / 其它 H2O 来源 tracer。
相关页面