updaterad.F90

路径

LMDZ.MARS\libf\phymars\updaterad.F90

所属目录/模块

libf/phymars

文件定位

源码依据(第 5-7 行注释):本模块将 GCM 中所有冰和尘埃的有效半径计算集中到一处,使全代码中的粒径计算保持一致,并让"大量半径 bug"更容易排查。

源码依据(第 9-11 行注释):半径计算并非总在整个格点上执行(参见 improvedcloud),因此子例程设计为标量接口(逐格点逐层调用),而非数组接口。

在系统中,updaterad 是尘埃循环、水循环和 CO₂ 云循环中粒子粒径更新的底层统一计算工具。它被 callsedim_modimprovedclouds_modwatercloud_modsimpleclouds_modco2cloud_modimprovedco2clouds_modupdatereffrad_mod 共 7 个模块调用。

定义的符号

符号 类型 行号 作用
updaterad module 1 容器模块,包含全局阈值参数和 6 个标量子例程
updaterice_micro subroutine 60 微物理活跃时:由质量/数浓度更新水冰半径和云密度
updaterice_microco2 subroutine 97 CO₂ 冰微物理:含水 CCN + 温度依赖 CO₂ 冰密度
updaterice_typ subroutine 146 微物理关闭时:由 Montmessin et al. 2004 典型廓线推算水冰半径
updaterdust subroutine 203 由质量/数浓度更新尘埃几何平均半径
updaterccn subroutine 255 水云微物理用的 CCN 质量平均半径
updaterccnCO2 subroutine 308 CO₂ 云微物理用的 CCN 质量平均半径

模块级参数

参数 类型 行号 含义
r3icemin / ricemin real 18-19 1e-30 / 1e-10 水冰半径下限(m),即 0.0001 μm
r3icemax / ricemax real 20-21 125e-12 / 500e-6 水冰半径上限(m),即 500 μm
r3iceco2min / riceco2min dp 23-24 1e-30 / 1e-10 CO₂ 冰半径下限
r3iceco2max / riceco2max dp 25-26 125e-12 / 500e-6 CO₂ 冰半径上限
qice_threshold real 28 1e-15 水冰混合比阈值
qice_co2_threshold real 29 1e-30 CO₂ 冰混合比阈值
nccn_threshold / qccn_threshold real 31-32 1. / 1e-20 CCN 数浓度/质量阈值
r3ccnmin / rccnmin real 34-35 1e-21 / 0.1e-6 CCN 半径下限(水),即 0.1 μm
rccnCO2min real 36 1e-9 CCN 半径下限(CO₂)
r3ccnmax / rccnmax real 38-39 125e-12 / 500e-6 CCN 半径上限,即 500 μm
ndust_threshold / qdust_threshold real 41-42 1. / 1e-20 尘埃数浓度/质量阈值
r3dustmin / rdustmin real 44-45 1e-24 / 1e-8 尘埃半径下限(m),即 0.01 μm
r3dustmax / rdustmax real 47-48 125e-12 / 500e-6 尘埃半径上限(m),即 500 μm
rdust0 real 50 0.8e-6 典型尘埃半径(m),用于典型廓线法

依赖的模块

use 模块 only 列表 用途 待确认
tracer_mod rho_dust, rho_ice, r3n_q 尘埃/冰密度和 R³/N/Q 转换常数
comcstfi_h pi 数学常数
density_co2_ice_mod density_co2_ice 温度依赖 CO₂ 冰密度函数(第 100 行)

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
density_co2_ice density_co2_ice_mod 第 119 行 由温度计算 CO₂ 冰密度(updaterice_microco2 内)

输入

所有子例程均为标量接口,逐格点逐层调用。

updaterice_micro

输入 类型/维度 单位 含义
qice real(in) kg/kg 水冰质量混合比
qccn real(in) kg/kg CCN 质量混合比
nccn real(in) kg⁻¹ CCN 数浓度
coeff real(in) 缩放因子(推断:当 microphys=T 时为 tauscaling,否则为 ccn_factor⁻¹,第 66 行注释)

updaterice_microco2

输入 类型/维度 单位 含义
qice double(in) kg/kg CO₂ 冰质量混合比
qccn double(in) kg/kg CO₂ CCN 质量混合比
nccn double(in) kg⁻¹ CO₂ CCN 数浓度
qccn_h2o / nccn_h2o double(in) kg/kg / kg⁻¹ 水 CCN 质量/数浓度
temperature real(in) K 用于 CO₂ 冰密度计算的温度
coeff real(in) 缩放因子

updaterice_typ

输入 类型/维度 单位 含义
qice real(in) kg/kg 水冰质量混合比
tau real(in) 尘埃光学厚度
pzlay real(in) m 层中点高度

updaterdust / updaterccn / updaterccnCO2

输入 类型/维度 单位 含义
qdust (qccn) real(in) kg/kg 尘埃(CCN)质量混合比
ndust (nccn) real(in) kg⁻¹ 尘埃(CCN)数浓度
tauscaling real(optional, in) 可选阈值缩放因子

输出

updaterice_micro

输出 类型/维度 单位 含义
rice real(out) m 水冰几何平均半径
rhocloud real(out) kg/m³ 云密度(水冰 + CCN 混合密度),供沉降使用

updaterice_microco2

输出 类型/维度 单位 含义
rice double(out) m CO₂ 冰几何平均半径
rhocloudco2 real(out) kg/m³ CO₂ 云密度(CO₂ 冰 + CCN + H₂O CCN 混合密度)

updaterice_typ / updaterdust / updaterccn / updaterccnCO2

输出 类型/维度 单位 含义
rice real(out) m 水冰几何平均半径
rdust real(out) m 尘埃几何平均半径
rccn real(out) m CCN 质量平均半径

共享状态与副作用

核心逻辑

updaterice_micro(第 60-93 行)

  1. 阈值保护(第 71-72 行):nccn_true = max(nccn*coeff, 1e-30)qccn_true = max(qccn*coeff, 1e-30)
  2. 云密度(第 79-80 行): rhocloud = (qice*rho_ice + qccn_true*rho_dust) / (qice + qccn_true) 限幅:rhocloud = min(max(rhocloud, rho_ice), rho_dust)
  3. 半径³(第 82 行): rice = (qice + qccn_true) * 0.75 / (π * rhocloud * nccn_true)
  4. 限幅取立方根(第 84-90 行):rice ≤ r3icemin → riceminrice ≥ r3icemax → ricemax;否则 rice^(1/3)

源码第 75-77 行警告:不可对 qccnnccn 设阈值来强制 rice = ricemin,否则小但非零的 qice 会得到极大的不透明度。

updaterice_microco2(第 97-138 行)

  1. 阈值保护(第 113-117 行):CCN 和 H₂O CCN 分别设下限。
  2. CO₂ 冰密度(第 119 行):call density_co2_ice(temperature, rho_ice_co2T) — 温度依赖。
  3. 云密度(第 121-123 行): rhocloudco2 = (qice*rho_ice_co2T + qccn_true*rho_dust + qccn_h2o_true*rho_ice) / (qice + qccn_true + qccn_h2o_true)
  4. 半径³(第 125 行): rice = (qice + qccn_true + qccn_h2o_true) * 0.75 / (π * rhocloudco2 * (nccn_true + nccn_h2o_true))
  5. 限幅取立方根(第 129-135 行):同 updaterice_micro 模式。

updaterice_typ(第 146-186 行)

  1. 典型 CCN 廓线(第 162 行,Montmessin et al. 2004): nccn = 1.3e+8 * max(tau, 0.001) / 0.1 * exp(-pzlay/10000) 源码注释:N₀ = 2e6 m⁻³ 已用典型密度换为 1.3e8 kg⁻¹
  2. nccn ≤ 1(第 166-168 行):直接返回 ricemin
  3. 否则(第 170-184 行):
    • 典型尘埃半径:rccn = max(rdust0 * exp(-pzlay/18000), 1e-9)(第 173 行)
    • R³ = qice * 0.75 / (π * rho_ice * nccn) + rccn³
    • 限幅取立方根。

updaterdust(第 203-238 行)

  1. 阈值缩放(第 213-217 行):若传了 tauscaling,用它缩放阈值;否则 coeff = 1
  2. 数浓度/质量过低(第 219-221 行):若 ndust ≤ ndust_threshold/coeffqdust ≤ qdust_threshold/coeff,返回 rdustmin
  3. 对数正态分布半径(第 225 行): R³ = r3n_q * qdust / ndust 源码第 199-201 行注释说明:几何平均半径 = 质量平均半径 × exp(-1.5 σ₀²),r3n_q = exp(-4.5 σ₀²) * (3/4) / (π * rho_dust)(源自 initracer.F90:611)。
  4. 限幅取立方根(第 227-233 行)。

updaterccn(第 255-292 行)

updaterdust 结构相同,但用 0.75 / (π * rho_dust * nccn) 计算 ,阈值用 nccn_threshold / qccn_threshold,限幅用 r3ccnmin/rccnminr3ccnmax/rccnmax

updaterccnCO2(第 308-340 行)

updaterccn 基本相同,差异:

伪代码

module updaterad:
  # 全局阈值参数(编译时常量)
  ricemin=1e-10, ricemax=500e-6, rdustmin=1e-8, rdustmax=500e-6, ...

  subroutine updaterice_micro(qice, qccn, nccn, coeff, rice, rhocloud):
    nccn_true = max(nccn*coeff, 1e-30)
    qccn_true = max(qccn*coeff, 1e-30)
    rhocloud = (qice*rho_ice + qccn_true*rho_dust) / (qice + qccn_true)
    rhocloud = clamp(rhocloud, rho_ice, rho_dust)
    R3 = (qice + qccn_true) * 0.75 / (pi * rhocloud * nccn_true)
    rice = clip_cuberoot(R3, r3icemin..r3icemax, ricemin..ricemax)

  subroutine updaterdust(qdust, ndust, rdust, [tauscaling]):
    coeff = tauscaling or 1
    if ndust < threshold or qdust < threshold: rdust = rdustmin; return
    R3 = r3n_q * qdust / ndust
    rdust = clip_cuberoot(R3, r3dustmin..r3dustmax, rdustmin..rdustmax)

  subroutine updaterice_typ(qice, tau, pzlay, rice):
    nccn = 1.3e8 * max(tau, 0.001)/0.1 * exp(-pzlay/10000)  # Montmessin 2004
    if nccn ≤ 1: rice = ricemin; return
    rccn = max(rdust0 * exp(-pzlay/18000), 1e-9)
    R3 = qice * 0.75 / (pi * rho_ice * nccn) + rccn^3
    rice = clip_cuberoot(R3, r3icemin..r3icemax, ricemin..ricemax)

  subroutine updaterice_microco2(qice, qccn, nccn, qccn_h2o, nccn_h2o, T, coeff, rice, rhocloudco2):
    rho_ice_co2T = density_co2_ice(T)  # 温度依赖密度
    rhocloudco2 = (qice*rho_ice_co2T + qccn_true*rho_dust + qccn_h2o_true*rho_ice) / sum_q
    R3 = sum_q * 0.75 / (pi * rhocloudco2 * sum_n)
    rice = clip_cuberoot(R3, r3iceco2min..r3iceco2max, riceco2min..riceco2max)

  # updaterccn / updaterccnCO2 结构类似 updaterdust

参与的主题流程

主题 参与方式
尘埃循环 callsedim_mod.F 第 437-467 行(doubleq 沉降前半径)和第 695-717 行(沉降后半径更新)调用 updaterdustupdatereffrad_mod.F 第 102、120、131 行也调用 updaterdust
水循环 callsedim_mod.F 第 733/745 行:微物理时调 updaterice_micro,否则调 updaterice_typwatercloud_mod.F 第 543-638 行同样调用三个子例程;improvedclouds_mod.F90 第 318 行调 updaterice_microsimpleclouds_mod.F 第 219 行调 updaterice_typ
CO₂ 循环与 CO₂ 云 co2cloud_mod.F90 第 783/1069 行调 updaterice_microco2improvedco2clouds_mod.F90 第 432/521 行同样调用

写法特点

复现要点

待确认

相关页面