calchim_mod.F90
快速理解
它做什么: 火星化学调度模块,被 physiq 在 photochem 时调用(physiq_mod.F:2223);整理 tracer/温度/太阳几何后送入光化学/热层化学。
基本过程: firstcall 识别化学 tracer → 质量混合比转体积混合比 → 调 photochemistry/perosat/chemthermos/deposition → 转回倾向。
关键结果: 化学示踪剂倾向 zdqchim/zdqschim 和地表通量。
路径
LMDZ.MARS\libf\aeronomars\calchim_mod.F90
所属目录/模块
libf\aeronomars
文件定位
calchim_mod.F90 定义 calchim_mod,是 Mars 物理包中把 advected tracers、温度、风场、太阳几何、尘/冰表面积和化学开关整理后送入光化学/热层化学例程的调度模块。核心例程 calchim 在 firstcall 阶段识别可参与化学的 tracer 索引,选择在线或离线光解初始化路径,并在每个物理网格列上把质量混合比转换为体积混合比、调用 photochemistry、perosat、可选 chemthermos/deposition,最后把更新后的 mole fraction 转回 dqchim 倾向。
本文件还保存 ichemistry、zdqchim、zdqschim 三个模块状态;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 |
共享状态与副作用
ichemistry、zdqchim、zdqschim为模块级SAVE且THREADPRIVATE;ini_calchim_mod分配zdqchim(ngrid,nlayer,nq)和zdqschim(ngrid,nq)并清零,end_calchim_mod释放。calchim内部的firstcall、depos、ionchem、deutchem、jonline、unichim、output、nbq、niq、chemthermod以及 tracer 索引缓存均为SAVE/THREADPRIVATE。firstcall 后不会重新扫描 tracer 列表。- firstcall 默认开关为:
unichim=.true.、jonline=.true.、ionchem=.false.、deutchem=.false.、depos=.false.、output=.true.。 calchim会在 firstcall 打印找到的 tracer 数量和niq索引;缺少必需 tracer 时多处调用abort_physic。- 若
photochem .and. jonline,调用init_photolysis;若photochem .and. .not.jonline,调用read_phototable并产生文件读取/广播副作用。 - 若
.not.unichim,firstcall 调chemthermos_readini读取运行目录下的热层反应速率文件;逐列还会调用chemthermos。 - 若
photochem .and. output .and. ngrid>1,通过write_output和wstats写诊断/统计字段。
核心逻辑
- 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 缺失只打印并忽略。 - 按 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- 等离子化学物种。 - 光解/速率初始化:若
photochem为真,jonline=true时调用init_photolysis,且deutchem会先nphot=nphot+2;jonline=false时调用read_phototable。若.not.unichim,读取chemthermos_reactionrates.def。 - 逐列准备化学输入:对每个
ig,l,计算zq=pq+pdq*ptimestep,把化学 tracer 从质量混合比换算为 mole fraction:zycol=zq*mmean/mmol;同时更新温度/风场、把气压转 mbar、数密度转cm-3、高度转 km、表面积转cm2/cm3,并通过temp_elect(...,1)得到电子温度。 - 选择热层切换层:
unichim=true时lswitch=nlayer+1;否则首次遇到pplay(ig,l)<10.的层作为lswitch,用于分隔低层光化学和高层热层化学。 - 执行化学分支:
photochem为真时设置反应数:基础二体反应 31、三体反应 6、quench/heterogeneous 9;ionchem额外加 64 个二体反应并设nphotion=18;deutchem额外加 35 个二体反应;nb_phot_max=nphot+nphotion+nquench后调用photochemistry。 - 后处理与可选过程:光化学后保存
jo3/jh2o/iter,调用perosat处理 H2O2 凝结;.not.unichim时以chemthermod=3调chemthermos;depos为真时调用deposition。 - 回写倾向:每层用
maxloc(zycol(l,:))找到主量物种iqmax;其它化学物种按(new_mass_mixing_ratio-zq)/ptimestep形成dqchim,主量物种的dqchim设为这些倾向的负和。 - 诊断输出:若
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 凝结倾向 |
| 诊断输出 | 输出 jo3、jh2o、化学迭代数、NO/O2 夜辉发射率和 mmean 统计 |
写法特点
.F90自由格式模块,但包含大量SAVE/THREADPRIVATE缓存;firstcall 后 tracer 索引和开关不会随运行中配置变化重置。- 开关默认值在源码中硬编码,且 firstcall 前有一段较早的光解/热层初始化代码被注释;活跃初始化位于 tracer 检查之后(765-780 行)。
- 质量守恒采用“每层最大 mole fraction 物种补偿”的写法:其它化学物种显式计算倾向,主量物种取负和。
temp_elect第三个参数固定为1,即使用 Viking 路径;源码注释说明2对应 MAVEN。.not.unichim的切换压力阈值为pplay < 10.(Pa),而传给化学例程的zpress已转为 mbar。depos默认.false.,且下游deposition.F当前也不实际修改zycol。ig_vl1的 Viking-1 诊断网格计算代码被注释;只有depos=true且实际调用deposition时才可能用到该变量,当前默认路径不会使用。- 疑似源码细节:氘相关缺失检查中若对应 tracer 不存在,若干
else分支仍检查i_oplus/i_d/i_hd等非本物种条件并报 HDO/HD/DO2/HDO2 缺失(449-520 行);这里按源码事实记录,是否为复制粘贴错误待开发者确认。
复现要点
- 运行中需提供基础化学 tracer:CO2、CO、O、O1D、O2、O3、H、H2、OH、HO2、H2O2、N2、H2O;若
photochem=true,N、N2D、NO、NO2 缺失也会中止。 - CH4 缺失不会中止,只打印 “no ch4, ignored”。
- HDO tracer 存在会开启
deutchem,因此必须同步提供 OD、D、HD、DO2、HDO2 等氘相关 tracer。 - O2+ tracer 存在会开启
ionchem,因此必须同步提供所有离子化学 tracer 和电子 tracer。 - 默认
jonline=true,光解走init_photolysis;若源码改为jonline=false,运行需要可读取离线光解查找表。 - 默认
unichim=true,不会读取chemthermos_reactionrates.def,也不会调用chemthermos;若改为.false.,运行目录需包含该速率文件。 - 默认
output=true,但诊断输出只在photochem为真且ngrid>1时发生。
待确认
abort_physic的宿主模块未在本例程use列表中显式声明;是否依赖旧式外部过程或间接可见性,待编译链路确认。ichemistry在本文件声明但未赋值;其配置来源和调用方如何使用该频率字段需要结合conf_phys/physiq继续核验。- 氘 tracer 缺失检查中若干
else分支的条件与报错文字不完全匹配,疑似复制粘贴问题,待源码维护者确认。 .not.unichim、jonline=false、depos=true这三个路径默认都关闭;本页按源码路径记录,实际生产配置是否启用待运行配置确认。
相关页面
- aeronomars/index:
aeronomars目录总览,本文件位于“光化学”分类。 - chemistrydata:离线光解查找表读取方,供
calchim在jonline=false时调用。 - chemthermos_readini:热层反应速率读取方,供
.not.unichimfirstcall 调用。 - deposition:可选干沉降路径,受
depos开关控制。 - iono_h:提供
temp_elect电子温度函数。 - conc_mod:提供
mmean,参与质量混合比/体积混合比换算。 - phys_state_var_init_mod:初始化/释放阶段调用
ini_calchim_mod和end_calchim_mod。 - physiq_mod:物理主调度中与化学/热层相关的上游入口。
- photochemistry_mod:主光化学积分文件页;说明
photochemistry的在线/离线光解、反应速率、隐式积分、jo3/jh2o/iter和夜辉诊断生成。 - photolysis_mod:在线光解初始化和共享谱表状态;
calchimfirstcall 在jonline=true时调用init_photolysis,并可能先对nphot加 2。 - photolysis_online.F:在线光解率计算文件页。
- chemthermos:热层化学文件页,说明
.not.unichim路径中的数密度矩阵、jthermcalc_e107/paramfoto_compact调用和lswitch:nlayer写回。 - perosat:H2O2 饱和/凝结文件页,说明
dqcloud/dqscloud的写入逻辑。