improvedco2clouds_mod.F90
路径
LMDZ.MARS\libf\phymars\improvedco2clouds_mod.F90
所属目录/模块
libf/phymars
文件定位
CO2 云微物理核心模块。基于 improvedclouds_mod.F(水冰云)改编,包含 CO2 冰晶成核(尘埃、流星体、水冰三类 CCN)、质量增长/升华和 CCN 释放逻辑。被 co2cloud_mod 在每个微时间步调用。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
improvedco2clouds_mod |
module | 10 | CO2 云微物理核心模块 |
improvedCO2clouds |
subroutine | 62 | CO2 云成核、增长、升华主例程 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
comcstfi_h |
pi, g, cpp |
物理常数 | |
updaterad |
updaterice_micro, updaterice_microco2, updaterccnCO2 |
更新冰粒半径和 CCN | |
tracer_mod |
igcm_dust_mass/number, rho_dust, igcm_h2o_ice, igcm_ccn_mass/number, igcm_co2, igcm_co2_ice, igcm_ccnco2_mass/number, igcm_ccnco2_h2o_*, nuice_sed, nuiceco2_sed/ref, igcm_ccnco2_meteor_* |
tracer 索引和物理常数 | |
| conc_mod | mmean |
平均分子量 | |
tcondco2_mod |
tcondco2 |
CO2 凝结温度 | |
time_phylmdz_mod |
daysec |
一天秒数 | 待确认:代码中未直接使用 |
nucleaco2_mod |
nucleaco2 |
CO2 异质成核率 | |
datafile_mod |
datadir |
数据文件目录 | |
massflowrateco2_mod |
massflowrateco2 |
CO2 冰粒质量增长/升华通量 | |
density_co2_ice_mod |
density_co2_ice |
CO2 冰密度(温度依赖) | |
microphys_h |
nbinco2_cld, rad_cldco2, m0co2, mco2, mteta, mtetaco2 |
微物理参数 | |
callkeys_mod |
co2useh2o, meteo_flux |
运行时开关 |
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
co2sat |
(外部) | 行 315 | 计算 CO2 饱和蒸汽压 |
tcondco2 |
tcondco2_mod |
行 316 | 计算 CO2 凝结温度(输入含 co2 + co2_ice) |
updaterccnCO2 |
updaterad |
行 352 | 更新尘埃 CCN 半径 |
nucleaco2 |
nucleaco2_mod |
行 382, 413, 460 | 计算异质成核率(尘/流星/水冰各一次) |
updaterice_micro |
updaterad |
行 432 | 更新水冰粒半径(co2useh2o 时) |
density_co2_ice |
density_co2_ice_mod |
行 344 | 计算温度依赖的 CO2 冰密度 |
massflowrateco2 |
massflowrateco2_mod |
行 531 | 计算 CO2 冰粒质量增长/升华通量 |
updaterice_microco2 |
updaterad |
行 521 | 更新 CO2 冰粒半径和云密度 |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
ngrid |
co2cloud | INT | - | 格点数 |
nlay |
co2cloud | INT | - | 层数 |
microtimestep |
co2cloud | REAL | s | 微时间步长 |
pplay |
co2cloud | REAL (ngrid,nlay) | Pa | 层中气压 |
pplev |
co2cloud | REAL (ngrid,nlay+1) | Pa | 层界面气压 |
pteff |
co2cloud | REAL (ngrid,nlay) | K | 有效温度 |
sum_subpdt |
co2cloud | REAL (ngrid,nlay) | K/s | 温度倾向(之前过程) |
pqeff |
co2cloud | REAL (ngrid,nlay,nq) | kg/kg | tracer 混合比 |
sum_subpdq |
co2cloud | REAL (ngrid,nlay,nq) | kg/kg/s | tracer 倾向(之前过程) |
nq |
co2cloud | INT | - | tracer 数量 |
tauscaling |
co2cloud | REAL (ngrid) | - | 尘埃量转换因子 |
rb_cldco2 |
co2cloud | DOUBLE (nbinco2_cld+1) | m | CO2 冰粒半径 bin 边界(对数空间) |
sigma_iceco2 |
co2cloud | REAL | - | CO2 冰/CCN 分布方差 |
dev2 |
co2cloud | DOUBLE | - | 1/(sqrt(2)*sigma_iceco2) |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
subpdqcloudco2 |
co2cloud | REAL (ngrid,nlay,nq) | kg/kg/s | CO2 微物理产生的 tracer 倾向 |
subpdtcloudco2 |
co2cloud | REAL (ngrid,nlay) | K/s | CO2 微物理温度倾向(潜热) |
共享状态与副作用
- SAVE+THREADPRIVATE:
sigma_ice(水冰分布方差)、dev3、meteor(流星体通量数据)、pression_meteor、firstcall。 - firstcall:初始化
sigma_ice/dev3;meteo_flux=true时从Meteo_flux_Plane.dat读取流星体通量数据(130 层 × 100 bin)。 - 数据文件依赖:
Meteo_flux_Plane.dat(meteo_flux=true时必需,位于datadir)。
核心逻辑
firstcall 初始化(行 246-289):
sigma_ice = sqrt(log(1+nuice_sed));读取流星体通量文件。初始化(行 293-311):
zt = pteff + sum_subpdt*microtimestep,zq = pqeff + sum_subpdq*microtimestep(低于 threshold 归零),保存初始值zq0。计算饱和(行 315-316):
co2sat→zqsat(饱和蒸汽压);tcondco2→tcond(凝结温度,输入含co2 + co2_ice)。流星体 CCN 插值(行 320-332):将流星体通量从文件气压层插值到模式层,
meteor_ccn = meteor(idx_min,:)/masse。主循环(行 336-588)——对每个格点和层:
4.1 成核(
satu >= 1时,行 351-495):- 尘埃 CCN:展开尘埃 log-normal 分布为 binned
n_aer/m_aer,调用nucleaco2(接触因子mtetaco2=0.95),概率Proba = 1-exp(-microtimestep*rate),更新 ccnco2/dust tracer。 - 流星体 CCN(
meteo_flux=true):对meteor_ccn调用nucleaco2,更新 ccnco2_meteor 和 ccnco2 总量。 - 水冰 CCN(
co2useh2o=true):展开水冰 CCN 分布(用sigma_ice和dev3),调用nucleaco2(接触因子mteta),按ratioh2o_ccn分配质量到 ccnco2_h2o_mass_ice/ccn,从水冰/CCN 中扣除。
4.2 冰增长(
ccnco2_number*tauscaling >= 1时,行 503-555):- 更新
riceco2/rhocloudco2。 - 计算温度依赖潜热:
lw = l0 + l1*T + l2*T² + l3*T³ + l4*T⁴(Azreg-Aïnou 2005)。 - 能量限制:
facteurmax = |tcond-zt| * cpp/lw。 - 调用
massflowrateco2→Ic_rice(单粒子质量增长率 kg/s)。 dMice = ccnco2_number * Ic_rice * microtimestep * tauscaling。- 裁剪:
dMice ∈ [-facteurmax, -co2_ice] ∩ [-co2, facteurmax]。 - 更新:
co2_ice += dMice,co2 -= dMice,subpdtcloudco2 = dMice*lw/cpp/microtimestep。
4.3 CCN 释放(
co2_ice < threshold_2或ccnco2_number*tauscaling < 1时,行 558-586):- 尘埃 CCN 归还:
dust += ccnco2,ccnco2 = 0。 - 流星体 CCN:从 dust 中扣除流星体部分(避免重复计数),
ccnco2_meteor = 0。 - 水冰 CCN:ccnco2_h2o 归还到 ccn_mass/h2o_ice/ccn_number。
- CO2 气相回收:
co2 += co2_ice,co2_ice = 0。
- 尘埃 CCN:展开尘埃 log-normal 分布为 binned
倾向计算(行 592-627):
subpdqcloudco2 = (zq - zq0) / microtimestep,对所有相关 tracer。
伪代码
improvedCO2clouds(ngrid, nlay, microtimestep, ...):
if firstcall:
sigma_ice = sqrt(log(1+nuice_sed))
if meteo_flux: 读取 Meteo_flux_Plane.dat
zt = pteff + sum_subpdt * microtimestep
zq = pqeff + sum_subpdq * microtimestep (threshold 保护)
zq0 = zq
zqsat = co2sat(zt)
tcond = tcondco2(pplay, co2 + co2_ice)
if meteo_flux: 插值流星体通量到模式层
for l, ig:
pco2 = co2 * (mmean/mco2*1e3) * pplay
satu = pco2 / zqsat
rho_ice_co2T = density_co2_ice(zt)
// --- 成核 (satu >= 1) ---
尘埃 CCN: n_aer/m_aer = log-normal 展开, nucleaco2(mtetaco2), Proba=1-exp(-rate*dt)
流星体 CCN (meteo_flux): nucleaco2, 更新 ccnco2_meteor
水冰 CCN (co2useh2o): nucleaco2(mteta), 按 ratioh2o_ccn 分配
// --- 冰增长 (ccnco2_number >= 1) ---
lw = l0 + l1*T + l2*T² + l3*T³ + l4*T⁴
facteurmax = |tcond-zt| * cpp/lw
Ic_rice = massflowrateco2(pplay, zt, satu, riceco2, mmean)
dMice = ccnco2_number * Ic_rice * dt * tauscaling
dMice = clip(dMice, [-facteurmax, facteurmax])
co2_ice += dMice, co2 -= dMice
subpdtcloudco2 = dMice * lw / cpp / dt
// --- CCN 释放 (co2_ice ≈ 0) ---
dust += ccnco2, ccnco2 = 0
流星体/水冰 CCN 归还
co2 += co2_ice, co2_ice = 0
subpdqcloudco2 = (zq - zq0) / microtimestep
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| CO2 循环 (CO2-cycle) | 核心微物理:成核、冰增长/升华、CCN 转换 |
| CO2 循环主题页 | 主题入口 |
写法特点
- 自由格式 Fortran 90(.F90 后缀)。
- SAVE + THREADPRIVATE:
sigma_ice、dev3、meteor、pression_meteor、firstcall。 - firstcall 模式:读取流星体通量文件。
- 概率成核:
Proba = 1-exp(-microtimestep*rate)—— 将连续成核率转换为离散时间步的概率。 - 三类 CCN:尘埃(
mtetaco2=0.95)、流星体、水冰(mteta),每类独立调用nucleaco2。 - 能量限制:
facteurmax = |tcond-zt| * cpp/lw确保凝结/升华不违反热力学约束。 - 温度依赖潜热:
lw = l0 + l1*T + l2*T² + l3*T³ + l4*T⁴(Azreg-Aïnou 2005),4 阶多项式。 - CCN 释放:CO2 冰完全升华时,尘埃/流星体/水冰 CCN 归还原 tracer——保证质量守恒。
- 硬编码常数:
threshold=1e-30、threshold_2=1e-13、l0-l4(潜热系数)。
复现要点
tcondco2输入为co2 + co2_ice(行 316)——包含冰相,与co2cloud_mod中仅传co2_vap不同。co2sat输入为zt(有效温度 + 倾向),tcondco2输入为pplay和 tracer 值。- 潜热
lw使用 Azreg-Aïnou (2005) 4 阶多项式——与co2condens中的常数latcond=5.9e5不同(这里是温度依赖的)。 facteurmax使用cpp/lw(而非latcond)——单位分析:|ΔT| * cpp/lw为无量纲质量比。- 流星体 CCN 释放时从
dust中扣除(行 566-567)——因为成核时ccnco2 += meteor_ccn但dust未减,释放时需修正。 - 水冰 CCN 释放时分别归还
ccn_mass(CCN 部分)和h2o_ice(冰部分)。
待确认
time_phylmdz_mod::daysec在 use 列表中但代码中未直接使用——可能为遗留。nbin_meteor=100与nbinco2_cld=100相同——流星体 bin 与微物理 bin 一一对应。mtetavsmtetaco2:水冰 CCN 用mteta(来自microphys_h),尘埃用mtetaco2=0.95——两个接触参数。
复现风险
Meteo_flux_Plane.dat缺失(meteo_flux=true时)将导致abort_physic。- 概率成核在
microtimestep很大时可能过高估计成核数。 - 能量限制
facteurmax使用cpp(干空气比热)而非湿空气——在 CO2 丰富大气中近似合理。 - 潜热多项式在极端温度下可能外推出非物理值。
相关页面
- co2cloud_mod — CO2 云主调度 - 调用本模块
- co2-saturation-helpers — CO2 饱和与凝结温度 -
tcondco2/co2sat - density_co2_ice — CO2 冰密度 - 温度依赖密度
- updaterad — 冰粒/尘埃半径更新 -
updaterice_microco2/updaterccnCO2 - nucleaco2 — CO2 异质成核率 - 尘/流星/水冰三类 CCN 成核率
- massflowrateco2 — CO2 冰粒质量传输率 - 单粒子质量增长/升华通量
- CO2 循环主题页