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 沉积到地表的通量

共享状态与副作用

核心逻辑

  1. 首次 tracer 检查:若 igcm_h2o2==0,说明配置中缺 H2O2 tracer,直接中止。
  2. 逐层计算饱和摩尔分数:对每层 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,等价于不凝结。
  3. 诊断凝结率:计算 taucond=max((zy-zysat)*mmol/(mmean*ptimestep),0),但该数组不作为输出。
  4. 从高层向低层转移超饱和量:从 nlayer 到 2,若 zynew(l)>zysat(l),把超出量按相邻层压力厚度比加到 zynew(l-1),并把本层截断到 zysat(l)
  5. 处理底层沉积:若 zynew(1)>zysat(1),把超出量乘分子量和底层压差,再除以 mmean*g*ptimestep,写成地表通量 pdqscloud(ig,igcm_h2o2);否则该通量为 0。
  6. 输出大气 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 和地表沉积通量

写法特点

复现要点

待确认

相关页面