perosat.F
路径
LMDZ.MARS\libf\aeronomars\perosat.F
所属目录/模块
libf\aeronomars
文件定位
perosat.F 定义 perosat_mod,提供 perosat 例程,用于在光化学计算后处理 H2O2 饱和与凝结。它按 Lindner (1988) 的饱和蒸气压公式在 T<=220 K 时计算 H2O2 饱和摩尔分数;若某层超饱和,则把超出部分从高层向下一层转移,最底层仍超饱和的部分沉积到地表通量 pdqscloud,并把最终摩尔分数差转换为质量混合比 tendency pdqcloud。
该例程由 calchim_mod 在逐列光化学后调用,输入 zy 是化学后 mole fraction,输出 pdqcloud/dqscloud 作为 H2O2 凝结倾向和地表通量。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
perosat_mod |
module |
1(END MODULE 153) |
H2O2 饱和/凝结后处理模块 |
perosat |
subroutine |
7(END SUBROUTINE 151) |
对单个网格列 ig 处理 H2O2 饱和、向下层转移和地表沉积 |
firstcall |
saved threadprivate logical |
62 |
首次调用时检查 H2O2 tracer 索引,随后关闭检查 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
tracer_mod |
igcm_h2o2, mmol |
取得 H2O2 tracer 索引和分子量数组 |
- |
conc_mod |
mmean |
用平均分子量把 mole fraction 差转换为 kg/kg/s |
- |
comcstfi_h |
g |
最底层超饱和量换算为地表质量通量 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
abort_physic |
LMDZ 物理工具(未显式 use) |
77 |
缺少 H2O2 tracer 时中止 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ngrid,nlayer,nq |
calchim 调用参数 |
integer |
- |
网格列数、层数、tracer 数 |
ig |
calchim 逐列循环 |
integer |
- |
当前处理的物理网格列 |
ptimestep |
物理时间步 |
real |
s |
tendency 换算分母 |
pplev |
调用方压力边界 |
real (ngrid,nlayer+1) |
Pa |
层界压力,用于按质量厚度向下转移超饱和 H2O2 |
pplay |
调用方层中压力 |
real (ngrid,nlayer) |
Pa |
计算饱和摩尔分数的分母 |
zt |
calchim 已更新温度列 |
real (nlayer) |
K |
H2O2 饱和蒸气压公式输入 |
zy |
光化学后 mole fraction |
real (nlayer,nq) |
mol/mol |
H2O2 当前摩尔分数 |
igcm_h2o2,mmol,mmean,g |
共享模块 |
mixed |
mixed |
tracer 索引、分子量、平均分子量和重力 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
pdqcloud |
calchim/调用方 |
real (ngrid,nlayer,nq) |
kg/kg/s |
H2O2 凝结导致的大气 tracer tendency |
pdqscloud |
calchim/调用方 |
real (ngrid,nq) |
kg/m2/s |
最底层超饱和 H2O2 沉积到地表的通量 |
共享状态与副作用
- 首次调用时读取
igcm_h2o2,若为 0 则打印错误并 abort_physic("perosat","missing h2o2 tracer",1)。
firstcall 是 SAVE 且 THREADPRIVATE,每个 OpenMP 线程各自执行一次 tracer 检查。
- 只写当前列
ig 的 pdqcloud(ig,:,igcm_h2o2) 与 pdqscloud(ig,igcm_h2o2);不清零其他 tracer 或其他网格列槽位。
- 局部
taucond(ngrid,nlayer) 只计算诊断值,后续没有输出或使用。
核心逻辑
- 首次 tracer 检查:若
igcm_h2o2==0,说明配置中缺 H2O2 tracer,直接中止。
- 逐层计算饱和摩尔分数:对每层
l,先令 zynew(l)=zy(l,igcm_h2o2);若 zt(l)<=220,计算 psat_hg=10**(11.98-3422/zt(l)),转成 hPa 后除以 pplay(ig,l) 得到 zysat(l);暖层则设 zysat=1.e30,等价于不凝结。
- 诊断凝结率:计算
taucond=max((zy-zysat)*mmol/(mmean*ptimestep),0),但该数组不作为输出。
- 从高层向低层转移超饱和量:从
nlayer 到 2,若 zynew(l)>zysat(l),把超出量按相邻层压力厚度比加到 zynew(l-1),并把本层截断到 zysat(l)。
- 处理底层沉积:若
zynew(1)>zysat(1),把超出量乘分子量和底层压差,再除以 mmean*g*ptimestep,写成地表通量 pdqscloud(ig,igcm_h2o2);否则该通量为 0。
- 输出大气 tendency:逐层把
(zynew-zy)*mmol/(mmean*ptimestep) 写入 pdqcloud(ig,l,igcm_h2o2)。
伪代码
perosat(..., ig, ptimestep, pplev, pplay, zt, zy, pdqcloud, pdqscloud):
if firstcall:
if igcm_h2o2 == 0: abort
firstcall = false
for l = 1..nlayer:
zynew(l) = zy(l,h2o2)
if zt(l) <= 220:
psat_hg = 10**(11.98 - 3422/zt(l))
psat_hpa = psat_hg * 760 / 1013
zysat(l) = psat_hpa * 100 / pplay(ig,l)
else:
zysat(l) = 1e30
for l = nlayer downto 2:
if zynew(l) > zysat(l):
excess = zynew(l) - zysat(l)
zynew(l-1) += excess * layer_mass(l) / layer_mass(l-1)
zynew(l) = zysat(l)
if zynew(1) > zysat(1):
pdqscloud(ig,h2o2) = excess_bottom * mmol(h2o2) * dp_bottom / (mmean(ig,1)*g*ptimestep)
zynew(1) = zysat(1)
else:
pdqscloud(ig,h2o2) = 0
for l = 1..nlayer:
pdqcloud(ig,l,h2o2) = (zynew(l)-zy(l,h2o2))*mmol(h2o2)/(mmean(ig,l)*ptimestep)
参与的主题流程
| 主题 |
参与方式 |
| 光化学后处理 |
calchim_mod 逐列调用 perosat,在光化学更新后处理 H2O2 超饱和 |
| H2O2 凝结/沉积 |
计算 H2O2 饱和限制、大气 tendency 和地表沉积通量 |
写法特点
- 固定格式
.F,注释为法语/英语混合。
- 只处理
igcm_h2o2 一个 tracer;输出数组其他 tracer 槽位由调用方或其他流程负责。
- 饱和公式只在
T<=220 K 应用;暖层用 1.e30 抑制凝结。
abort_physic 未在本文件 use 列表显式声明,属于已有代码风格中的外部工具调用。
复现要点
- H2O2 tracer 必须存在并由
tracer_mod::igcm_h2o2 标识;缺失会中止。
zy 是 mole fraction,而输出 pdqcloud/pdqscloud 是质量单位;换算依赖 mmol(igcm_h2o2)、mmean(ig,l)、g 和 ptimestep。
- 超饱和转移顺序是从顶层向下,不能改成同时更新;每层沉降到下一层后会影响下一次底层判断。
pdqcloud 只写 H2O2 tracer;调用方若需要其他 tracer tendency 为 0,必须在外部初始化。
待确认
taucond 仅诊断计算但未输出;是否历史遗留待确认。
psat_hpa = psat_hg*760./1013. 的单位转换注释与常见 mmHg/hPa 换算方向需结合原文献确认;复现按源码字面执行。
相关页面