photolysis_mod.F90
路径
LMDZ.MARS\libf\aeronomars\photolysis_mod.F90
所属目录/模块
libf\aeronomars
文件定位
photolysis_mod.F90 定义 photolysis_mod,是在线光解路径的初始化和共享数据模块。calchim_mod 在 photochem .and. jonline 的 firstcall 中调用 init_photolysis;该例程建立 162 个低分辨率光谱区间,读取太阳通量、吸收截面、量子产额和固定地表反照率,并把这些 SAVE/THREADPRIVATE 数组留给 photolysis_online 在运行时逐层积分光解率。
本文件本身不计算 v_phot,也不进入化学矩阵积分;它负责把 datadir/solar_fluxes 与 datadir/cross_sections 的外部表格重采样到统一波长网格。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
photolysis_mod |
module |
1-2460 |
在线光解共享状态和读表工具模块 |
nphot |
saved module variable |
7 |
基础光解过程数,默认 13;calchim_mod 的氘化学路径会加 2 |
nabs |
parameter |
12 |
吸收气体数,源码中设为 10 |
nw |
parameter |
16 |
低分辨率工作光谱网格长度,源码设为 162 |
mopt |
saved module variable |
17 |
光谱网格模式;init_photolysis 固定设为 2 |
wl,wc,wu |
saved module arrays |
21 |
光谱区间下界、中心和上界 |
f |
saved module array |
27 |
1 AU 太阳通量,读表后转换为 photon s^-1 nm^-1 cm^-2 |
xs*,yield*,albedo |
saved module arrays |
31-52 |
各物种截面、量子产额和地表反照率 |
init_photolysis |
subroutine |
59-140 |
在线光解初始化入口,依次建网格、读通量/截面/产额、设反照率 |
gridw |
subroutine |
144-385 |
生成高/低分辨率波长区间;当前运行固定低分辨率 |
rdsolarflux |
subroutine |
389-483 |
读取并重采样太阳通量表 |
addpnt |
subroutine |
487-582 |
给单调数据列插入边界点,供重采样前补边界 |
inter2 |
subroutine |
585-737 |
把离散输入数据按目标波长 bin 做梯形面积平均 |
rdxsco2 |
subroutine |
741-955 |
读取 CO2 截面和 CO2 光解产额 |
rdxso2 |
subroutine |
959-1177 |
读取 O2 截面和 O2 光解产额 |
rdxso3 |
subroutine |
1181-1295 |
读取 O3 两温度截面 |
rdxsh2o |
subroutine |
1299-1374 |
读取 H2O 截面 |
rdxshdo |
subroutine |
1378-1453 |
读取 HDO 截面 |
rdxsh2o2 |
subroutine |
1457-1535 |
读取 H2O2 截面 |
rdxsho2 |
subroutine |
1539-1607 |
读取 HO2 截面 |
rdxsh2 |
subroutine |
1611-1712 |
读取 H2 截面和 H2 光解产额 |
rdxsno2 |
subroutine |
1716-1907 |
读取 NO2 截面和量子产额 |
rdxsno |
subroutine |
1911-2008 |
读取 NO 截面和光解产额 |
rdxsn2 |
subroutine |
2012-2113 |
读取 N2 截面和光解产额 |
rdxshcl,rdxscl2,rdxsclo,rdxshocl |
subroutines |
2117-2414 |
氯化学截面读表工具;当前 init_photolysis 中调用被注释 |
setalb |
subroutine |
2418-2458 |
设置波长无关 Lambertian 地表反照率 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
datafile_mod |
datadir |
所有读表例程拼接运行时数据目录和文件名 |
否 |
mod_phys_lmdz_para |
is_master |
只让 master 进程执行文件读取和插值 |
否 |
mod_phys_lmdz_transfert_para |
bcast |
将 master 读取/插值后的数组广播到其它进程 |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
gridw |
本文件 |
70 |
建立目标波长网格 |
rdsolarflux |
本文件 |
74 |
读取太阳通量并转换单位 |
rdxso2,rdxsco2,rdxso3 |
本文件 |
78-86 |
读取 O2/CO2/O3 截面和产额 |
rdxsh2o,rdxsh2o2,rdxsho2,rdxsh2,rdxsno,rdxsno2,rdxsn2,rdxshdo |
本文件 |
90-118 |
读取 H/O/N 相关截面和产额 |
setalb |
本文件 |
138 |
设置固定地表反照率 |
addpnt |
本文件 |
多处 |
在原始数据首尾和零点处补点,避免 inter2 外推 |
inter2 |
本文件 |
多处 |
把原始谱表重采样到 wl 网格 |
bcast |
mod_phys_lmdz_transfert_para |
多处 |
广播已读入的截面、通量和产额数组 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
datadir |
datafile_mod / 配置 |
character |
path |
运行时数据目录;本文件从其下读取 solar_fluxes 和 cross_sections |
mopt |
init_photolysis 固定赋值 |
integer |
- |
光谱网格模式;当前固定为低分辨率 2 |
| 外部太阳通量表 |
datadir/solar_fluxes/atlas3_thuillier_tuv.txt |
text table |
mW m^-2 nm^-1 |
rdsolarflux 读取并转换到 photon 通量 |
| 外部截面表 |
datadir/cross_sections/* |
text tables |
cm2 等 |
O2、CO2、O3、H2O、HDO、H2O2、HO2、H2、NO、NO2、N2 等截面与产额 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
wl,wc,wu |
photolysis_online |
real (nw) |
nm |
在线光解辐射传输工作波长网格 |
f |
photolysis_online |
real (nw) |
photon s^-1 nm^-1 cm^-2 |
1 AU 太阳光子通量 |
xsco2_*,xso2_*,xso3_*,xsh2o,xshdo,xsh2o2,xsho2,xsh2,xsno*,xsn2 |
photolysis_online |
real (nw) |
cm2 |
温度相关或物种相关吸收截面 |
yieldco2,yieldo2,yieldh2,yieldno,yieldn2,yldno2_* |
photolysis_online |
real (nw) |
- |
光解或电离分支量子产额 |
albedo |
photolysis_online |
real (nw) |
- |
固定 Lambertian 地表反照率 |
nphot |
calchim_mod / photochemistry_mod / photolysis_online |
integer |
count |
基础光解槽位数,用于 nb_phot_max 和 v_phot 布局 |
共享状态与副作用
- 本模块的大部分数组都是
SAVE 且 THREADPRIVATE;每个 OpenMP 线程有自己的 nphot/mopt/wl/f/xs*/yield*/albedo 副本。
init_photolysis 会修改模块状态,且 calchim_mod 在氘化学开启时会在调用前执行 nphot = nphot + 2。
- 读表例程在 master 进程上
open/read/close 外部文件,缺文件或插值错误时多处 STOP;不是 abort_physic。
- 读表后通过
bcast 把结果广播给其它物理进程。
gridw 会打印 number of spectral intervals;各读表例程会打印正在读取的文件路径。
- HCl、Cl2、ClO、HOCl 截面读表例程存在,但
init_photolysis 对应调用被注释,因此当前初始化不会填充这些氯化学数组。
核心逻辑
- 固定在线光解模式:
init_photolysis 将 mopt=2,即低分辨率 GCM 推荐模式;源码保留 mopt=1 的 3789 区间高分辨率网格逻辑,但当前入口不会使用。
- 构造波长网格:
gridw 按分段步长建立 0-815 nm 的低分辨率网格,区间包括 EUV/UV 到可见光;wl(kw+1)=wu(kw) 作为最后边界。
- 太阳通量读表:
rdsolarflux 固定 msun=18,读取 atlas3_thuillier_tuv.txt 的 19193 行数据,先从 mW 转 W,再按 wc*5.039e11 转为光子通量。
- 截面和产额读表:各
rdxs* 例程从 cross_sections 下读取对应物种和温度的截面表,调用 addpnt 补边界,再由 inter2 重采样到 wl 网格。
- 多温度截面保留为多数组:CO2 保存 195/295/370 K 三套截面,O2 保存 150/200/250/300 K 四套截面,O3 保存 218/298 K 两套截面,NO2 保存普通、220 K 和 294 K 截面,并保存 248/298 K 产额。
- 产额表处理:CO2/O2/H2/NO/N2 读取 Schunk & Nagy 或专用产额表;部分产额读入后按源码做
1 - y 形式转换。
- 设置反照率:
setalb 对所有工作波长给定常数 0.015,源码注释来自 Clancy et al. 1999。
伪代码
init_photolysis:
mopt = 2
call gridw(nw, wl, wc, wu, mopt)
call rdsolarflux(nw, wl, wc, f)
call rdxso2(..., xso2_* , yieldo2)
call rdxsco2(..., xsco2_* , yieldco2)
call rdxso3(..., xso3_*)
call rdxsh2o / rdxsh2o2 / rdxsho2 / rdxsh2
call rdxsno / rdxsno2 / rdxsn2 / rdxshdo
skip commented chlorine cross-section readers
call setalb(nw, wl, albedo)
each rd* reader:
if is_master:
open datadir file
skip headers and read fixed number of rows
add extrapolation guard points with addpnt
map source data into wl bins with inter2
stop if file or interpolation fails
call bcast(result arrays)
参与的主题流程
| 主题 |
参与方式 |
| 在线光解 |
calchim_mod firstcall 调 init_photolysis,本模块准备 photolysis_online.F所需全部光谱输入 |
| 光化学反应网络 |
nphot 决定基础光解槽位数量,进入 photochemistry_mod 的反应数和矩阵布局 |
| 氘化学 |
若 deutchem 为真,calchim_mod 在初始化前把 nphot 从 13 增到 15;本模块读入 HDO 截面供在线路径使用 |
| 并行读表 |
master 读文件,其它进程通过 bcast 接收重采样后的数组 |
写法特点
- 模块为自由格式
.F90,内部许多工具例程保留固定格式缩进和 TUV 风格注释。
nw=162 与 mopt=2 低分辨率模式配套;高分辨率分支需要更多网格点,当前参数设置下不应切到 mopt=1。
inter2 按目标 bin 内的分段线性曲线面积平均,不是简单点插值。
- 多数读表例程使用固定行数读取;外部数据文件版本和行数变化会直接影响可复现性。
- 氯化学截面数组存在且读表例程存在,但入口调用被注释,是未激活能力。
复现要点
- 运行在线光解前必须先调用
init_photolysis;否则 photolysis_online 消费的 f/xs*/yield*/albedo 未初始化。
datadir 必须包含 solar_fluxes/atlas3_thuillier_tuv.txt 和 cross_sections 下的 O2/CO2/O3/H2O/HDO/H2O2/HO2/H2/NO/NO2/N2 数据文件。
- 并行运行时必须保证
bcast 可用;非 master 进程不直接读文件。
- 若手工改变
mopt,还必须同步改变 nw,否则高分辨率网格会越界。
nphot 是可变共享状态;氘化学路径对它的 +2 会影响 photochemistry_mod 中所有光解槽位偏移。
待确认
nabs=10 在本文件中未见直接使用;是否仅为早期在线光解接口遗留待确认。
- 氯化学截面读表工具保留但初始化调用被注释;对应化学网络是否已完全停用待确认。
- 多个读表例程用
STOP 而非项目统一错误处理,生产运行是否期望直接终止待确认。
相关页面