callsedim

气溶胶/冰晶重力沉降统一入口例程。

所在文件

LMDZ.MARS\libf\phymars\callsedim_mod.F

MODULE callsedim_modSUBROUTINE callsedim(源码第 1-754 行)。

例程类型

subroutine(模块内唯一 CONTAINS 例程)。

职责

源码依据(第 35-50 行注释 + 整体结构):在每个物理时间步内,对所有“有半径”的气溶胶/冰晶示踪物施加重力沉降(gravitational sedimentation),计算:

  1. 各层因沉降产生的混合比倾向 pdqsed
  2. 沉降到地表的通量 pdqs_sed
  3. 沉降后更新的粒子几何平均半径 rdust / rstormdust / rtopdust / rice

该例程是尘埃循环、水循环、(部分)CO2 云循环共享的底层沉降调度器:它本身不实现下落速度公式,而是按示踪物类别准备粒径分布与密度,然后调用 newsedim 完成单示踪物的垂直输运。

源码依据(第 39-48 行 history 注释):

参数

实参对齐来自 physiq_mod.F:2143(见下方“调用的其他例程/被调用关系”),方向取自源码第 60-85 行 intent 声明。

参数 方向 类型/维度 单位 含义
ngrid in integer - 水平格点数
nlay in integer - 大气层数
ptimestep in real s 物理时间步
pplev in real(ngrid,nlay+1) Pa 层间界面气压
zlev in real(ngrid,nlay+1) m 层边界高度
zlay in real(ngrid,nlay) m 层中点高度
pt in real(ngrid,nlay) K 层中点温度
pdt in real(ngrid,nlay) K/s 上游过程的温度倾向
rdust out real(ngrid,nlay) m 沉降后更新的尘埃几何平均半径
rstormdust out real(ngrid,nlay) m 沉降后更新的 stormdust 半径
rtopdust out real(ngrid,nlay) m 沉降后更新的 topdust 半径
rice out real(ngrid,nlay) m 沉降后更新的水冰几何平均半径
rsedcloud in real(ngrid,nlay) m 水冰的沉降半径(由微物理方案给出)
rhocloud inout real(ngrid,nlay) kg/m³ 云(水冰+CCN)密度
pq in real(ngrid,nlay,nq) kg/kg 沉降前示踪物混合比
pdqfi in real(ngrid,nlay,nq) kg/kg/s 沉降前的上游倾向
pdqsed out real(ngrid,nlay,nq) kg/kg/s 沉降产生的混合比倾向
pdqs_sed out real(ngrid,nq) kg/m²/s 地表沉降通量
nq in integer - 示踪物数
tau in real(ngrid,naerkind) - 尘埃光学厚度
tauscaling in real(ngrid) - 尘埃数浓度→质量的标定因子

源码依据:第 7-12 行参数列表;第 60-85 行 intent 声明。

复现风险:rstormdust / rtopdust 仅在 rdstorm / topflows 开关打开时被赋值(第 704-722 行)。关闭时其值未在本例程初始化,调用方需注意未定义内存(源码未对其做无条件初始化)。

使用的 module 变量

来自 USE 列表(源码第 14-32 行)。

变量 来源模块 读/写 含义
getin_p ioipsl_getin_p_mod 调用 读取运行参数 ice_shape
updaterdust updaterad 调用 由质量+数浓度反算尘埃几何平均半径
updaterice_micro updaterad 调用 微物理活跃时反算水冰半径+云密度
updaterice_typ updaterad 调用 非微物理(典型廓线)时反算水冰半径
noms tracer_mod 示踪物名称数组(用于按名定位索引)
igcm_dust_mass/number tracer_mod 尘埃质量/数浓度示踪物索引
igcm_stormdust_mass/number tracer_mod stormdust 示踪物索引
igcm_topdust_mass/number tracer_mod topdust 示踪物索引
igcm_ccn_mass/number tracer_mod 水冰 CCN 示踪物索引
igcm_h2o_ice tracer_mod 水冰示踪物索引
igcm_hdo_ice tracer_mod HDO 冰(同位素)示踪物索引
igcm_co2_ice tracer_mod CO2 冰示踪物索引(用于跳过判断)
rho_dust tracer_mod 尘埃密度(kg/m³),doubleq 沉降密度
rho_q tracer_mod 各示踪物密度数组
radius tracer_mod 各示踪物默认半径(>1e-9 才参与沉降)
varian tracer_mod 对数正态分布宽度参数 sigma0
nuice_sed/nuice_ref tracer_mod 水冰沉降/辐射有效方差(仅打印)
nqchildren/qparentmin/masseqmin tracer_mod 同位素(子示踪物)输运参数
g comcstfi_h 重力加速度,用于层质量 masse=Δp/g
naerkind dimradmars_mod 气溶胶种类数(tau 维度)
doubleq dust_param_mod 双矩尘埃方案开关
water/activice/microphys/rdstorm/topflows/co2clouds/co2useh2o/meteo_flux callkeys_mod 各物理过程开关

本例程内的 SAVE 状态

源码依据(第 105-186 行):以下为 SAVE/THREADPRIVATE 变量,仅在 firstcall 时初始化:

调用的其他例程

例程 调用目的 是否影响主流程
newsedim 对单个示踪物(给定半径+密度)做重力沉降垂直输运,返回新混合比与通量 是(核心)
vlz_fi 仅同位素(HDO):用母体(H2O 冰)已算出的输运质量 w 输运同位素比 是(仅 water+同位素)
updaterdust 由质量/数浓度反算尘埃类几何平均半径 是(doubleq/rdstorm/topflows)
updaterice_micro 微物理活跃时反算水冰半径与云密度 是(water+microphys)
updaterice_typ 非微物理时按典型廓线反算水冰半径 是(water 非 microphys)
getin_p 读取 ice_shape 运行参数 否(仅 firstcall)
abort_physic 缺失必需示踪物时中止 是(错误保护)

被调用关系(源码依据 physiq_mod.F:2143):

physiq  →  callsedim  →  newsedim  →  vlz_fi
                      →  updaterdust / updaterice_micro / updaterice_typ
                      →  vlz_fi (HDO 同位素)

控制流程

源码依据(结构性阅读第 193-751 行):

  1. firstcall 初始化块(第 193-402 行):仅首次执行
    • doubleq:构造 12 个对数等比分箱半径 rd、边界 rdi、子积分点 rr;按 noms 定位 dust_mass/dust_number 索引,缺失则 abort_physic
    • microphys:定位 ccn_mass/ccn_number
    • co2clouds:定位 CO2 相关 CCN/冰索引(含 co2useh2ometeo_flux 子情形)。
    • water:读取 ice_shapebeta
    • rdstorm:定位 stormdust_*
    • topflows:定位 topdust_*
  2. 初始化(第 404-428 行):把上游倾向并入局部 zqi/zq0/zt;计算层质量 masse 和厚度 epaisseur
  3. 预计算 doubleq 半径(第 433-467 行):对 doubleq/rdstorm/topflows 各自调用 updaterdust 得到 r0dust/r0stormdust/r0topdust
  4. 示踪物主循环 do iq=1,nq(第 469-686 行),仅对 radius(iq)>1e-9 且非 CO2 冰/CCN/HDO 的示踪物处理,按三类分支:
    • DOUBLEQ 分支(第 482-584 行):尘埃/stormdust/topdust 质量与数浓度;
    • WATER CYCLE 分支(第 588-649 行):CCN 与 H2O 冰,含 HDO 同位素子情形;
    • GENERAL 分支(第 653-661 行):其余单一示踪物。
    • 末尾统一计算 pdqsed(第 667-682 行)。
  5. 半径更新(第 690-751 行):对 doubleq/rdstorm/topflows 调 updaterdust;对 water 按 microphys 与否调 updaterice_micro/updaterice_typ

提前跳过条件(第 470-478 行):CO2 冰、各类 CO2 CCN、HDO 冰被显式排除——CO2 在微时间步内沉降,HDO 由 H2O 携带。

核心计算步骤

  1. 层质量(第 425 行,源码依据):
    masse(ig,l) = (pplev(ig,l) - pplev(ig,l+1)) / g
    epaisseur(ig,l) = zlev(ig,l+1) - zlev(ig,l)
  2. doubleq 粒径分布积分(第 521-560 行):对每个分箱 ir,在 ninter=4 个子点上用梯形法积分对数正态分布,得到该分箱权重 qr,再归一化到该示踪物总量 zqi
    • radpower = 2(质量)或 -1(数浓度);
    • qr(ig,l,ir) = zqi(ig,l,iq) * qr / Sq(ig,l)
  3. 逐分箱沉降(第 568-584 行):对 doubleq 的每个固定半径 rd(ir)newsedim,密度恒为 rho_dustbeta=0.5;累加地表通量与各层新混合比。
  4. 水冰沉降(第 593-602 行):微物理时用 rsedcloud+rhocloudbeta;非微物理时用 rsedcloud+rho_q(iq)beta
  5. 同位素输运(第 611-649 行):用母体输运质量 w 通过 vlz_fi 输运 HDO/H2O 比值,再换算 HDO 冰混合比与地表通量。
  6. 通用示踪物(第 654-656 行):用 radius(iq)+rho_q(iq)beta=1.0 调一次 newsedim
  7. 最终倾向(第 669-670 行,源码依据):
    pdqsed(ig,l,iq) = (zqi(ig,l,iq) - (pq + pdqfi*ptimestep)) / ptimestep

关键公式或算法

源码依据(第 198-210 行)—— doubleq 分箱构造(对数等比):

rd(ir)  = rdmin * (rdmax/rdmin)^((ir-1)/(nr-1))           ! nr=12, rdmin=1e-8, rdmax=30e-6
rdi(1)  = rdimin                                          ! 1e-8
rdi(ir) = sqrt(rd(ir-1)*rd(ir))   (ir=2..nr)
rdi(nr+1) = rdimax                                        ! 1e-4
rr(iint,ir) = rdi(ir) * (rdi(ir+1)/rdi(ir))^((iint-1)/(ninter-1))   ! ninter=4

对数正态分布积分核(第 528-542 行):

weight(r) = r^radpower * exp( -(ln(r/r0))^2 / (2*sigma0^2) )

其中 sigma0 = variantracer_mod),radpower=2(质量矩)或 -1(数浓度矩)。

newsedim 内部的下落速度公式(Stokes 定律 + Cunningham 滑移修正等)见 newsedim_mod.md。本页只确认 callsedim 把粒径 rd、密度 rho、形状因子 beta 传入 newsedim

待确认:beta(形状因子)在 doubleq 分支取 0.5、water 分支取 beta(默认 0.75)、general 分支取 1.0;其物理含义(对下落速度的修正方式)需在 newsedim 专页确认。

边界条件与保护逻辑

源码依据:

输入数据来源

复现风险:ice_shape 的实际运行值由运行目录的 def 文件决定;若复现实验未提供该项,则采用默认 0.75。沉降通量对 beta 敏感。

输出与副作用

复现风险:CO2 冰与 CO2 CCN 的沉降不在此处完成;复现 CO2 云循环时必须在 co2cloud.F 微时间步内单独处理,不能假设 callsedim 已覆盖它们。

伪代码

procedure callsedim(ngrid, nlay, ptimestep, ...):
  if firstcall:
    if doubleq:   build rd[nr], rdi[nr+1], rr[ninter,nr]; locate dust_mass/number
    if microphys: locate ccn_mass/number
    if co2clouds: locate co2 ccn/ice indices (+ h2o/meteor sub-cases)
    if water:     beta = getin("ice_shape", 0.75)
    if rdstorm:   locate stormdust_mass/number
    if topflows:  locate topdust_mass/number
    firstcall = false

  zqi = pq + pdqfi*ptimestep          # apply upstream tendencies
  zt  = pt + pdt*ptimestep
  masse = (pplev[l] - pplev[l+1]) / g
  epaisseur = zlev[l+1] - zlev[l]

  if doubleq:   r0dust     = updaterdust(dust_mass, dust_number, tauscaling)
  if rdstorm:   r0stormdust = updaterdust(stormdust_*)
  if topflows:  r0topdust   = updaterdust(topdust_*)

  for iq in 1..nq:
    if radius[iq] <= 1e-9: continue
    if iq is CO2 ice / CO2 ccn / HDO ice: continue

    if doubleq and iq in {dust,storm,top}_{mass,number}:
      r0 = matching r0*
      radpower = 2 if mass else -1
      for each bin ir:                # log-normal trapezoid integration
        qr[ir] = integrate(rr[:,ir], r0, sigma0, radpower)
      normalize qr to zqi[iq]
      zqi[iq] = 0; pdqs_sed[iq] = 0
      for each bin ir:
        newsedim(radius=rd[ir], rho=rho_dust, beta=0.5) -> wq
        pdqs_sed[iq] += wq[1]/ptimestep
        zqi[:,iq]    += qr[:,ir]

    else if iq in {ccn_mass, ccn_number, h2o_ice}:
      if microphys: newsedim(rsedcloud, rhocloud, beta)
      else:         newsedim(rsedcloud, rho_q[iq], beta)
      pdqs_sed[iq] = wq[1]/ptimestep
      if iq == h2o_ice and has child (HDO):
        Ratio = zq0[hdo]/zq0[h2o]   (guarded by qparentmin)
        vlz_fi(Ratio, masseq, w=wq) -> transport HDO with H2O mass
        update zqi[hdo], pdqs_sed[hdo]

    else:   # general tracer
      newsedim(radius[iq], rho_q[iq], beta=1.0)
      pdqs_sed[iq] = wq[1]/ptimestep

    pdqsed[:,iq] = (zqi[:,iq] - (pq + pdqfi*ptimestep)) / ptimestep
    if HDO child: pdqsed[:,hdo] likewise

  if doubleq:  rdust      = updaterdust(zqi dust_*)
  if rdstorm:  rstormdust = updaterdust(zqi storm_*)
  if topflows: rtopdust   = updaterdust(zqi top_*)
  if water:
    if microphys: rice = updaterice_micro(zqi h2o_ice, ccn_*, -> rhocloud)
    else:         rice = updaterice_typ(zqi h2o_ice, tau, zlay)
end procedure

复现注意事项

待确认

复现风险

相关页面