calchim_mod.F90

路径

LMDZ.MARS\libf\aeronomars\calchim_mod.F90

所属目录/模块

libf\aeronomars

文件定位

calchim_mod.F90 定义 calchim_mod,是 Mars 物理包中把 advected tracers、温度、风场、太阳几何、尘/冰表面积和化学开关整理后送入光化学/热层化学例程的调度模块。核心例程 calchim 在 firstcall 阶段识别可参与化学的 tracer 索引,选择在线或离线光解初始化路径,并在每个物理网格列上把质量混合比转换为体积混合比、调用 photochemistryperosat、可选 chemthermos/deposition,最后把更新后的 mole fraction 转回 dqchim 倾向。

本文件还保存 ichemistryzdqchimzdqschim 三个模块状态;ini_calchim_mod/end_calchim_mod 负责分配和释放化学倾向缓存。

定义的符号

符号 类型 行号 作用
calchim_mod module 1(END MODULE 1009) 化学调度模块,保存化学调用频率和倾向缓存
ichemistry integer save THREADPRIVATE 5 物理步中化学调用频率的共享状态;本文件声明但不在本例程内赋值
zdqchim allocatable real save THREADPRIVATE 6, 992-993, 1004 pq 的光化学倾向缓存,维度 (ngrid,nlayer,nq)
zdqschim allocatable real save THREADPRIVATE 7, 994-995, 1005 qsurf 的光化学倾向缓存,维度 (ngrid,nq)
calchim subroutine 13(END SUBROUTINE 981) 准备并调用光化学、H2O2 凝结、热层化学和可选干沉降,输出化学倾向
ini_calchim_mod subroutine 984(END SUBROUTINE 997) 分配并清零 zdqchim/zdqschim
end_calchim_mod subroutine 1000(END SUBROUTINE 1007) 释放已分配的 zdqchim/zdqschim

依赖的模块

calchim 内部:

use 模块 only 列表 用途 待确认
tracer_mod igcm_*, mmol 读取化学相关 tracer 的全局索引和摩尔质量;firstcall 构造 niq,逐层换算质量混合比/体积混合比 -
conc_mod mmean 读取每列每层平均摩尔质量,参与 pq <-> zycol 换算并输出统计 -
comcstfi_h pi mu0 计算太阳天顶角 szacol=acos(mu0)*180/pi -
chemthermos_mod chemthermos .not.unichim 时调用热层化学源汇 -
chemthermos_readini_mod chemthermos_readini firstcall 且 .not.unichim 时读取热层反应速率文件 -
photochemistry_mod photochemistry 主光化学积分例程,更新 zycol 并返回光解率、夜辉发射率和迭代数 -
deposition_mod deposition depos 为真时逐列调用干沉降;当前默认关闭 -
perosat_mod perosat 光化学后处理 H2O2 凝结并写 dqcloud/dqscloud -
chemistrydata_mod read_phototable photochem .and. .not.jonline 时读取离线光解查找表 -
photolysis_mod init_photolysis, nphot 在线光解初始化;若启用氘化学则先把 nphot 增加 2 -
iono_h temp_elect 逐层按高度/温度算电子温度,传给光化学 -
wstats_mod wstats 写统计输出 jo3/emission_no/emission_o2/mmean -
write_output_mod write_output 写诊断输出 jo3/jh2o/iter_chemistry/emission_* -
callkeys_mod photochem 外部配置开关,控制是否执行光化学分支 -

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
abort_physic LMDZ 物理工具(本例程未显式 use 其宿主模块) 277-749 多处 必需 tracer 缺失时中止;部分 N/O 物种仅在 photochem 为真时要求
init_photolysis photolysis_mod 770 photochem .and. jonline 时初始化在线光解
read_phototable chemistrydata_mod 773 photochem .and. .not.jonline 时读取离线光解表
chemthermos_readini chemthermos_readini_mod 780 .not.unichim 时读取 61 个热层反应 Arrhenius 参数
temp_elect iono_h 821 逐层计算电子温度;第三参数固定为 1,即 Viking 路径
photochemistry photochemistry_mod 875-881 主光化学积分,输入列状态并原地更新 zycol
perosat perosat_mod 893-895 处理 H2O2 饱和/凝结,写云凝结倾向
chemthermos chemthermos_mod 901-903 .not.unichim 时对热层段执行 C/O/H/N/ions 化学
deposition deposition_mod 915-917 depos 为真时执行干沉降路径
write_output write_output_mod 959-968 输出光解率、迭代数和夜辉发射率诊断
wstats wstats_mod 970-977 写统计文件中的光化学/平均摩尔质量字段

输入

输入 来源 类型/维度 单位 含义
ngrid,nlayer,nq 调用方 integer - 物理列数、垂直层数、tracer 数
ptimestep 调用方 real s 物理时间步
pplay,pplev 调用方 real (ngrid,nlayer) / (ngrid,nlayer+1) Pa 层中/界面气压;内部 zpress=pplay/100 转为 mbar
pt,pdt 调用方 real (ngrid,nlayer) K, K/s 或调用方累计倾向约定 当前温度和时间步前已有温度倾向;内部用 pt+pdt*ptimestep
pu,pdu,pv,pdv 调用方 real (ngrid,nlayer) m/s, tendency 当前水平风和时间步前已有风倾向;传给干沉降
dist_sol 调用方 real AU 日火距离,传给光化学
mu0 调用方 real (ngrid) - 太阳天顶角余弦;内部转为 szacol(degree)
zzlev,zzlay 调用方 real (ngrid,nlayer+1) / (ngrid,nlayer) m 界面/层中高度;内部 zlocal=zzlay/1000 转为 km
zday 调用方 real Martian day since Ls=0 传给光化学和热层化学
pq,pdq 调用方 real (ngrid,nlayer,nq) mass mixing ratio, tendency tracer 当前值和进入化学前已有倾向;内部先形成 zq=pq+pdq*ptimestep
dqcloud,dqscloud 调用方/输出数组 real (ngrid,nlayer,nq), (ngrid,nq) tendency 作为 perosat 的 H2O2 凝结倾向输出载体
tau 调用方 real (ngrid) - 尘不透明度,传给光化学
co2ice 调用方 real (ngrid) kg/m2 传给 deposition;当前 depos 默认关闭
surfdust,surfice 调用方 real (ngrid,nlayer) m2/m3 尘/冰表面积;内部乘 1.e-2 转为 cm2/cm3
mmean conc_mod real (ngrid,nlayer) g/mole 平均摩尔质量,参与质量/体积混合比换算
igcm_*,mmol tracer_mod integer / real - / g/mole tracer 索引和摩尔质量
photochem callkeys_mod logical - 是否执行光化学分支

输出

输出 去向 类型/维度 单位 含义
dqchim 调用方,通常累加到 tracer tendency real (ngrid,nlayer,nq) mass mixing ratio / s 化学导致的 tracer 倾向;每层主量物种取其它化学物种倾向的负和以保持质量闭合
dqschim 调用方 real (ngrid,nq) - 地表 tracer 化学倾向;本例程每次清零,未进一步写入
dqcloud,dqscloud 调用方 real (ngrid,nlayer,nq), (ngrid,nq) tendency perosat 写入的 H2O2 凝结相关倾向
jo3,jh2o,iter_chemistry 诊断 write_output 3D fields s-1, s-1, count 光解率和化学迭代数;仅 photochem .and. output .and. ngrid>1
emission_no,emission_o2 诊断 write_output / wstats 3D fields cm-3 s-1 NO/O2 夜辉发射率;来自光化学/热层化学
jo3,emission_no,emission_o2,mmean 统计 wstats stats fields 见调用 统计文件输出;仅 photochem .and. output .and. ngrid>1

共享状态与副作用

核心逻辑

  1. firstcall 初始化开关与 tracer 列表:设定 unichim/jonline/ionchem/deutchem/depos/output 默认值,分配 niq(nq),按 igcm_* 检查化学需要的 tracer。CO2、CO、O、O1D、O2、O3、H、H2、OH、HO2、H2O2、N2、H2O 等缺失会中止;CH4 缺失只打印并忽略。
  2. 按 tracer 存在性开启扩展化学:若 HDO 存在则 deutchem=.true.,随后要求 OD、D、HD、DO2、HDO2 等氘相关物种;若 O2+ 存在则 ionchem=.true.,随后要求 CO2+、O+、NO+、CO+、C+、N2+、N+、H+、HCO2+、HCO+、H2O+、H3O+、OH+、e- 等离子化学物种。
  3. 光解/速率初始化:若 photochem 为真,jonline=true 时调用 init_photolysis,且 deutchem 会先 nphot=nphot+2jonline=false 时调用 read_phototable。若 .not.unichim,读取 chemthermos_reactionrates.def
  4. 逐列准备化学输入:对每个 ig,l,计算 zq=pq+pdq*ptimestep,把化学 tracer 从质量混合比换算为 mole fraction:zycol=zq*mmean/mmol;同时更新温度/风场、把气压转 mbar、数密度转 cm-3、高度转 km、表面积转 cm2/cm3,并通过 temp_elect(...,1) 得到电子温度。
  5. 选择热层切换层unichim=truelswitch=nlayer+1;否则首次遇到 pplay(ig,l)<10. 的层作为 lswitch,用于分隔低层光化学和高层热层化学。
  6. 执行化学分支photochem 为真时设置反应数:基础二体反应 31、三体反应 6、quench/heterogeneous 9;ionchem 额外加 64 个二体反应并设 nphotion=18deutchem 额外加 35 个二体反应;nb_phot_max=nphot+nphotion+nquench 后调用 photochemistry
  7. 后处理与可选过程:光化学后保存 jo3/jh2o/iter,调用 perosat 处理 H2O2 凝结;.not.unichim 时以 chemthermod=3chemthermosdepos 为真时调用 deposition
  8. 回写倾向:每层用 maxloc(zycol(l,:)) 找到主量物种 iqmax;其它化学物种按 (new_mass_mixing_ratio-zq)/ptimestep 形成 dqchim,主量物种的 dqchim 设为这些倾向的负和。
  9. 诊断输出:若 photochem .and. output .and. ngrid>1,输出光解率、迭代数、NO/O2 夜辉发射率,并写统计。

伪代码

calchim(...):
  if firstcall:
    set unichim=true, jonline=true, ionchem=false, deutchem=false, depos=false, output=true
    allocate niq(nq)
    scan igcm_* tracer indices; append required species into niq or abort if mandatory species missing
    if HDO exists: deutchem=true; require OD/D/HD/DO2/HDO2
    if O2+ exists: ionchem=true; require ion species and electron tracer
    if photochem:
      if jonline:
        if deutchem: nphot = nphot + 2
        call init_photolysis()
      else:
        call read_phototable()
    if not unichim: call chemthermos_readini()
    firstcall=false

  zero dqchim and dqschim
  for each grid column ig:
    for each layer l:
      for each chemistry tracer iq in niq:
        zq = pq + pdq*ptimestep
        zycol(l,iq) = zq * mmean / mmol(iq)
      ztemp = pt + pdt*ptimestep
      zpress = pplay/100
      zdens = zpress/(kb*1e4*ztemp)
      zlocal = zzlay/1000
      ztelec = temp_elect(zlocal,ztemp,1)
      convert dust/ice surface area from m2/m3 to cm2/cm3
      choose lswitch = nlayer+1 if unichim else first pplay < 10 Pa

    if photochem:
      set reaction counters from ionchem/deutchem/nphot/nquench
      call photochemistry(..., zycol, ...)
      save jo3/jh2o/iter
      call perosat(..., zycol, dqcloud, dqscloud)
      if not unichim: call chemthermos(..., zycol, ...)
      save emission fields

    if depos: call deposition(..., zycol, ...)

    for each layer:
      iqmax = index of max zycol(l,:)
      for each chemistry tracer iq except iqmax:
        dqchim(ig,l,iq) = (zycol(l,iq)*mmol(iq)/mmean(ig,l) - zq(ig,l,iq))/ptimestep
        dqchim(ig,l,iqmax) -= dqchim(ig,l,iq)

  if photochem and output and ngrid > 1:
    write_output jo3, jh2o, iter_chemistry, emission_no, emission_o2
    wstats jo3, emission_no, emission_o2, mmean

参与的主题流程

主题 参与方式
光化学 / 光解 作为 photochemistry 的列级调度层,选择在线 init_photolysis 或离线 read_phototable,并组织 tracer、气压、温度、数密度、太阳几何、尘/冰表面积输入
热层化学 / 电离层 ionchem 按离子 tracer 存在性开启;.not.unichim 时读取热层反应速率并调用 chemthermos;逐层通过 temp_elect 提供电子温度
水相关化学与凝结 H2O/H2O2/HDO 等 tracer 参与化学;光化学后调用 perosat 处理 H2O2 凝结倾向
诊断输出 输出 jo3jh2o、化学迭代数、NO/O2 夜辉发射率和 mmean 统计

写法特点

复现要点

待确认

相关页面