photolysis.F90
路径
LMDZ.MARS\libf\aeronomars\photolysis.F90
所属目录/模块
libf\aeronomars
文件定位
photolysis.F90 定义 photolysis_module,只暴露 photolysis 一个例程。它是 photochemistry_mod 在 jonline=.false. 时使用的离线光解率插值器:从 chemistrydata 读入并广播的 jmars.20140930 查找表中,按温度、太阳天顶角、CO2 空气柱、O3 柱量比和尘埃光学厚度做 5 维线性/对数插值,生成 v_phot(nlayer,nb_phot_max) 的基础光解率槽位。
本文件不读取查找表文件,也不决定是否走离线光解;查表数据由 chemistrydata_mod::read_phototable 负责,调用选择由 photochemistry_mod 的 jonline=false 分支负责。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
photolysis_module |
module |
1-310 |
离线光解查找表插值模块 |
photolysis |
subroutine |
9-306 |
对 1:lswitch-1 层插值 jphot,生成基础光解率 v_phot |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
comcstfi_h |
g |
用重力常数把 pressure difference 和平均摩尔质量换成 CO2/O3 柱量 |
否 |
chemistrydata_mod |
nd,nz,nozo,nsza,ntemp,ntau |
查找表各维度参数 |
否 |
chemistrydata_mod |
szatab,tautab,colairtab,table_ozo,jphot |
SZA、尘埃、空气柱、O3 柱和光解率查找表;由 read_phototable 填充 |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
| 无外部例程调用 |
- |
- |
本例程只用 Fortran intrinsic min/max/log 和数组运算完成插值 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
nlayer |
photochemistry_mod |
integer |
层 |
垂直层数 |
nb_phot_max |
photochemistry_mod |
integer |
反应数 |
输出 v_phot 第二维容量 |
lswitch |
photochemistry_mod |
integer |
层索引 |
只计算 1:lswitch-1 的低层光化学段 |
press(nlayer) |
photochemistry_mod |
real |
hPa |
层压;用于柱量和 1.9 hPa 参考温度插值 |
temp(nlayer) |
photochemistry_mod |
real |
K |
层温度 |
sza |
photochemistry_mod |
real |
degree |
太阳天顶角;本文件 sza<=95 才插值,夜间置零 |
tauref |
photochemistry_mod |
real |
- |
已换算到 7 hPa 口径的尘埃光学厚度 |
zmmean(nlayer) |
photochemistry_mod |
real |
g mole^-1 |
平均摩尔质量,用于柱量换算 |
dist_sol |
photochemistry_mod |
real |
AU |
日火距离,用 (1.52/dist_sol)^2 修正光解率 |
rmco2(nlayer) |
photochemistry_mod |
real |
VMR |
CO2 体积混合比 |
rmo3(nlayer) |
photochemistry_mod |
real |
VMR |
O3 体积混合比 |
jphot 等查找表 |
chemistrydata_mod |
module arrays |
s^-1 等 |
离线光解查找表数据 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
v_phot(nlayer,nb_phot_max) |
photochemistry_mod |
real(kind=8) |
s^-1 |
基础光解率;进入 reactionrates/fill_matrix 的一阶反应槽位 |
共享状态与副作用
- 本例程只读
chemistrydata_mod 的 jphot/colairtab/table_ozo/szatab/tautab,不修改模块状态。
- 本例程先在末尾统一
v_phot(:,:)=0.,再只填 1:lswitch-1 层的 1-13 号基础槽位;lswitch:nlayer 和未映射槽位保持 0。
sza>95. 时局部 j(:,:)=0.,随后同样映射到 v_phot,等价夜间光解清零。
- 无文件 I/O、无
abort_physic、无 MPI 通信;这些由 chemistrydata_mod::read_phototable 处理。
核心逻辑
- 日夜判断:只有
sza<=95. 时进入查表插值;更大天顶角直接令 j(:,:)=0.。
- 固定温度表:本文件硬编码 1.9 hPa 参考温度表
226.2, 206.2, 186.2, 169.8 K,对应 ntemp=4。
- SZA 与尘埃索引:在
szatab 中找包围 sza 的两个点,在 tautab 中找包围 tauref 的两个点;tauref 被夹在 tautab(1) 和 tautab(ntau) 之间。
- CO2/O3 柱量:
- 顶层
lswitch-1 的 CO2 空气柱用 6.022e22*rmco2*press*100/(zmmean*g) 估算。
- 向下循环
l=lswitch-2..1,用相邻层平均 rmco2/rmo3 和压差 dp=(press(l)-press(l+1))*100 累加 CO2 与 O3 柱量。
- CO2 柱量上限为
colairtab(1)。
- O3 柱量比:用
colo3min=col*7.171e-10 定义 0.1 micron-atm 的理论最小柱量,ratio_o3=colo3/colo3min,并夹在 1. 到 table_ozo(nozo)*10.。
- 参考温度:在压力剖面中寻找 1.9 hPa 所在层间,用线性权重插值得
tref;随后夹在 table_temp(4)..table_temp(1),并用对数温度比计算温度插值权重。
- 逐层 5 维插值:对每个
l=1:lswitch-1,分别在 colairtab、table_ozo 上定位索引,用 poids(2,2,2,2,2) 形成温度、SZA、空气柱、O3、尘埃五维角点权重,累加 32 个 jphot 角点。
- 日火距离修正:每个
j(l,ij) 乘 (1.52/dist_sol)**2。
- 映射到
v_phot:按 jmars.20140930 的 13 个查表通道填入 v_phot;H2 和 N2 光解槽位没有查表数据,分别置 0。
伪代码
photolysis(...):
if sza <= 95:
find SZA interpolation bracket in szatab
clamp tauref to tautab and find dust bracket
build CO2 column and O3 column from top (lswitch-1) downward
ratio_o3 = clamp(colo3 / (col * 7.171e-10), 1, table_ozo(nozo)*10)
interpolate tref at 1.9 hPa and find table_temp bracket
for l = 1..lswitch-1:
find CO2-column and O3-ratio brackets
build 32 weights over temp, sza, column, ozone, tau
for ij = 1..nd:
j(l,ij) = weighted sum of jphot corners
j(l,ij) *= (1.52 / dist_sol)^2
else:
j = 0
v_phot = 0
for l = 1..lswitch-1:
copy j lookup channels 1..9, 10..11 into v_phot slots
set v_phot(:,10) = 0 for missing H2 lookup
set v_phot(:,13) = 0 for missing N2 lookup
参与的主题流程
| 主题 |
参与方式 |
| 离线光解 |
jonline=false 时由 photochemistry_mod 调用,消费 chemistrydata 的 jphot 表 |
| 光化学反应网络 |
提供基础 13 个一阶光解槽位中的 11 个有效查表速率,供 photochemistry 后续矩阵积分 |
| 尘埃/臭氧影响 |
插值维度显式包含 7 hPa 尘埃光学厚度和 O3 柱量比 |
写法特点
- 自由格式
.F90,但保留较老的长注释分段风格。
poids(2,2,2,2,2) 是五维权重;源码注释写“4-dimensional interpolation”但实际包含 temp,sza,co2,o3,tau 五个维度。
j_hdo 被声明但未赋值、未使用;HNO3/HNO4 查表通道被读入局部 j,但没有映射到当前 v_phot 输出槽位。
v_phot(l,10)=0. 注释为 H2 missing in lookup table;v_phot(l,13)=0. 注释为 N2 missing in lookup table。
sza 白天阈值为 95°,不同于 photochemistry_mod 在线光解分支的 113° 阈值。
复现要点
- 调用前必须已执行 chemistrydata::
read_phototable,否则 jphot/colairtab/table_ozo 没有有效数据。
- 调用方传入的
tauref 应已是 7 hPa 口径;photochemistry_mod 离线路径会先做 tau=tau*7./press(1)。
press 需随层号向上递减,才能让 press(l)-press(l+1) 和 1.9 hPa 插值逻辑符合源码假设。
colairtab 的排序必须与源码 if (colairtab(icol) < col(l)) 的查找方式一致;本文件不做表单调性检查。
dist_sol 修正以 1.52 AU 为基准;复现其他日火距离时不要省略平方反比缩放。
待确认
- 源码注释称 4 维插值,但数组和求和项为 5 维,是否仅为注释陈旧待确认。
j_hdo 声明未使用;是否为氘化学离线光解遗留待确认。
- HNO3/HNO4 两个查表通道未映射到
v_phot,当前反应网络是否有意忽略这两个输出待确认。
相关页面