co2condens
所属文件
LMDZ.MARS\libf\phymars\co2condens_mod.F
所属模块
co2condens_mod
例程定位
SUBROUTINE co2condens (行 11–890)
例程职责
CO2 地表和大气凝结/升华的主调度例程。根据 Forget et al. (Icarus, 1998) 方案,处理:
- 大气中 CO2 凝结/升华(
co2clouds=false时自行计算,co2clouds=true时接收微物理方案的沉降通量) - 地表 CO2 冰凝结/升华(含降雪撞击加热、可用 CO2 tracer 限制、冰层完全升华保护)
- 地表 CO2 冰 albedo/emissivity 更新
- sigma 层校正(Van Leer 垂直输送 T/U/V/Q)
- 调用
co2snow更新地表发射率 - 可选的 CO2 清除尘埃/水冰(
scavenging_by_co2)
被调用例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
co2snow |
co2snow_mod |
行 841 | 更新地表发射率(CO2 雪/冰覆盖效应) |
albedocaps |
albedocaps_mod |
行 617 | 更新极冠 albedo 和 emisref |
scavenging_by_co2 |
本文件 | 行 359 | CO2 凝结清除尘埃/水冰(scavco2cond=true 时) |
vl1d |
本文件 | 行 703-712 | Van Leer 1D 垂直输送算子 |
abort_physic |
(GCM 内部) | 行 559, 724, 980 | 异常终止 |
write_output |
write_output_mod |
行 368, 389, 394 | 诊断输出 |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
ngrid |
physiq | INT | - | 大气格点数 |
nlayer |
physiq | INT | - | 大气层数 |
nq |
physiq | INT | - | tracer 数量 |
nslope |
physiq | INT | - | 子坡面数 |
ptimestep |
physiq | REAL | s | 物理时间步长 |
pcapcal |
physiq | REAL (ngrid,nslope) | J/K | 地表热容量 |
pplay |
physiq | REAL (ngrid,nlayer) | Pa | 层中气压 |
pplev |
physiq | REAL (ngrid,nlayer+1) | Pa | 层界面气压 |
ptsrf |
physiq | REAL (ngrid,nslope) | K | 地表温度 |
pt |
physiq | REAL (ngrid,nlayer) | K | 大气温度 |
pphi |
physiq | REAL (ngrid,nlayer) | m²/s² | 位势高度 |
pdt |
physiq | REAL (ngrid,nlayer) | K/s | 温度倾向(其他过程) |
pdu/pdv |
physiq | REAL (ngrid,nlayer) | m/s² | 风速倾向 |
pdtsrf |
physiq | REAL (ngrid,nslope) | K/s | 地表温度倾向 |
pu/pv |
physiq | REAL (ngrid,nlayer) | m/s | 风速 |
pq |
physiq | REAL (ngrid,nlay,nq) | kg/kg | tracer 混合比 |
pdq |
physiq | REAL (ngrid,nlay,nq) | kg/kg/s | tracer 倾向 |
zdqssed_co2 |
co2cloud | REAL (ngrid) | kg/m²/s | CO2 冰地表沉积通量(co2clouds=true 时) |
pcondicea_co2microp |
co2cloud | REAL (ngrid,nlayer) | kg/kg/s | CO2 凝结速率(co2clouds=true 时) |
fluxsurf_sw |
physiq | REAL (ngrid,2) | - | 地表短波通量 |
zls |
physiq | REAL | rad | 太阳经度 |
rdust |
physiq | REAL (ngrid,nlayer) | m | 尘埃有效半径 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
pdtc |
physiq | REAL (ngrid,nlayer) | K/s | CO2 凝结/升华温度倾向 |
pdtsrfc |
physiq | REAL (ngrid,nslope) | K/s | 地表温度倾向 |
pdpsrf |
physiq | REAL (ngrid) | Pa/s | 地面气压倾向 |
pduc/pdvc |
physiq | REAL (ngrid,nlayer) | m/s² | 风速倾向 |
pdqc |
physiq | REAL (ngrid,nlayer,nq) | kg/kg/s | tracer 倾向 |
pdqsc |
physiq | REAL (ngrid,nq,nslope) | kg/m²/s | 地表 tracer 倾向 |
INOUT 参数
| 参数 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|
piceco2 |
REAL (ngrid,nslope) | kg/m² | 地表 CO2 冰量 |
perennial_co2ice |
REAL (ngrid,nslope) | kg/m² | 多年 CO2 冰量(paleoclimate 用) |
psolaralb |
REAL (ngrid,2,nslope) | - | 地表 albedo |
pemisurf |
REAL (ngrid,nslope) | - | 地表发射率 |
共享状态与副作用
- module 变量:
scavco2cond(SAVE+THREADPRIVATE,默认.false.)控制 CO2 清除开关;CO2cond_ps(SAVE,默认 1.0)控制地表气压变化系数。 - SAVE+THREADPRIVATE:
ico2(CO2 tracer 索引)、qco2、mmean、acond/bcond/ccond(凝结公式系数)、m_co2/m_noco2/A/B(分子量参数)、firstcall。 - firstcall:初始化凝结公式系数,搜索 CO2 tracer 索引,打印诊断。
- 诊断输出:
co2condens_zfallice(CO2 降雪通量)、co2condens_pdtc(凝结温度倾向)。
核心逻辑
firstcall 初始化(行 203-230)
- 凝结公式系数:
bcond = 1/tcond1mb(tcond1mb=136.27 K @ 1 mbar),ccond = cpp/(g*latcond),acond = r/latcond。 - 搜索 CO2 tracer:遍历所有 tracer 找到
noms(iq)="co2",记录ico2。 - 分子量参数:
m_co2 = 44.01e-3,m_noco2 = 33.37e-3,A = 1/m_co2 - 1/m_noco2,B = 1/m_noco2。 - 平均分子量:
mmean = 1/(A*qco2 + B)。
大气凝结(行 283-392)
CO2 体积混合比(行 288-303):
improved_ztcond=true(硬编码参数)且ico2≠0:vmr_co2 = qco2 * mmean / m_co2。- 否则:
vmr_co2 = 0.95(假设 95% CO2)。
分支:co2clouds=false(自计算凝结)(行 305-367):
- 凝结温度:
ztcond = 1/(bcond - acond*log(0.01*vmr_co2*pplay))。 - 从顶层向下循环:若
zt < ztcond或有降雪落入,凝结发生。 - 凝结率:
zcondicea = (pplev(l)-pplev(l+1)) * ccond * (ztcond-zt)/ptimestep - zfallheat。 - 降雪落入加热:
zfallheat = zfallice(l+1) * (ΔΦ + cpice*(ztcond(l+1)-ztcond(l))) / latcond。 - 冰完全升华保护:若
zfallice(l+1) < -zcondicea,限制凝结率。 - 可选
scavenging_by_co2清除尘埃/水冰。
分支:co2clouds=true(接收微物理方案)(行 371-392):
condens_layer = pcondicea_co2microp * Δp / g。zfallice(1) = zdqssed_co2。piceco2 += zdqssed_co2 * ptimestep。
地表凝结/升华(行 402-563)
- 地表凝结温度:
ztcondsol = 1/(bcond - acond*log(0.01*vmr_co2(1)*pplev(1)))。 - 对每个格点和子坡面:
- 条件:
ztsrf < ztcondsol(凝结)或有降雪或有冰可升华。 - 凝结率:
zcondices = pcapcal*(ztcondsol-ztsrf) / ((latcond+cpp*(zt(1)-ztcond))*ptimestep) - zfallheat。 - 升华率:
zcondices = pcapcal*(ztcondsol-ztsrf) / (latcond*ptimestep) - zfallheat。 - 可用 CO2 限制(
ico2≠0):若第一层 CO2 不够凝结,限制zcondices。 - 冰完全升华保护。
- 更新
piceco2、pdpsrf = -g * zdiceco2_mesh_avg。
- 条件:
pdpsrf超过总气压时abort_physic。
Albedo/emissivity 更新(行 566-627)
- paleoclimate 时分离
piceco2和perennial_co2ice。 - 负值保护(阈值 -5e-8 打印警告,强制归零)。
- 调用
albedocaps更新 albedo 和 emisref。 - 无冰时
pemisurf = emissiv。
Sigma 层校正(行 630-825)
对有凝结/升华的格点:
- 计算质量通量
zmflux:zmflux(1) = -zcondices_mesh_avg - zdqssed_co2,逐层减去condens_layer。 - Van Leer 输送(
vl1d)计算 T/U/V/Q 的界面值。 - 计算
zdtsig(温度倾向)、pduc/pdvc(风速倾向)、pdqc(tracer 倾向)。 - CO2 tracer 特殊处理:凝结时
pdqc(co2)含(zqm(co2)-1)项(CO2 从气相移除)。
南极极冠锁定(行 871-888)
caps=true 且 obliquit<27° 且非 paleoclimate 时,将南极点地表温度锁定为 ztcondsol。
伪代码
co2condens(ngrid, nlayer, nq, nslope, ptimestep, ...):
if firstcall:
bcond = 1/136.27, ccond = cpp/(g*latcond), acond = r/latcond
搜索 ico2, 计算 A, B, m_co2, m_noco2
zt = pt + pdt*ptimestep
zq = pq + pdq*ptimestep
// --- CO2 体积混合比 ---
if improved_ztcond and ico2≠0:
vmr_co2 = qco2 * mmean / m_co2
else:
vmr_co2 = 0.95
// --- 大气凝结 ---
if NOT co2clouds:
ztcond = 1/(bcond - acond*log(0.01*vmr_co2*pplay))
从顶层向下: zt < ztcond → 凝结, 计算 zcondicea, zfallice
可选 scavenging_by_co2
else:
condens_layer = pcondicea_co2microp * Δp/g
zfallice(1) = zdqssed_co2
piceco2 += zdqssed_co2 * ptimestep
// --- 地表凝结/升华 ---
ztcondsol = 1/(bcond - acond*log(0.01*vmr_co2(1)*pplev(1)))
对每个 ig, islope:
ztsrf < ztcondsol → 凝结, 否则升华
可用 CO2 限制, 冰完全升华保护
更新 piceco2, pdpsrf
// --- Albedo/emissivity ---
albedocaps → 更新 albedo, emisref
无冰时 pemisurf = emissiv
// --- Sigma 层校正 ---
计算 zmflux, vl1d 输送 T/U/V/Q
pdtc += zdtsig, pduc/pdvc/pdqc 更新
// --- CO2 snow ---
co2snow → 更新 pemisurf
// --- 南极锁定 ---
if caps and obliquit<27: pdtsrfc(south_pole) = (ztcondsol-ztsrf)/ptimestep
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| CO2 循环 (CO2-cycle) | 核心:地表和大气 CO2 凝结/升华、地表冰量和气压变化、极冠 albedo/emissivity |
| 尘埃循环 (dust-cycle) | 清除路径:scavenging_by_co2 时尘埃被 CO2 冰捕获 |
写法特点
- 固定格式 Fortran 77(.F 后缀,续行用第 6 列
&或c注释)。 - SAVE + THREADPRIVATE:
ico2、qco2、mmean、acond/bcond/ccond、m_co2/m_noco2/A/B、firstcall。 - firstcall 模式。
- 硬编码常数:
latcond = 5.9e5 J/kg、tcond1mb = 136.27 K、cpice = 1000 J/kg/K、m_co2 = 44.01e-3 kg/mol、m_noco2 = 33.37e-3 kg/mol、improved_ztcond = .true.(逻辑参数)。 - 子坡面循环:对
nslope个子坡面分别计算凝结/升华,按cos(slope)加权求网格平均。 - co2clouds 双路径:
co2clouds=false时自行计算大气凝结(含 ztcond、zfallice),co2clouds=true时接收 co2cloud 微物理方案的沉降通量。 - vl1d Van Leer 输送:行 895-1014,1D 垂直输送算子,处理 T/U/V/Q 和同位素比。
- scavenging_by_co2:行 1017-1159,CO2 凝结时清除尘埃/水冰(
scav_ratio=20),升华时释放。
复现要点
improved_ztcond = .true.硬编码——使用 CO2 分压计算凝结温度(而非固定 95% CO2)。m_noco2 = 33.37e-3非凝结气体平均分子量——假设大气仅含 CO2 和"非凝结气体"。scav_ratio_dust = 20硬编码——注释说"20 是在极夜去除尘埃而不干涸水循环的好折衷"。latcond = 5.9e5 J/kg(CO2 冰升华潜热),tcond1mb = 136.27 K(1 mbar 凝结温度)。- 地表凝结率公式中分母含
cpp*(zt(1)-ztcond)修正项(凝结时),升华时无此修正。 - 南极极冠锁定仅在
caps=true且obliquit<27°且非paleoclimate时生效。
待确认
CO2cond_psmodule 变量声明但代码中未使用——可能是遗留参数。improved_ztcond为逻辑参数(.true.)——始终使用分压计算,旧路径(vmr_co2=0.95)可能为历史遗留。scavenging_by_co2中scav_ccn_number的积累使用了scav_dust_number(l+1)而非scav_ccn_number(l+1)(行 1132)——可能是 bug。co2condens不计算pdqcloudco2(co2)——此倾向在此例程中通过 sigma 层校正的pdqc(co2)实现(含zqm(co2)-1项),而非 watercloud 式的pdqcloudco2。
复现风险
m_noco2 = 33.37e-3假设非凝结气体分子量——与实际火星大气不完全一致。scav_ratio_dust = 20硬编码——改变此值会显著影响尘埃清除和水循环。- 地表凝结/升华公式中
pcapcal(地表热容量)直接影响凝结率——不同pcapcal配置结果差异大。
相关页面
- co2cloud_mod — CO2 云主调度 - 提供
zdqssed_co2和pcondicea_co2microp - co2-saturation-helpers — CO2 饱和与凝结温度 -
tcondco2/co2sat的热力学基础 - co2snow — CO2 雪/地表沉积 - 地表发射率更新
- CO2 循环主题页
- co2condens-scavenging — CO2 清除尘埃/水冰 - scavenging 段详细逻辑