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_modmmol(:) 的分配后默认值(动力核心或未初始化值)。这些 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 名,供报错列出

co2cloudsco2useh2ometeo_flux 三个开关在 callkeys_mod.F90:86 声明,由 initraceruse callkeys_mod 引入(行 12-15)。

调用的其他例程

本段只调用 abort_physic(GCM 内部异常终止),用于一致性检查失败时停机。无其他物理例程调用。

控制流程(CO2 相关分支)

CO2 tracer 处理分散在四处,按源码顺序:

  1. 索引清零(行 77-84, 98, 467-472 涉及的变量在 76-137 块统一清零) 所有 igcm_* 在识别前先置 0;若某 tracer 不存在,索引保持 0,后续检查据此判断缺失。

  2. 化学/水 tracer 大循环内匹配 CO2 气体与冰(行 220-533,do iq=1,nq

    • 行 221-226:匹配 "co2"igcm_co2=iqmmol=44.count+1
    • 行 467-472:匹配 "co2_ice"igcm_co2_ice=iqmmol=44.count+1
    • 行 492-532:if (co2clouds) 嵌套块(在同一 iq 循环内):
      • 行 493-502:匹配 ccnco2_massccnco2_number
      • 行 503-514:if (meteo_flux) 内匹配 ccnco2_meteor_massccnco2_meteor_number
      • 行 515-531:if (co2useh2o) 内匹配 ccnco2_h2o_numberccnco2_h2o_mass_iceccnco2_h2o_mass_ccn
  3. 一致性检查(行 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_numberccnco2_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),但日志信息可能误导。待确认是否为已知问题。

  4. 物性初始化(行 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=0alpha_lift=alpha_devil=0
    • CO2 冰:radius=1.e-8(m),rho_q=rho_ice_co2(=1650),alpha_lift=alpha_devil=0

核心计算步骤(CO2 段)

  1. 把所有 CO2 相关 igcm_* 索引清零。
  2. 遍历 noms(:),按名字精确匹配设置索引、mmolcount
  3. CO2 云核 tracer 只在 co2clouds 为真时识别;meteo_fluxco2useh2o 进一步控制流星核与水冰核子组的识别。
  4. 全部识别后核对 count==nq(行 536,全 tracer 范围的检查,非仅 CO2)。
  5. CO2 云开启时逐项核对所需 tracer 存在,缺失即停机。
  6. CO2 云开启时设置 CO2 冰、气体、各类 CCNCO2 的半径/密度/抬升系数。

关键公式或算法

本段无数值公式,核心是「名字 → 索引」字符串匹配与开关驱动的条件识别。物性为常数赋值:

边界条件与保护逻辑

复现风险:物性初始化块对 igcm_ccnco2_meteor_*igcm_ccnco2_h2o_* 赋半径/密度(行 1041-1059 只处理 ccnco2_mass/numberco2co2_ice)。这些子核 tracer 的 radius/rho_q 保持默认 0。待确认:流星核与水冰核的物性是否在别处(如 improvedco2clouds/co2cloud_mod)按需赋值,还是设计上不需要全局 radius

输入数据来源

推断:deftank 下未找到包含 ccnco2_meteor_*ccnco2_h2o_* 名字的 traceur.def(已 grep 全 deftank 无匹配)。意味着仓库自带的 traceur.def.co2clouds.GCM5 仅含基础 ccnco2_mass/number,启用 meteo_flux/co2useh2o 需用户自行补充对应 tracer,否则一致性检查会停机。

输出与副作用

伪代码

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

复现注意事项

待确认

相关页面