simpleclouds_mod.F
路径
LMDZ.MARS\libf\phymars\simpleclouds_mod.F
所属目录/模块
libf\phymars
文件定位
该文件定义 simpleclouds_mod 模块,含唯一 subroutine simpleclouds。职责是:在 GCM 某格点空气水汽过饱和时,用一个简化的水冰云方案形成/升华水冰。该方案几乎不含微物理——没有过饱和(瞬时调整到饱和)、不算成核率、不显式追踪 CCN,凝结/升华只按“水汽与饱和混合比之差”一步到位。源码注释明确指出更精确的方案在 improvedclouds。
它额外处理 HDO(半重水)同位素的分馏(hdo 开关),并在末尾调用 updaterice_typ 用 Montmessin et al. (2004) 的典型 CCN 廓线反演水冰晶半径 rice。
调用方(核验):唯一被 watercloud_mod.F 的简化路径调用(:20 use,:349 call),即 microphys=.false. 时走 simpleclouds、microphys=.true. 时走 improvedclouds。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
simpleclouds_mod |
module |
1 |
容器模块 |
simpleclouds |
subroutine |
7 |
简化水冰云凝结/升华 + HDO 分馏 + 半径反演 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
updaterad |
updaterice_typ |
由水冰量 + 尘埃光深反演水冰晶质量平均半径 rice(Montmessin 2004 典型 CCN 廓线) |
否 |
watersat_mod |
watersat |
算各层水饱和混合比 zqsat(见相关页面) |
否 |
tracer_mod |
igcm_h2o_vap, igcm_h2o_ice, igcm_hdo_vap, igcm_hdo_ice, qparentmin |
水/HDO 气冰 tracer 索引;qparentmin 为母体最小混合比阈值(防 HDO/H2O 比值除零) |
否 |
comcstfi_h |
cpp |
大气定压比热,潜热加热率换算 |
否 |
dimradmars_mod |
naerkind |
气溶胶种类数,tau 维度 |
否 |
callkeys_mod |
hdo, hdofrac |
hdo:是否启用 HDO 同位素;hdofrac:是否启用凝结分馏 |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
watersat |
watersat_mod |
:128 |
一次性算 ngrid*nlay 个点的饱和混合比 |
updaterice_typ |
updaterad |
:219 |
逐点反演水冰晶半径 rice |
本文件不调用其他源文件中的例程。
调用方(核验 watercloud_mod.F):
| 调用方 |
位置 |
上下文 |
watercloud_mod.F |
:349 |
微物理时间步循环内,先把各前序参数化的 tendency 累加进 sum_subpdt/sum_subpdq 作为“阶梯输入”,调用后把 subpdqcloud 累加回 sum_subpdq |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid |
调用方 |
integer, in |
— |
大气列数 |
nlay |
调用方 |
integer, in |
— |
大气层数 |
nq |
调用方 |
integer, in |
— |
tracer 数 |
ptimestep |
调用方 |
real, in |
s |
物理(微物理)时间步(传 microtimestep) |
pplay(ngrid,nlay) |
调用方 |
real, in |
Pa |
层中压力 |
pzlay(ngrid,nlay) |
调用方 |
real, in |
m |
层中高度 |
pt(ngrid,nlay) |
调用方 |
real, in |
K |
输入温度 |
pdt(ngrid,nlay) |
调用方 |
real, in |
K/s |
前序参数化的温度 tendency(传 sum_subpdt) |
pq(ngrid,nlay,nq) |
调用方 |
real, in |
kg/kg |
输入 tracer 混合比(传 pqeff) |
pdq(ngrid,nlay,nq) |
调用方 |
real, in |
kg/kg/s |
前序 tracer tendency(传 sum_subpdq) |
tau(ngrid,naerkind) |
调用方 |
real, in |
— |
各列尘埃柱光深 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
rice(ngrid,nlay) |
调用方 |
real, out |
m |
水冰晶质量平均半径(Montmessin 2004 的 r_c) |
pdqcloud(ngrid,nlay,nq) |
调用方 |
real, out |
kg/kg/s |
因 H2O(及 HDO)凝结/升华的 tracer tendency |
pdtcloud(ngrid,nlay) |
调用方 |
real, out |
K/s |
潜热引起的温度 tendency |
注意:pdqcloud 只对 h2o_vap/h2o_ice(及 hdo 对应)赋值,其余 tracer 分量被初始化为 0。
共享状态与副作用
- 无 common block,不写文件,无诊断打印。
- 无 SAVE 变量、无 firstcall;纯计算(输出仅由输入和被调例程决定)。
- 内部用局部数组
zq/zq0/zt/zqsat 工作,不修改输入数组。
- 局部
ccn_factor(注释掉的 PARAMETER 4.5)和 rhocloud、rdusttyp、ccntyp、DoH_vap、DoH_ice 等声明但未实际使用(见写法特点)。
核心逻辑
- 初始化(
:90-121):把 h2o_vap、h2o_ice(及 hdo 对应,若 hdo)按 pq + pdq*ptimestep 更新到局部 zq,水汽下限 1e-30、水冰下限 0,并存初值 zq0;温度 zt = pt + pdt*ptimestep。pdqcloud/pdtcloud/alpha_c 清零。
- 饱和混合比(
:128):call watersat 得 zqsat。
- 凝结/升华量(
:133-150):逐点
- 若
zq(h2o_vap) >= zqsat(过饱和):dzq = zq(h2o_vap) - zqsat(全部多余水汽凝结)。
- 否则(不饱和):
dzq = -min(zqsat - zq(h2o_vap), zq(h2o_ice))(升华,但不超过现有冰量)。
- 更新
zq(h2o_ice) += dzq、zq(h2o_vap) -= dzq。
- tendency 与潜热(
:155-163):pdqcloud = (zq - zq0)/ptimestep;潜热 lw = (2834.3 - 0.28*(zt-To) - 0.004*(zt-To)²)*1e3(升华潜热温度依赖式,To=273.15),pdtcloud = -pdqcloud(h2o_vap)*lw/cpp。
- HDO 分馏(
:165-211,仅 hdo):
- 凝结(
pdqcloud(h2o_ice)>0):分馏系数 alpha_c = exp(13525/zt² - 5.59e-2)(Lamb,仅 hdofrac,否则 =1);pdqcloud(hdo_ice) = pdqcloud(h2o_ice)*alpha_c*(hdo_vap/h2o_vap)(母体 h2o_vap>qparentmin 才算,否则 0),并以可用 hdo_vap 为上限封顶;pdqcloud(hdo_vap) = -pdqcloud(hdo_ice)。
- 升华(else):
pdqcloud(hdo_ice) = pdqcloud(h2o_ice)*(hdo_ice/h2o_ice)(母体 h2o_ice>qparentmin 才算),以 -hdo_ice 为下限,pdqcloud(hdo_vap) = -pdqcloud(hdo_ice)。
- 半径反演(
:217-222):逐点 call updaterice_typ(zq(h2o_ice), tau(ig,1), pzlay, rice)。
伪代码
subroutine simpleclouds(...):
# 1. 更新局部场
zq(h2o_vap) = max(pq + pdq*dt, 1e-30); zq0 = zq
zq(h2o_ice) = max(pq + pdq*dt, 0.)
zt = pt + pdt*dt
if hdo: 同样更新 hdo_vap, hdo_ice
pdqcloud = 0; pdtcloud = 0
# 2. 饱和混合比
call watersat(zt, pplay -> zqsat)
# 3. 凝结/升华(瞬时调整到饱和)
for ig,l:
if zq(h2o_vap) >= zqsat: dzq = zq(h2o_vap) - zqsat # 凝结
else: dzq = -min(zqsat-zq(h2o_vap), zq(h2o_ice)) # 升华
zq(h2o_ice) += dzq; zq(h2o_vap) -= dzq
# 4. tendency + 潜热
for ig,l:
pdqcloud(h2o_vap) = (zq(h2o_vap)-zq0)/dt
pdqcloud(h2o_ice) = (zq(h2o_ice)-zq0)/dt
lw = (2834.3 - 0.28*(zt-To) - 0.004*(zt-To)^2)*1e3
pdtcloud = -pdqcloud(h2o_vap)*lw/cpp
# 5. HDO 分馏(若 hdo)
if 凝结: alpha = hdofrac ? exp(13525/zt^2 - 5.59e-2) : 1
pdqcloud(hdo_ice) = pdqcloud(h2o_ice)*alpha*(hdo_vap/h2o_vap) # 受 qparentmin / 可用量限制
else: pdqcloud(hdo_ice) = pdqcloud(h2o_ice)*(hdo_ice/h2o_ice)
pdqcloud(hdo_vap) = -pdqcloud(hdo_ice)
# 6. 冰晶半径
for ig,l: call updaterice_typ(zq(h2o_ice), tau(ig,1), pzlay -> rice)
参与的主题流程
| 主题 |
参与方式 |
| 水循环 |
水冰云的简化路径(microphys=.false.):把过饱和水汽瞬时转为水冰、释放潜热,并给出冰晶半径供辐射(activice)/沉降使用。是 improvedclouds 完整微物理方案的轻量替代 |
写法特点
- 固定格式 Fortran(
.F),续行第 6 列 &,注释 c。
- 简化方案核心是“瞬时饱和调整”:凝结把全部过饱和水汽转冰,升华受现有冰量限制,无过饱和/无成核动力学。
- 潜热
lw 用温度二次多项式(2834.3/0.28/0.004 硬编码系数)。
- HDO 分馏系数
exp(13525/zt² - 5.59e-2)(Lamb 形式);源码另有一行被注释掉的旧系数 exp(16288/zt² - 9.34e-2)(:169)。
- 声明但未使用的变量:
rhocloud、rdusttyp、ccntyp、DoH_vap、DoH_ice,以及注释掉的 ccn_factor。alpha_c 是数组但只在标量意义上逐点用。推断为历史遗留/未来扩展占位。
- 文件头注释提到的
ccn_factor(在一部分尘埃上成核)实际未在本版本代码中生效,半径由 updaterice_typ 的 Montmessin 廓线决定。
复现要点
- 凝结判据用的是“是否
>= zqsat”,过饱和度恒为 0(瞬时平衡);与 improvedclouds 的显式过饱和/成核完全不同。
- 升华量被
min(..., zq(h2o_ice)) 限制,不会产生负冰。
- 潜热加热只由
pdqcloud(h2o_vap) 驱动(= 凝结潜热释放/升华吸热)。
- HDO 是被动“子”tracer:其 tendency 按母体 H2O 的相变量乘同位素比值(凝结时再乘分馏系数
alpha_c),并受 qparentmin 与可用量限制。复现需保持凝结/升华分支用不同的母体(凝结用 vap 比值,升华用 ice 比值)。
rice 用 tau(ig,1)(第 1 类气溶胶 = 尘埃)的柱光深,经 updaterice_typ 的典型 CCN 廓线反演,不是预报量。
- 调用方在微物理子步内累加 tendency 作“阶梯输入”,复现时注意本例程内部又一次
pq + pdq*ptimestep 的前推。
待确认
- 文件头注释描述的
ccn_factor/“在一部分尘埃上成核”与当前代码不一致(ccn_factor 已注释掉,半径由 updaterice_typ 决定)。推断注释过时。
- 声明未用变量(
rhocloud/rdusttyp/ccntyp/DoH_*)是否在其他版本曾被使用;当前版本确认未用。
alpha_c 声明为 (ngrid,nlay) 数组但实际逐点赋值/使用,是否有意做空间变量(注释 !!MARGAUX)——当前不影响结果。
相关页面