CO2 循环主题

主题目标

本页串联 LMDZ.MARS 中 CO2 气相、CO2 冰云、地表 CO2 冰、CO2 雪发射率、尘埃/水冰清除和诊断输出的主流程,目标是让读者可以沿源码复现一个物理时间步内的 CO2 循环:

  1. physiqco2cloudco2condens 的调用点、顺序和 tendency 注入位置。
  2. co2cloud_mod 如何调度 improvedco2clouds、内部沉降和 co2condens 所需的连接量。
  3. co2sat / tcondco2 如何提供 CO2 饱和蒸汽压与凝结温度。
  4. co2condens 如何在 co2clouds=false 时自算大气凝结,在 co2clouds=true 时接收微物理凝结/沉降,并继续处理地表 CO2 凝结、表压和 sigma 层校正。
  5. nucleaco2massflowrateco2density_co2_ice 在 CO2 云微物理中的位置。
  6. co2snow 如何把 CO2 雪沉降反馈到地表红外发射率。
  7. scavco2cond / scavenging_by_co2co2useh2ometeo_flux 如何把 CO2 循环与尘埃、水冰和流星尘 tracer 耦合。
  8. 配置开关、tracer、XIOS/write_output 输出和复现风险。

源码依据:本页用 rg 只读核验了 physiq_mod.Fco2condens_mod.Fco2cloud_mod.F90improvedco2clouds_mod.F90co2sat.Ftcondco2.F90nucleaco2.F90massflowrateco2.F90density_co2_ice.F90co2snow.Finitracer.F90conf_phys.Fdeftank/callphys.def*deftank/traceur.def*deftank/xios/field_def_physics.xmldeftank/xios/file_def_physics.xml。更细的文件级证据见相关子页。

入口

入口例程 文件 说明
physiq libf/phymars/physiq_mod.F 主物理时间步入口;第 9a bis 段在 co2clouds 为真时调用 co2cloud,第 11 段在 callcond 为真时调用 co2condens
co2cloud libf/phymars/co2cloud_mod.F90 CO2 云主调度;只调用完整 CO2 云微物理 improvedco2clouds,再在自身内部做 CO2 冰/CCN 沉降、非负保护、云内 tendency 到格点平均的映射。
co2condens libf/phymars/co2condens_mod.F CO2 地表/大气凝结主例程;处理地表 CO2 冰、表压变化、sigma 层校正、co2snow 发射率反馈和可选 scavenging。
initracer CO2 段 libf/phymars/initracer.F90 traceur.def 中的 CO2/CO2 ice/CCNCO2 名字映射到 igcm_* 索引,并在 co2clouds 为真时做 tracer 存在性检查和初始物性设置。

参与文件

文件 参与阶段 作用
physiq_mod.F 主调度 决定 co2cloudco2condens 的顺序,注入 pdt/pdq/dqsurf/pdpsrf,并在 co2condens 后更新表压和垂直坐标。
co2cloud_mod.F90 CO2 云调度 imicroco2,计算 CLFvaryingCO2 云分数,调用 improvedco2clouds,调用 newsedim 做 CO2 云内部沉降,输出 pcondiceapdqs_sedco2pdqcloudco2pdtcloudco2
improvedco2clouds_mod.F90 CO2 云微物理 计算饱和、成核、冰增长/升华、CCN 释放,支持尘埃、流星尘和水冰三类成核基底。
co2sat.F / tcondco2.F90 热力学基础 CO2 饱和蒸汽压与凝结温度反解。
nucleaco2.F90 成核 根据 CO2 分压、温度、过饱和比、CCN bin 和接触参数计算异质成核率。
massflowrateco2.F90 冰增长/升华 计算单个 CO2 冰粒质量传输率 Ic,由 improvedco2clouds 转成 tracer 质量变化。
density_co2_ice.F90 冰密度 给定温度返回 CO2 冰密度;improvedco2clouds 用于 vo2co2updaterad/aeropacity 也会使用。
co2condens_mod.F 凝结/表压 处理大气与地表 CO2 凝结、地表冰量、albedo/emissivity、sigma 层校正、Van Leer 输运和 scavenging。
co2snow.F 地表发射率 根据地表 CO2 雪沉降通量降低红外发射率,并按雪变质时间尺度向参考发射率弛豫。
conf_phys.F / callphys.def* 配置 读取 callcondco2cloudsactiveco2iceco2useh2oscavco2condCLFvaryingCO2satindexco2meteo_flux 等开关并做依赖检查。
traceur.def* / initracer.F90 tracer 给出 CO2 云路径所需 tracer 名字,缺失时由 initracer 中止。
deftank/xios/*.xml 输出 定义和选择 CO2 地表冰、第一层 CO2、柱积分、守恒和凝结 tendency 等 XIOS 字段。

主调用链

physiq
  -> IF (co2clouds):
       zero zdqssed_co2 / zdqssed_ccn
       call co2cloud(..., zdqcloudco2, zdtcloudco2,
                     zdqssed_co2, zdqssed_ccn,
                     zcondicea_co2microp)
         -> optional CLFvaryingCO2:
              tcondco2(pplay, co2_vapor) -> tcond
              cloud fraction in [mincloud, 1]
         -> for microstep = 1..imicroco2:
              improvedco2clouds(...)
                -> co2sat / tcondco2
                -> density_co2_ice
                -> nucleaco2 for dust / meteor / H2O ice CCN
                -> massflowrateco2 for ice growth or sublimation
              non-negative guards for co2/co2_ice/ccnco2/dust/meteor/H2O groups
              if sedimentation:
                updaterice_microco2 -> riceco2, rhocloudco2
                newsedim for co2_ice and CCNCO2 families
         -> pdqcloudco2(co2)=0; CO2 gas tendency is left to co2condens
       inject CO2 cloud pdt/pdq and surface CCN sedimentation into physiq accumulators

  -> IF (sedimentation):
       callsedim handles dust and water ice; CO2 cloud sedimentation is already done inside co2cloud

  -> IF (callcond):                         ! last atmospheric physical process
       call co2condens(...,
                       zdqssed_co2,
                       zcondicea_co2microp,
                       ...)
         -> if co2clouds=false:
              compute atmospheric CO2 condensation from local ztcond
              optional scavenging_by_co2
            else:
              consume co2cloud sedimentation/condensation diagnostics
         -> surface CO2 condensation/sublimation
         -> albedocaps and co2snow
         -> sigma-layer correction with vl1d
       inject zdtc/zdqc/zdqsc/zdtsurfc/pdpsrf
       update ps, zplay, zplev, zzlay, zzlev from pdpsrf

  -> diagnostics:
       CO2 column totals, wstats, write_output / XIOS fields

源码依据:physiq_mod.F:1933-1939 调用 co2cloudphysiq_mod.F:2308-2322 调用 co2condens 并传入 zdqssed_co2zcondicea_co2micropphysiq_mod.F:2357-2403co2condens 后更新表压和垂直坐标;co2cloud_mod.F90:632 调用 improvedco2cloudsco2cloud_mod.F90:819-884 调用多组 newsedimco2cloud_mod.F90:982pdqcloudco2(co2) 置零并注明由 co2condens 计算。

计算阶段

1. 配置和 tracer 准备

最小 CO2 凝结路径只要求 co2 tracer 与 callcond=.true.。标准 GCM6 样例中 callcond=.true.scavco2cond=.true.,但不启用 CO2 云微物理。CO2 云微物理路径要求 co2clouds=.true.,并要求 traceur.def 至少包含:

co2
co2_ice
ccnco2_number
ccnco2_mass

co2useh2o=.true.,还需要 ccnco2_h2o_numberccnco2_h2o_mass_iceccnco2_h2o_mass_ccn;若 meteo_flux=.true.,还需要 ccnco2_meteor_numberccnco2_meteor_mass。仓库自带 traceur.def.co2clouds.GCM5 含基础 CO2 云 tracer 和水/尘 tracer,但源码核验未发现自带 traceur.def*ccnco2_meteor_*ccnco2_h2o_* 名字;启用这两个子路径时需要用户自备 tracer 配置。

源码依据:initracer.F90:221-225 识别 co2:467-471 识别 co2_ice:492-531co2clouds 下识别 CCNCO2/meteor/H2O 子 tracer,:846-900 做缺失检查,:1042-1058 设定基础 CO2 云 tracer 物性。

复现风险:initracer.F90:891-900meteo_flux 检查块存在报错文案拷贝错误和 igcm_ccnco2_meteor_mass 重复检查,需按源码字面行为复现,但不能把报错文案当作精确设计说明。

2. physiq 中先算 CO2 云,后算 CO2 凝结

co2cloud 位于 physiq 第 9a bis 段,早于第 11 段 co2condens。这不是可交换顺序:co2cloud 输出 zdqssed_co2zcondicea_co2microp,随后 co2condens 消费这两个量来处理地表沉降、表压变化和层质量校正。

co2cloud 调用后,physiq 立即把 zdtcloudco2 加入 pdt,把 zdqcloudco2 加入 dust、CO2 ice、CCNCO2、meteor 和 H2O 相关 tracer。CO2 气相 tracer 的微物理 tendency 在 co2cloud_mod 中被置零,外层实际 CO2 气相变化由 co2condens 的 sigma 校正和凝结逻辑给出。

复现风险:不要把 CO2 冰沉降放到 physiq 第 9b 段的 callsedim 中。源码注释和调用链表明 CO2 cloud tracers 的沉降在 co2cloud 内部 microstep 完成;callsedim 继续处理尘埃和水冰。

3. CO2 饱和和凝结温度公式

co2sat 使用 James et al. 1992 形式的饱和蒸汽压:

psat = 1.382e12 * exp(-3182.48 / T)

tcondco2 使用相同公式反解凝结温度。调用方先把 CO2 质量混合比转成 CO2 分压:

pco2 = q(ig,l) * (mmean(ig,l) / 44.01) * p(ig,l)
A = log(1.382d12)
B = -3182.48
tcond = B / (log(pco2) - A)

其中 mmean 来自 conc_modq 是 CO2 tracer 质量混合比。co2cloud_modCLFvaryingCO2 路径传入 CO2 vapor;improvedco2clouds_mod 传入 co2 + co2_ice 作为凝结温度反解的质量输入。

复现风险:tcondco2pco2 <= 0 没有保护,复现时必须保证调用点输入为正,或记录任何额外保护会改变原始源码行为。

4. co2cloud_mod 的分派和内部沉降

CO2 云没有水循环中 simpleclouds/improvedclouds 那样的双方案分派。co2clouds=.true. 即启用 co2cloud,而 co2cloud 内部始终调用 improvedco2clouds;旧配置项 microphysco2 仍出现在 callphys.def.co2clouds.GCM5,但 conf_phys.F 不再读取它,不能把它当作有效开关。

co2cloud 首次调用时读 imicroco2,默认全局版为 30、MESOSCALE 版为 2,并读取 optprop_co2ice_1mic.dat 构造 1 mic 光学厚度查表。每个 microstep 内:

  1. 把此前 pdt/pdq 累加成 microstep 初始状态。
  2. improvedco2clouds 得到成核、增长/升华和 CCN 释放 tendency。
  3. 对 CO2/CO2 ice、CCNCO2/dust、meteor、H2O 相关 tracer 做非负保护。
  4. sedimentation=true,对 co2_ice、CCNCO2、meteor 和 H2O 相关 CO2 cloud tracer 分别调 newsedim
  5. 输出 pcondiceapdqs_sedco2pdqs_sedccnpdtcloudco2pdqcloudco2

CLFvaryingCO2 为真时,co2cloud 先用 tcondco2SatIndex 估计云分数,把云内 tracer 放大为 pqeff = pq / co2cloudfrac,最终再把微物理 tendency 乘回 co2cloudfrac。源码疑点见下文:zdelt 未见赋值,NN = sqrt(g/zt(iq,l)*...) 使用了 iq 而非 ig

5. improvedco2clouds 的微物理核心

improvedco2clouds 先用 co2sat(zt)tcondco2(pplay, co2+co2_ice) 建立热力学状态,然后逐格逐层处理:

  1. CO2 分压与过饱和比:
pco2 = co2 * (mmean / mco2 * 1e3) * pplay
satu = pco2 / zqsat
  1. satu >= 1,调用 density_co2_ice 得到温度依赖 CO2 冰密度,并把单分子冰体积写成 vo2co2 = m0co2 / rho_ice_co2T
  2. 对尘埃 CCN 调 nucleaco2(..., mtetaco2);若 meteo_flux=true,对流星尘 CCN 也调 nucleaco2(..., mtetaco2);若 co2useh2o=true,对水冰 CCN 调 nucleaco2(..., mteta)
  3. 若 CCNCO2 数浓度足够,调用 massflowrateco2 得到单粒质量传输率 Ic_rice,并转成网格质量变化:
dMice = ccnco2_number * Ic_rice * microtimestep * tauscaling
  1. facteurmax = abs(tcond - zt) * cpp/lw 和可用 co2/co2_icedMice 双向裁剪,再更新 co2_ice += dMiceco2 -= dMicesubpdtcloudco2 = dMice*lw/cpp/microtimestep
  2. 若冰消失或 CCN 不足,把 CCNCO2 释放回 dust、meteor 或 H2O ice/CCN 相关 tracer,并把剩余 CO2 ice 转回 CO2 气相。

待确认:massflowrateco2 的 Kelvin 因子使用 tracer_mod::rho_ice_co2 常数,而不是 density_co2_ice 的温度依赖密度;这是源码字面行为,不能把两者混写。

6. co2condens 的两条大气凝结路径

co2condens 首先计算 CO2 体积混合比。improved_ztcond=.true. 且找到 co2 tracer 时:

vmr_co2 = qco2 * mmean / m_co2

否则使用历史路径 vmr_co2 = 0.95。随后分两条路径:

接着 co2condens 计算地表凝结温度 ztcondsol,对每个格点和坡面处理地表 CO2 凝结/升华、可用 CO2 限制、冰完全升华保护,并给出 pdpsrf = -g * zdiceco2_mesh_avgphysiq 随后用 pdpsrf 更新 pszplayzplevzzlayzzlev。这就是 CO2 循环与模型垂直坐标的直接耦合点。

复现风险:co2condens 被注释标为最后一个大气物理过程。改变其相对顺序会改变表压、层质量和之后所有依赖坐标的诊断。

7. co2snow、albedo/emissivity 和地表能量

co2condens 在更新地表 CO2 冰后调用 albedocapsco2snow。其中 co2snow 不改质量、温度或 tracer,只改 pemisurf。其核心逻辑为:

复现风险:pemisurf 形参声明为 intent(out),但公式读入调用前值;调用方在进入 co2snow 前确实把当前坡面发射率复制到临时数组。重新实现时应把它当作 in/out 行为处理。

8. CO2 凝结 scavenging

scavco2cond=true 时,且 co2clouds=false 时,co2condens 可调用 scavenging_by_co2conf_phys.F 明确禁止 co2cloudsscavco2cond 同开,并要求 scavco2cond 需要 dustbin > 0

scavenging_by_co2 对每个格点从顶层向下计算:

if pcondicea > 0:
  captured = 1 - exp(-20 * pcondicea * dt / layer_mass)
  dust/h2o_ice/ccn tendency = -pq/dt * captured
else if pcondicea < 0:
  release scavenged particles in proportion to -pcondicea / pfallice

清除下来的 dust、CCN 和 H2O ice 通量最终进入地表 pdqsc。这条路径把 CO2 凝结和尘埃/水循环耦合起来,但它是参数化路径,不是 CO2 cloud 微物理内部沉降路径。

待确认:升华释放分支直接除以 pfallice(l+1),源码未见显式除零保护;pdqsc(dust_mass) 对 freedust 和 ccn 两部分分别累加,是否存在重复计数需要开发者确认。

状态变量

变量 来源 单位 含义 生命周期
pq(:,:,igcm_co2) physiq tracer kg/kg CO2 气相质量混合比 主时间步状态
pq(:,:,igcm_co2_ice) physiq tracer kg/kg 大气 CO2 冰 CO2 cloud 微物理和沉降更新
pq(:,:,igcm_ccnco2_mass/number) traceur.def / initracer kg/kg, #/kg CO2 云凝结核质量/数 CO2 cloud 微物理更新
zdtcloudco2, zdqcloudco2 co2cloud K/s, kg/kg/s CO2 云微物理局地 tendency 返回 physiq 注入
zcondicea_co2microp co2cloud kg/kg/s CO2 云微物理凝结率 传给 co2condens
zdqssed_co2, zdqssed_ccn co2cloud kg/m2/s CO2 冰和 CCN 地表沉降通量 传给 co2condensdqsurf
qsurf(:,igcm_co2,:) 地表状态 kg/m2 坡面 CO2 地表冰储量 跨时间步
pdpsrf co2condens Pa/s CO2 凝结/升华导致的表压变化率 本时间步用于更新 ps
pemisurf co2condens/co2snow - 地表红外发射率 地表能量收支输入
riceco2, rhocloudco2, rsedcloudco2 co2cloud m, kg/m3, m CO2 冰粒半径、云密度、沉降半径 微物理、沉降和诊断

配置开关

配置项 文件 影响
callcond callphys.def* / conf_phys.F 是否调用 co2condens;源码默认 .true.
co2clouds 同上 是否启用 CO2 云微物理并调用 co2cloud;源码默认 .false.
activeco2ice 同上 CO2 冰是否作为辐射活性气溶胶;源码要求 activeco2ice 依赖 co2clouds
co2useh2o 同上 水冰/水云 CCN 是否可作为 CO2 云凝结核;需要额外 ccnco2_h2o_* tracer。
meteo_flux 同上 是否使用流星尘核;需要 Meteo_flux_Plane.dat 和额外 ccnco2_meteor_* tracer。
CLFvaryingCO2 / satindexco2 / spantCO2 同上 CO2 次网格云分数与 SatIndex 路径。
imicroco2 co2cloud_mod 通过 getin CO2 云 microstep 数;默认全局版 30、MESOSCALE 版 2。
scavco2cond co2condens_mod / conf_phys.F 瞬时 CO2 凝结清除 dust/H2O ice;与 co2clouds 互斥,且需要 dustbin>0
nuiceco2_sed, nuiceco2_ref conf_phys.F / tracer_mod CO2 冰粒分布有效方差;影响沉降半径和参考半径。
albedo_perennialco2_north/south conf_phys.F 多年 CO2 冰盖反照率。
microphysco2 callphys.def.co2clouds.GCM5 已废弃;源码不再读取。

数据依赖

数据 来源 用途
callphys.def* deftank 物理开关和数值参数。
traceur.def* deftank CO2、CO2 ice、CCNCO2、dust、H2O、meteor/H2O 子核 tracer 名字。
optprop_co2ice_1mic.dat datadir co2cloud 读取的 CO2 冰 1 mic 消光系数表;缺失会中止。
Meteo_flux_Plane.dat datadir meteo_flux=trueimprovedco2clouds 读取的流星尘通量。
field_def_physics.xml / file_def_physics.xml deftank/xios XIOS CO2 字段定义与实际输出选择。
iceradius, dtemisice surfdat_h / start 状态 co2snow 的散射系数和雪变质时间尺度。

与其他主题的耦合

其他主题 耦合方式
辐射 activeco2ice 使 CO2 冰参与辐射;co2cloud 计算 tau1micriceco2 等光学/粒径诊断;co2snowpemisurf,进而影响地表辐射冷却。
尘埃循环 尘埃是 CO2 云成核基底;co2cloud 可把 dust 转成 CCNCO2 并经 newsedim 沉降;scavenging_by_co2 可由 CO2 凝结清除 dust。
水循环 co2useh2o 允许水冰/水云 CCN 作为 CO2 云核,并更新 h2o_iceccn_massccn_numberccnco2_h2o_*scavenging_by_co2 也可清除 H2O ice。
沉降 CO2 cloud tracer 沉降在 co2cloud 内部直接调 newsedim,不走 physiq 第 9b 段的 callsedim
诊断 tendency co2cloud 输出 pdtcloudco2pdqcloudco2pcondiceapdqs_sedco2co2condens 输出 co2condens_zfalliceco2condens_pdtc 等诊断。
垂直坐标/动力耦合 co2condens 输出 pdpsrfphysiq 随后更新表压和 zplay/zplev/zzlay/zzlev;MESOSCALE 条件编译路径跳过该段,由动力核处理。

输出结果

输出 去向 含义
pdt, pdq physiq 主状态 CO2 cloud 和 CO2 condensation 注入后的温度/tracer tendency。
dqsurf(:,igcm_co2,:) 地表状态 地表 CO2 冰凝结/升华与沉降 tendency。
pdpsrf / ps 表压和垂直坐标 CO2 凝结/升华导致的大气柱质量变化。
riceco2, rhocloudco2, rsedcloudco2 诊断/后续物理 CO2 冰粒半径、云密度和沉降半径。
mtotco2, icetotco2, vaptotco2 physiq / wstats / write_output CO2 柱质量、冰柱质量和气相柱质量。
co2ice, co2ice_slopeXX, perennial_co2ice* XIOS 地表 CO2 冰和多年 CO2 冰。
co2_layer1, co2, vmr_co2, num_co2 XIOS 字段定义 第一层/三维 CO2 诊断;是否实际输出取决于 file_def_physics.xml 引用。
co2condens_zfallice, co2condens_pdtc XIOS 字段定义 CO2 凝结降冰通量和温度 tendency 诊断。

注意:field_def_physics.xml 定义了 co2vmr_co2num_co2co2condens_pdtc 等字段,但 GCM6 的 file_def_physics.xml 只引用了部分地表 CO2 冰和 co2_layer1 字段;复现输出文件时必须核对 file_def_physics.xml 是否实际启用目标字段。

伪代码总览

for each physics timestep:
  read/use callphys switches and tracer indices initialized by initracer

  if co2clouds:
    co2cloud:
      if firstcall:
        imicroco2 = getin("imicroco2")
        read optprop_co2ice_1mic.dat
      if CLFvaryingCO2:
        tcondco2(pplay, co2_vapor) -> cloudfrac
      for microstep:
        improvedco2clouds:
          co2sat(zt) -> psat
          tcondco2(pplay, co2 + co2_ice) -> tcond
          density_co2_ice(T) -> rho_ice_co2T
          if satu >= 1:
            nucleaco2 for dust
            if meteo_flux: nucleaco2 for meteor CCN
            if co2useh2o: nucleaco2 for H2O ice CCN
          if enough CCN:
            massflowrateco2 -> Ic
            dMice = Nccnco2 * Ic * dt * tauscaling
            clip by thermal energy and available co2/co2_ice
            update co2_ice, co2, pdt tendency
          if ice exhausted:
            release CCN back to dust/meteor/H2O families
        protect negative tracer pairs
        if sedimentation:
          newsedim for co2_ice and CCNCO2 families
      return pcondicea, zdqssed_co2, zdqcloudco2, zdtcloudco2

    physiq injects cloud tendencies, except CO2 gas tendency is left for co2condens

  if callcond:
    co2condens:
      compute vmr_co2 and tcond/ztcondsol
      if not co2clouds:
        compute atmospheric CO2 condensation
        if scavco2cond: scavenging_by_co2
      else:
        consume pcondicea_co2microp and zdqssed_co2 from co2cloud
      compute surface CO2 condensation/sublimation on each slope
      update piceco2, pdpsrf, albedo/emissivity
      co2snow updates pemisurf from CO2 snow flux
      sigma correction with vl1d updates T/U/V/Q tendencies

    physiq injects co2condens tendencies
    if not MESOSCALE:
      ps = zplev(:,1) + pdpsrf * dt
      recompute pressure levels/layers and geometric heights

  update surface state and diagnostics

源码疑点与待确认项

相关页面