updaterad.F90
路径
LMDZ.MARS\libf\phymars\updaterad.F90
所属目录/模块
libf/phymars
文件定位
源码依据(第 5-7 行注释):本模块将 GCM 中所有冰和尘埃的有效半径计算集中到一处,使全代码中的粒径计算保持一致,并让"大量半径 bug"更容易排查。
源码依据(第 9-11 行注释):半径计算并非总在整个格点上执行(参见 improvedcloud),因此子例程设计为标量接口(逐格点逐层调用),而非数组接口。
在系统中,updaterad 是尘埃循环、水循环和 CO₂ 云循环中粒子粒径更新的底层统一计算工具。它被 callsedim_mod、improvedclouds_mod、watercloud_mod、simpleclouds_mod、co2cloud_mod、improvedco2clouds_mod 和 updatereffrad_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 质量平均半径 |
共享状态与副作用
- 模块级参数:16 个阈值/限幅常数(第 18-50 行),为编译时常量(
parameter),不可运行时修改。
- 无
SAVE/THREADPRIVATE 变量:所有计算为无状态纯函数。
- 无文件 I/O,无诊断输出。
核心逻辑
updaterice_micro(第 60-93 行)
- 阈值保护(第 71-72 行):
nccn_true = max(nccn*coeff, 1e-30),qccn_true = max(qccn*coeff, 1e-30)。
- 云密度(第 79-80 行):
rhocloud = (qice*rho_ice + qccn_true*rho_dust) / (qice + qccn_true) 限幅:rhocloud = min(max(rhocloud, rho_ice), rho_dust)
- 半径³(第 82 行):
rice = (qice + qccn_true) * 0.75 / (π * rhocloud * nccn_true)
- 限幅取立方根(第 84-90 行):
rice ≤ r3icemin → ricemin;rice ≥ r3icemax → ricemax;否则 rice^(1/3)。
源码第 75-77 行警告:不可对 qccn 或 nccn 设阈值来强制 rice = ricemin,否则小但非零的 qice 会得到极大的不透明度。
updaterice_microco2(第 97-138 行)
- 阈值保护(第 113-117 行):CCN 和 H₂O CCN 分别设下限。
- CO₂ 冰密度(第 119 行):
call density_co2_ice(temperature, rho_ice_co2T) — 温度依赖。
- 云密度(第 121-123 行):
rhocloudco2 = (qice*rho_ice_co2T + qccn_true*rho_dust + qccn_h2o_true*rho_ice) / (qice + qccn_true + qccn_h2o_true)
- 半径³(第 125 行):
rice = (qice + qccn_true + qccn_h2o_true) * 0.75 / (π * rhocloudco2 * (nccn_true + nccn_h2o_true))
- 限幅取立方根(第 129-135 行):同
updaterice_micro 模式。
updaterice_typ(第 146-186 行)
- 典型 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⁻¹。
- 若
nccn ≤ 1(第 166-168 行):直接返回 ricemin。
- 否则(第 170-184 行):
- 典型尘埃半径:
rccn = max(rdust0 * exp(-pzlay/18000), 1e-9)(第 173 行)
R³ = qice * 0.75 / (π * rho_ice * nccn) + rccn³
- 限幅取立方根。
updaterdust(第 203-238 行)
- 阈值缩放(第 213-217 行):若传了
tauscaling,用它缩放阈值;否则 coeff = 1。
- 数浓度/质量过低(第 219-221 行):若
ndust ≤ ndust_threshold/coeff 或 qdust ≤ qdust_threshold/coeff,返回 rdustmin。
- 对数正态分布半径(第 225 行):
R³ = r3n_q * qdust / ndust 源码第 199-201 行注释说明:几何平均半径 = 质量平均半径 × exp(-1.5 σ₀²),r3n_q = exp(-4.5 σ₀²) * (3/4) / (π * rho_dust)(源自 initracer.F90:611)。
- 限幅取立方根(第 227-233 行)。
updaterccn(第 255-292 行)
与 updaterdust 结构相同,但用 0.75 / (π * rho_dust * nccn) 计算 R³,阈值用 nccn_threshold / qccn_threshold,限幅用 r3ccnmin/rccnmin 和 r3ccnmax/rccnmax。
updaterccnCO2(第 308-340 行)
与 updaterccn 基本相同,差异:
- 最低半径用
rccnCO2min(1e-9 m,第 329 行)而非 rccnmin。
- 无
r3ccnmax 上限保护,取立方根后硬编码 rccn = min(5e-4, rccn)(第 338 行,上限 500 μm)。
伪代码
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 行(沉降后半径更新)调用 updaterdust;updatereffrad_mod.F 第 102、120、131 行也调用 updaterdust |
| 水循环 |
callsedim_mod.F 第 733/745 行:微物理时调 updaterice_micro,否则调 updaterice_typ;watercloud_mod.F 第 543-638 行同样调用三个子例程;improvedclouds_mod.F90 第 318 行调 updaterice_micro;simpleclouds_mod.F 第 219 行调 updaterice_typ |
| CO₂ 循环与 CO₂ 云 |
co2cloud_mod.F90 第 783/1069 行调 updaterice_microco2;improvedco2clouds_mod.F90 第 432/521 行同样调用 |
写法特点
- 标量接口设计(第 9-11 行注释):所有子例程接受标量而非数组,因为半径计算并非总在全部格点上执行(亚格点云
improvedcloud 模式),调用方逐格点逐层循环调用。
parameter 编译时常量(第 18-50 行):所有阈值和限幅值均为模块内部 parameter,不可通过 .def 文件覆盖。若需调参必须修改源码。
- 立方根 + 限幅的统一模式:6 个子例程中 5 个使用相同的
if R³ ≤ min → r_min; elif R³ ≥ max → r_max; else R = R^(1/3) 模式。唯一例外是 updaterccnCO2,它跳过了上限保护,改用硬编码 min(5e-4, rccn)。
optional 参数 tauscaling(第 209、261、313 行):提供时用于缩放阈值("realistic values"),不提供时阈值使用虚拟值(第 214-216 行注释)。
updaterice_micro 中 rhocloud 的双重计算(第 121-127 行 updaterice_microco2):rhocloudco2 先在第 121 行计算,然后在第 127 行再次计算(在限幅 min/max 之后),推断:第 121 行用于 rice 计算,第 127 行恢复未限幅的真实密度作为输出。
updaterice_typ 中的 rccn 命名混淆(第 173 行):此处 rccn 实际表示尘埃 CCN(冰核)半径,与水 CCN 子例程中的 rccn 含义不同。
复现要点
r3n_q 的初始化:r3n_q = exp(-4.5 * varian²) * (3/4) / (π * rho_dust)(initracer.F90:611)。varian 为对数正态分布的标准差参数。重新实现时必须确保此系数与 initracer 中的一致。
updaterice_micro 的 qccn 阈值警告(第 75-77 行注释):绝不要对 qccn 或 nccn 设阈值来强制 rice = ricemin,否则小但非零的 qice 会得到极大的云不透明度。重新实现时必须保留此约束。
coeff 参数的双重语义(第 66 行注释):当 microphys=T 时为 tauscaling,否则可能为 ccn_factor⁻¹。重新实现时需明确调用方传入的语义。
updaterice_typ 的两个特征高度:N₀ 随高度衰减的尺度高度为 10000 m(第 162 行);典型尘埃半径衰减的尺度高度为 18000 m(第 173 行)。这两个值影响非微物理模式下的水冰半径剖面。
updaterccnCO2 的上限硬编码(第 338 行):rccn = min(5e-4, rccn),即 500 μm 上限,但不使用 r3ccnmax 限幅保护。重新实现时需保持一致。
- 复现风险:
updaterice_microco2 中 rhocloudco2 被计算了两次(第 121 行和第 127 行),第二次恢复了未被 min/max 限幅的真实密度值作为输出。如果误解此意图,输出的 rhocloudco2 可能不正确。
- 复现风险:所有阈值参数均为编译时常量,无法通过
callphys.def 等运行时配置修改。重新实现时若希望可调,需改为模块变量 + 读取配置的方式。
待确认
- 待确认:
coeff 参数在非微物理模式下的具体含义("possibly ccn_factor⁻¹",第 66 行注释使用 "possibly" 表示作者不确定)。
- 待确认:
updaterice_microco2 两次计算 rhocloudco2 的意图——推断第一次用于 rice,第二次用于输出真实密度,但代码注释未明确说明。
- 待确认:
qice_threshold(1e-15)和 qice_co2_threshold(1e-30)定义但在本模块中未被使用——推断留给调用方或 updatereffrad_mod。
- 待确认:
updaterice_typ 中 rccn 变量名与水 CCN updaterccn 的同名变量是否存在语义混用的风险。
相关页面