physiq CO2 循环调用点
本页只追踪 physiq 主时间步循环中与 CO2 循环直接相关的两个调用点 co2cloud(大气 CO2 云微物理)和 co2condens(地表/大气 CO2 凝结升华),以及它们的输入/输出、tendency 注入顺序、与沉降/诊断的关系。不覆盖 physiq 的其他物理过程。
所属文件
LMDZ.MARS\libf\phymars\physiq_mod.F
所属模块
physiq_mod(SUBROUTINE physiq / physiq_mod 内)
相关 use 语句
| 行 | 语句 | 引入对象 |
|---|---|---|
| 19 | use co2condens_mod, only: co2condens, CO2cond_ps |
CO2 凝结主例程;1D 表压变化系数 |
| 20 | use co2cloud_mod, only: co2cloud |
CO2 云微物理调度例程 |
| 148 | use callkeys_mod, only: hdo, co2clouds, co2useh2o, meteo_flux |
CO2 云开关、H2O-on-CO2 成核开关、流星 CCN 开关 |
| 149 | use callkeys_mod, only: callsoil, callslope, callcond |
callcond 控制是否调用 co2condens |
co2cloud 受 co2clouds 控制,co2condens 受 callcond 控制;两者是各自独立的开关。
调用顺序总览
在主时间步内,CO2 相关两个调用点出现在不同物理段,顺序如下(行号为大致定位):
- 第 9a bis 段(行 1912–2102)CO2 云微物理:
IF (co2clouds)→call co2cloud(行 1934)。CO2 云示踪物的沉降在co2cloud的微时间步内部完成(注释行 2140),不进入第 9b 段callsedim。 - 第 9b 段(行 2104+)气溶胶/沉降:
callsedim(行 2143)处理尘埃/水冰沉降;CO2 冰示踪物已在上一步内部沉降。 - 第 10 段(行 2280)热层:
callthermos时调用thermosphere。 - 第 11 段(行 2295–2404)CO2 凝结:注释明确“should be the last atmospherical physical process to be computed”(行 2297)。
IF (callcond)→call co2condens(行 2315)。其后才更新地表表压ps与压力层zplay/zplev/zzlay/zzlev。
因此 co2condens 是大气物理过程链的最后一步;表压/坐标更新依赖它输出的 pdpsrf。
调用点 1:co2cloud(行 1934)
控制条件
IF (co2clouds) THEN(行 1933)。进入前先清零地表沉降累加器:zdqssed_co2(:)=0.、zdqssed_ccn(:,:)=0.(行 1930–1931)。
调用语句
call co2cloud(ngrid,nlayer,ptimestep,
zplev,zplay,pdpsrf,zzlay,pt,pdt,
pq,pdq,zdqcloudco2,zdtcloudco2,
nq,tau,tauscaling,rdust,rice,riceco2,nuice,
rhocloud, rsedcloudco2,rhocloudco2,zzlev,zdqssed_co2,
zdqssed_ccn,pdu,pu,zcondicea_co2microp)
主要输入
| 变量 | 含义 |
|---|---|
zplev,zplay,zzlay,zzlev |
压力层/层间高度 |
pt,pdt |
温度及当前累计温度 tendency |
pq,pdq |
示踪物及当前累计 tendency |
rice,riceco2,nuice |
水冰/CO2 冰有效半径与方差 |
tau,tauscaling |
尘埃光学厚度及缩放 |
主要输出(co2cloud 返回的局部 tendency)
| 变量 | 含义 |
|---|---|
zdqcloudco2(:,:,:) |
各示踪物的云微物理 tendency |
zdtcloudco2(:,:) |
潜热释放温度 tendency |
zdqssed_co2(:) |
CO2 冰地表沉降通量 |
zdqssed_ccn(:,:) |
CCN 地表沉降通量(各示踪物) |
zcondicea_co2microp(:,:) |
微物理凝结率(传递给 co2condens,见调用点 2) |
调用后的 tendency 注入(行 1941–2101)
- 地表 CCN 沉降(行 1941–1948):
dqsurf(ig,iq,islope) += zdqssed_ccn(ig,iq)*cos(pi*def_slope_mean(islope)/180.),按坡度投影分配到各islope。 - 潜热温度(行 1950–1952):
pdt += zdtcloudco2。 - 无条件示踪物增量(行 1958–1974):
dust_mass、dust_number、co2、co2_ice、ccnco2_mass、ccnco2_number各自pdq += zdqcloudco2。 if (meteo_flux)(行 1976–1984):增量ccnco2_meteor_mass、ccnco2_meteor_number。if (co2useh2o)(行 1986–2054):增量h2o_ice、ccn_mass、ccn_number、ccnco2_h2o_mass_ice、ccnco2_h2o_mass_ccn、ccnco2_h2o_number;随后多组where负值保护(把对应 tendency 重置为-pq/ptimestep + 1.e-30,确保更新后非负)。ccnco2主族负值保护(行 2055–2069):ccnco2_mass/ccnco2_number任一将变负则两者一起重置。dust负值保护(行 2071–2085):dust_mass/dust_number成对重置。if (meteo_flux)meteor 负值保护(行 2086–2101):ccnco2_meteor_mass/ccnco2_meteor_number成对重置。
负值保护的统一模式:质量与数量是耦合的,任一变负就把这一对都钳到 -pq/ptimestep + 1.e-30,保证 pq + ptimestep*pdq ≥ 1.e-30。
调用点 2:co2condens(行 2315)
控制条件
IF (callcond) THEN(行 2308)。进入前清零所有输出累加器:zdtc, zdtsurfc, zduc, zdvc, zdqc, zdqsc(行 2309–2314)。
可选前置(行 2299–2305):IF (tituscap) 时调用 geticecover 用 Titus 观测覆盖 qsurf_tmp(:,igcm_co2)(单位换算 ×10000)。
调用语句
CALL co2condens(ngrid,nlayer,nq,nslope,ptimestep,
capcal,zplay,zplev,tsurf,pt,
pphi,pdt,pdu,pdv,zdtsurf,pu,pv,pq,pdq,
qsurf(:,igcm_co2,:),perennial_co2ice,
albedo,emis,rdust,
zdtc,zdtsurfc,pdpsrf,zduc,zdvc,zdqc,
fluxsurf_dn_sw,zls,
zdqssed_co2,zcondicea_co2microp,
zdqsc)
关键耦合输入
| 变量 | 来源 | 含义 |
|---|---|---|
zdqssed_co2 |
调用点 1(co2cloud) |
CO2 冰地表沉降通量 |
zcondicea_co2microp |
调用点 1(co2cloud) |
微物理凝结率,co2clouds=true 时 co2condens 用它代替自算大气凝结 |
qsurf(:,igcm_co2,:) |
地表 CO2 冰储库 | 按坡度分量 |
capcal,emis,albedo |
地表能量/光学属性 | 凝结后更新 |
co2cloud 的两个输出 zdqssed_co2 与 zcondicea_co2microp 是连接两个调用点的关键纽带:大气 CO2 凝结的“计算”在 co2cloud 完成,co2condens 据此处理地表沉积与层质量/动量校正。
主要输出
| 变量 | 含义 |
|---|---|
zdtc(:,:) |
大气温度 tendency |
zdtsurfc(:,:) |
地表温度 tendency(按 islope) |
zduc,zdvc(:,:) |
风场 tendency(sigma 层校正) |
zdqc(:,:,:) |
示踪物 tendency |
zdqsc(:,:,:) |
地表示踪物(CO2 冰)tendency |
pdpsrf(:) |
表压变化率 |
调用后的处理(行 2325–2403)
- 1D 模型缩放(行 2325–2331):
if (ngrid == 1)时pdpsrf, zduc, zdvc, zdqc各乘CO2cond_ps(控制 1D 表压变化幅度)。 - 地表示踪物累加(行 2333–2337):
dqsurf(ig,iq,:) += zdqsc(ig,iq,:)。 - 大气 tendency 注入(行 2338–2344):
pdt += zdtc、pdv += zdvc、pdu += zduc。 - 地表温度(行 2345–2347):
zdtsurf += zdtsurfc。 - 示踪物 tendency(行 2349–2355):
pdq += zdqc。 #ifndef MESOSCALE表压与坐标更新(行 2357–2403):ps(ig) = zplev(ig,1) + pdpsrf(ig)*ptimestep(行 2360)。- 用更新后的
ps重算zplay = aps + bps*ps、zplev = ap + bp*ps(行 2363–2369),顶层zplev(:,nlayer+1)=0.。 - 重算各层高度
zzlay(用对数平均温度tlaymean与高度依赖重力gz,行 2372–2402)和层间高度zzlev。
只有 co2condens 后才更新表压/垂直坐标,因为它是改变总气柱质量(CO2 凝结到地表)的过程。中尺度版(MESOSCALE)跳过这段,由动力核处理。
与后续地表/土壤更新的关系
- 行 2409–2416:
qsurf += ptimestep*dqsurf,把(含co2cloud的 CCN 沉降与co2condens的 CO2 冰)地表 tendency 累加进储库。 - 行 2425–2429:
tsurf += ptimestep*zdtsurf(含zdtsurfc),随后进入土壤温度(第 12 段)。
CO2 循环诊断/输出调用点
| 位置 | 条件 | 内容 |
|---|---|---|
| 行 2948–2963 | if (co2clouds) |
计算柱积分 vaptotco2、icetotco2、mtotco2(CO2 气/冰/总柱质量) |
| 行 3090–3100 | if (co2clouds)(#ifndef MESOSCALE WSTATS 段内) |
wstats 累计 mtotco2/icetotco2/vaptotco2 |
| 行 3457–3499 | if (igcm_co2.ne.0) 内 if (co2clouds) |
write_output 输出 co2、ccnqco2、ccnNco2、co2_ice、mtotco2、icetotco2、vaptotco2;co2useh2o 子块输出 ccnqco2_h2o_m_ice/m_ccn/ccnNco2_h2o;meteo_flux 子块输出 ccnqco2_meteor/ccnNco2_meteor |
控制流程小结
[第 9a bis 段] IF (co2clouds):
zero zdqssed_co2, zdqssed_ccn
call co2cloud -> zdqcloudco2, zdtcloudco2, zdqssed_co2, zdqssed_ccn, zcondicea_co2microp
dqsurf += zdqssed_ccn (per islope)
pdt += zdtcloudco2
pdq += zdqcloudco2 (dust, co2, co2_ice, ccnco2 主族)
IF (meteo_flux): pdq += meteor 族
IF (co2useh2o): pdq += h2o_ice/ccn/ccnco2_h2o 族 + 负值保护
负值保护 (ccnco2 主族 / dust / meteor)
[第 9b 段] callsedim (CO2 示踪物已在 co2cloud 内沉降,跳过)
[第 11 段] IF (callcond):
IF (tituscap): geticecover -> qsurf_tmp(co2)
zero zdtc/zdtsurfc/zduc/zdvc/zdqc/zdqsc
call co2condens(..., zdqssed_co2, zcondicea_co2microp, ...)
-> zdtc, zdtsurfc, zduc, zdvc, zdqc, zdqsc, pdpsrf
IF (ngrid==1): 各输出 *= CO2cond_ps
dqsurf += zdqsc; pdt += zdtc; pdv += zdvc; pdu += zduc
zdtsurf += zdtsurfc; pdq += zdqc
#ifndef MESOSCALE: 用 pdpsrf 更新 ps, zplay, zplev, zzlay, zzlev
[第 11 段后] qsurf += ptimestep*dqsurf; tsurf += ptimestep*zdtsurf
[诊断] co2clouds 柱积分; wstats; write_output (含 co2useh2o / meteo_flux 子块)
复现注意事项
co2cloud与co2condens受不同开关控制(co2cloudsvscallcond)。常规模拟两者都开;只开callcond不开co2clouds时co2condens自算大气凝结,zcondicea_co2microp为零(推断,需在co2condens内确认其零值分支)。co2condens必须是最后一个大气物理过程:表压/垂直坐标重算依赖它的pdpsrf。改变调用顺序会破坏气柱质量守恒。- CO2 云示踪物沉降在
co2cloud微时间步内部完成,不经过第 9b 段callsedim;统计气柱沉降通量时需用zdqssed_co2。 - 所有
ccnco2族 tendency 注入都配成对负值保护(质量+数量一起钳制),复现时不能漏掉任一where块,否则可能出现负质量。 - 1D 模型用
CO2cond_ps缩放表压/风/示踪物 tendency;3D 不缩放。
源码疑点与边界
- 行 2957 疑似拷贝错误:
icetotco2(ig) = icetot(ig) + zq(ig,l,igcm_co2_ice)*...,等号右侧用的是水冰柱积分icetot而非icetotco2自身累加。其上icetotco2在行 2950 已清零,但此处未自累加(应为icetotco2(ig) = icetotco2(ig) + ...)。这会让icetotco2被水冰柱质量污染,并丢失逐层累加。复现风险:icetotco2/mtotco2诊断输出(行 3473)可能不正确。需对照上游版本或开发者确认是否为已知 bug。 perennial_co2ice、fluxsurf_dn_sw、zls在co2condens内的具体用途见 co2condens;本页只记录它们作为调用点的输入。co2cloud内部微物理与沉降细节见 co2cloud_mod 与 improvedco2clouds_mod;细节见对应页面。