initracer — CO2 / CO2 云 tracer 段
本页只覆盖 initracer 中与 CO2 循环和 CO2 云相关的 tracer 识别、索引、物性初始化和一致性检查代码段。整个 initracer 还处理尘埃、水、化学、离子等 tracer,这些不在本页范围内。
所属文件
LMDZ.MARS\libf\phymars\initracer.F90
所属模块
initracer_mod
例程定位
SUBROUTINE initracer(ngrid,nq) (行 7–1061)
本页聚焦其中的 CO2 相关代码段(行号见下)。
本段职责
把动力核心通过 infotrac 提供的 tracer 名字数组 noms(:) 与 tracer_mod 中的 CO2 相关整数索引变量对应起来,设置对应的摩尔质量 mmol,并在 CO2 云方案开启时初始化 CO2 冰和 CCNCO2 粒子的物性(半径、密度、抬升系数),最后做存在性一致性检查。
CO2 相关的索引变量(声明于 tracer_mod,见 tracer_mod.F90:64-87):
| 索引变量 | 含义 | tracer 名字(noms) |
mmol |
|---|---|---|---|
igcm_co2 |
气态 CO2(化学/CO2 云所需主气体) | co2 |
44. |
igcm_co2_ice |
CO2 冰 | co2_ice |
44. |
igcm_ccnco2_mass |
CO2 云 CCN 质量混合比 | ccnco2_mass |
(未设,保持默认) |
igcm_ccnco2_number |
CO2 云 CCN 数混合比 | ccnco2_number |
(未设) |
igcm_ccnco2_meteor_mass |
流星尘 CCN 质量(meteo_flux) |
ccnco2_meteor_mass |
(未设) |
igcm_ccnco2_meteor_number |
流星尘 CCN 数(meteo_flux) |
ccnco2_meteor_number |
(未设) |
igcm_ccnco2_h2o_mass_ice |
水冰来源 CCN 的冰质量(co2useh2o) |
ccnco2_h2o_mass_ice |
(未设) |
igcm_ccnco2_h2o_mass_ccn |
水冰来源 CCN 的核质量(co2useh2o) |
ccnco2_h2o_mass_ccn |
(未设) |
igcm_ccnco2_h2o_number |
水冰来源 CCN 的数(co2useh2o) |
ccnco2_h2o_number |
(未设) |
推断:
ccnco2_*与co2_ice未在本例程显式设置mmol,因此保持tracer_mod中mmol(:)的分配后默认值(动力核心或未初始化值)。这些 tracer 是气溶胶/冰,不参与气相摩尔质量计算,所以未设mmol不影响 CO2 云物理。co2_ice例外地被设为 44.(行 469)。
使用的 module 变量
| 变量 | 来源模块 | 读/写 | 含义 |
|---|---|---|---|
noms(:) |
tracer_mod |
读 | 各 tracer 名字,用于匹配 |
mmol(:) |
tracer_mod |
写 | tracer 摩尔质量(g/mol) |
igcm_co2 |
tracer_mod |
写 | co2 索引 |
igcm_co2_ice |
tracer_mod |
写 | co2_ice 索引 |
igcm_ccnco2_mass / _number |
tracer_mod |
写 | CO2 云核索引 |
igcm_ccnco2_meteor_mass / _number |
tracer_mod |
写 | 流星核索引 |
igcm_ccnco2_h2o_mass_ice / _mass_ccn / _number |
tracer_mod |
写 | 水冰来源核索引 |
igcm_dust_mass |
tracer_mod |
读 | CO2 云初始化时复用其半径 |
radius(:) |
tracer_mod |
写 | 粒子半径(m) |
rho_q(:) |
tracer_mod |
写 | 粒子密度(kg/m³) |
rho_ice_co2 |
tracer_mod |
写 | CO2 冰密度,行 577 设为 1650. |
rho_dust |
tracer_mod |
读 | 尘密度,作为 CCNCO2 密度 |
alpha_lift(:) / alpha_devil(:) |
tracer_mod |
写 | 抬升系数(CO2 相关 tracer 全置极小或 0) |
co2clouds |
callkeys_mod |
读 | 是否开启 CO2 云方案 |
co2useh2o |
callkeys_mod |
读 | CO2 云是否使用水冰作为核 |
meteo_flux |
callkeys_mod |
读 | 是否注入流星尘核 |
count |
局部 | 读写 | 已识别 tracer 计数,用于最终核对 |
idtracers(:) |
局部 | 写 | 记录已识别 tracer 名,供报错列出 |
co2clouds、co2useh2o、meteo_flux 三个开关在 callkeys_mod.F90:86 声明,由 initracer 的 use callkeys_mod 引入(行 12-15)。
调用的其他例程
本段只调用 abort_physic(GCM 内部异常终止),用于一致性检查失败时停机。无其他物理例程调用。
控制流程(CO2 相关分支)
CO2 tracer 处理分散在四处,按源码顺序:
索引清零(行 77-84, 98, 467-472 涉及的变量在 76-137 块统一清零) 所有
igcm_*在识别前先置 0;若某 tracer 不存在,索引保持 0,后续检查据此判断缺失。化学/水 tracer 大循环内匹配 CO2 气体与冰(行 220-533,
do iq=1,nq)- 行 221-226:匹配
"co2"→igcm_co2=iq,mmol=44.,count+1。 - 行 467-472:匹配
"co2_ice"→igcm_co2_ice=iq,mmol=44.,count+1。 - 行 492-532:
if (co2clouds)嵌套块(在同一iq循环内):- 行 493-502:匹配
ccnco2_mass、ccnco2_number。 - 行 503-514:
if (meteo_flux)内匹配ccnco2_meteor_mass、ccnco2_meteor_number。 - 行 515-531:
if (co2useh2o)内匹配ccnco2_h2o_number、ccnco2_h2o_mass_ice、ccnco2_h2o_mass_ccn。
- 行 493-502:匹配
- 行 221-226:匹配
一致性检查(行 846-902,
if (co2clouds)) 逐个检查 CO2 云所需 tracer 索引是否为 0,缺失即abort_physic:- 行 848-852:
igcm_co2==0→ 停机。 - 行 853-857:
igcm_co2_ice==0→ 停机。 - 行 858-862:
igcm_ccnco2_number==0→ 停机。 - 行 863-867:
igcm_ccnco2_mass==0→ 停机。 - 行 868-884:
if (co2useh2o)内检查三个ccnco2_h2o_*索引。 - 行 885-901:
if (meteo_flux)内检查ccnco2_meteor_number、ccnco2_meteor_mass。
复现风险(源码疑点):
meteo_flux检查块(行 885-901)有两处问题。其一,行 891-895 检查igcm_ccnco2_meteor_mass==0,但报错文案误印为"...without a ccnco2_h2o_mass_ice tracer!"(拷贝自co2useh2o块,文案与实检变量不符)。其二,igcm_ccnco2_meteor_mass==0被连续检查两次(行 891-895 与行 896-900),第二次文案才正确(ccnco2_meteor_mass);而igcm_ccnco2_meteor_number仅在行 886-890 检查一次。两处均为冗余/文案 bug,不改变逻辑结果(缺任一 meteor tracer 仍会abort_physic),但日志信息可能误导。待确认是否为已知问题。- 行 848-852:
物性初始化(行 1041-1059,
if (co2clouds))- CCNCO2 质量/数核:
radius(igcm_ccnco2_mass)=radius(igcm_dust_mass)(复用尘半径),alpha_lift=alpha_devil=1e-30(实质禁止抬升),rho_q=rho_dust;数核继承质量核的半径/系数/密度。 - CO2 气体:
radius=0、alpha_lift=alpha_devil=0。 - CO2 冰:
radius=1.e-8(m),rho_q=rho_ice_co2(=1650),alpha_lift=alpha_devil=0。
- CCNCO2 质量/数核:
核心计算步骤(CO2 段)
- 把所有 CO2 相关
igcm_*索引清零。 - 遍历
noms(:),按名字精确匹配设置索引、mmol和count。 - CO2 云核 tracer 只在
co2clouds为真时识别;meteo_flux、co2useh2o进一步控制流星核与水冰核子组的识别。 - 全部识别后核对
count==nq(行 536,全 tracer 范围的检查,非仅 CO2)。 - CO2 云开启时逐项核对所需 tracer 存在,缺失即停机。
- CO2 云开启时设置 CO2 冰、气体、各类 CCNCO2 的半径/密度/抬升系数。
关键公式或算法
本段无数值公式,核心是「名字 → 索引」字符串匹配与开关驱动的条件识别。物性为常数赋值:
- CO2 冰密度
rho_ice_co2 = 1650.kg/m³(行 577)。与density_co2_ice中温度依赖密度不同:此处是初始化常数,运行中 CO2 冰密度可由density_co2_ice按温度更新(见 density_co2_ice.md)。 - CO2 冰初始半径
1.e-8m(=10 nm),对应 CO2 云成核起始粒径。 - CCNCO2 半径复用尘
dust_mass半径(reff_lift,doubleq 下为3.e-6m)。
边界条件与保护逻辑
- 所有索引先清零,缺失 tracer 索引恒为 0,下游用
==0判定缺失。 co2clouds时若缺co2、co2_ice、ccnco2_mass、ccnco2_number任一即abort_physic。co2useh2o子组、meteo_flux子组各自有独立检查,只在对应开关为真时强制要求。- 物性初始化(行 1041-1059)在
co2clouds为真时无条件访问igcm_ccnco2_mass等索引;若上面检查已通过,这些索引必非 0,故不会越界写radius(0)。
复现风险:物性初始化块对
igcm_ccnco2_meteor_*和igcm_ccnco2_h2o_*不赋半径/密度(行 1041-1059 只处理ccnco2_mass/number、co2、co2_ice)。这些子核 tracer 的radius/rho_q保持默认 0。待确认:流星核与水冰核的物性是否在别处(如improvedco2clouds/co2cloud_mod)按需赋值,还是设计上不需要全局radius。
输入数据来源
- tracer 名字与数量:动力核心
infotrac,经noms(:)、nq传入;由traceur.def决定(如deftank/traceur.def.co2clouds.GCM5)。 - 开关
co2clouds/co2useh2o/meteo_flux:callphys.def,经callkeys_mod。
推断:
deftank下未找到包含ccnco2_meteor_*或ccnco2_h2o_*名字的traceur.def(已 grep 全 deftank 无匹配)。意味着仓库自带的traceur.def.co2clouds.GCM5仅含基础ccnco2_mass/number,启用meteo_flux/co2useh2o需用户自行补充对应 tracer,否则一致性检查会停机。
输出与副作用
- 写
tracer_mod中 CO2 相关igcm_*索引、mmol、radius、rho_q、rho_ice_co2、alpha_lift、alpha_devil。 - 通过
count/idtracers参与全局 tracer 计数核对。 - 检查失败时调用
abort_physic终止程序,并write(*,*)报错信息。
伪代码
procedure initracer_co2_segment
! 1. 清零
igcm_co2 = 0; igcm_co2_ice = 0
igcm_ccnco2_mass = igcm_ccnco2_number = 0
igcm_ccnco2_meteor_mass = igcm_ccnco2_meteor_number = 0
igcm_ccnco2_h2o_mass_ice = igcm_ccnco2_h2o_mass_ccn = igcm_ccnco2_h2o_number = 0
! 2. 名字匹配(在化学/水 tracer 大循环内)
for iq in 1..nq:
if noms(iq)=="co2": igcm_co2=iq; mmol(iq)=44; count++
if noms(iq)=="co2_ice": igcm_co2_ice=iq; mmol(iq)=44; count++
if co2clouds:
if noms(iq)=="ccnco2_mass": igcm_ccnco2_mass=iq; count++
if noms(iq)=="ccnco2_number": igcm_ccnco2_number=iq; count++
if meteo_flux:
match ccnco2_meteor_mass / ccnco2_meteor_number
if co2useh2o:
match ccnco2_h2o_number / ccnco2_h2o_mass_ice / ccnco2_h2o_mass_ccn
! 3. 一致性检查
if co2clouds:
require igcm_co2, igcm_co2_ice, igcm_ccnco2_number, igcm_ccnco2_mass != 0
if co2useh2o: require the three ccnco2_h2o_* != 0
if meteo_flux: require ccnco2_meteor_number, ccnco2_meteor_mass != 0
! 否则 abort_physic
! 4. 物性
if co2clouds:
radius(ccnco2_mass)=radius(dust_mass); alpha_*(ccnco2_mass)=1e-30; rho_q=rho_dust
ccnco2_number 继承 ccnco2_mass
radius(co2)=0; alpha_*=0
radius(co2_ice)=1e-8; rho_q(co2_ice)=rho_ice_co2(=1650); alpha_*=0
end procedure
复现注意事项
- CO2 云所需 tracer 必须在
traceur.def中存在且名字精确匹配(区分大小写,noms(iq)==...为严格相等),否则停机。 traceur.def中 tracer 顺序不影响 CO2 索引识别(按名字而非位置),但 HDO 等同位素另有顺序约束(不在本段)。- 仓库自带
traceur.def.co2clouds.GCM5含 10 个 tracer,列出ccnco2_number、ccnco2_mass,但不含meteor/h2o子核;启用meteo_flux/co2useh2o需扩充traceur.def。 co2_ice与 CCNCO2 的物性常数(密度 1650、初始半径 1e-8)是 CO2 云微物理的输入起点,改动会影响 improvedco2clouds_mod.md / co2cloud_mod.md 的成核与增长。
待确认
- 流星核(
ccnco2_meteor_*)和水冰核(ccnco2_h2o_*)的radius/rho_q是否需要在别处赋值(本段未设)。 ccnco2_*tracer 不设mmol是否对任何气相计算有影响(推断无,因其为气溶胶)。- 行 885-901
meteo_flux检查块的文案拷贝错误与igcm_ccnco2_meteor_mass重复检查(见上文「控制流程」第 3 点复现风险)是否为已知 bug。
相关页面
- co2cloud_mod.md — CO2 云总调度,消费这些 tracer 索引
- improvedco2clouds_mod.md — CO2 云微物理核心
- nucleaco2.md — 三类 CCN 成核
- density_co2_ice.md — CO2 冰温度依赖密度(与此处常数 1650 对照)
- co2-saturation-helpers.md — CO2 饱和/凝结温度