types_asis.F90
路径
LMDZ.MARS\libf\aeronomars\types_asis.F90
所属目录/模块
libf\aeronomars
文件定位
types_asis.F90 定义 ASIS 光化学隐式求解器使用的反应索引类型和共享数组。它不执行化学计算,也不分配数组;真正的分配和填充发生在 photochemistry_mod 的内部子例程 indice,消费发生在 fill_matrix。
该文件的核心作用是把反应化学计量写成紧凑的“系数-物种索引”对,供 fill_matrix 把光解样一阶反应、同物种二次反应和二体反应装配到 Jacobian、产生项和损失项。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
types_asis |
module |
1-35 |
ASIS 反应索引类型和共享数组模块 |
jpim |
integer parameter |
4 |
索引整型 kind,源码固定为 4 |
jprb |
integer parameter |
5 |
反应系数实型 kind,源码固定为 8 |
z3spec |
derived type |
8-15 |
三对“系数-物种索引”槽位,用于 A -> B + C 或 A + A -> B + C 类反应 |
z4spec |
derived type |
16-25 |
四对“系数-物种索引”槽位,用于 A + B -> C + D 类反应 |
indice_phot |
allocatable saved module array |
29 |
type(z3spec) 数组;保存光解、quench 和异相反应索引 |
indice_3 |
allocatable saved module array |
30 |
type(z3spec) 数组;保存同物种二次反应索引 |
indice_4 |
allocatable saved module array |
31 |
type(z4spec) 数组;保存二体反应索引 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
本模块自包含,只定义 kind、派生类型和 module 数组 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
| 无 |
- |
- |
本文件无 procedure、无 call、无 I/O |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
nb_phot_max |
photochemistry_mod::indice |
integer |
- |
分配 indice_phot(:) 的长度 |
nb_reaction_3_max |
photochemistry_mod::indice |
integer |
- |
分配 indice_3(:) 的长度 |
nb_reaction_4_max |
photochemistry_mod::indice |
integer |
- |
分配 indice_4(:) 的长度 |
| 物种索引参数 |
photochemistry_mod::indice |
integer |
- |
构造 z3spec/z4spec 时写入偶数字段 z2/z4/z6/z8 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
indice_phot(:) |
photochemistry_mod::fill_matrix |
type(z3spec) |
- |
一阶反应表。z1/z2 是被消耗物种系数和索引,z3/z4、z5/z6 是最多两个产物的系数和索引 |
indice_3(:) |
photochemistry_mod::fill_matrix |
type(z3spec) |
- |
同物种二次反应表。fill_matrix 按 c(reactant)^2 进入产生项,按 v_3*c(reactant) 进入损失和矩阵项 |
indice_4(:) |
photochemistry_mod::fill_matrix |
type(z4spec) |
- |
二体反应表。z1/z2、z3/z4 是两个反应物,z5/z6、z7/z8 是最多两个产物 |
共享状态与副作用
indice_phot、indice_3、indice_4 是 allocatable, save module 数组,并通过 OpenMP 指令声明为 THREADPRIVATE。
- 本文件只声明数组;
photochemistry_mod::indice 在首次建立反应表时执行 allocate(indice_phot(nb_phot_max))、allocate(indice_3(nb_reaction_3_max))、allocate(indice_4(nb_reaction_4_max))。
- 源码搜索未发现
deallocate(indice_phot)、deallocate(indice_3) 或 deallocate(indice_4)。推断:这些索引数组按进程或线程生命周期保留,供后续光化学列调用复用。
i_dummy 在 photochemistry_mod::indice 中设为 1,当某个产物系数为 0.0 时作为占位物种索引使用;这不是 types_asis 自身定义的变量。
核心逻辑
- 定义
jpim=4、jprb=8,固定反应索引的整数 kind 和系数的双精度实数 kind。
- 定义
z3spec:字段顺序为 z1 real、z2 integer、z3 real、z4 integer、z5 real、z6 integer。
- 定义
z4spec:在 z3spec 基础上追加 z7 real、z8 integer。
- 声明三组保存型 allocatable 数组,分别服务三类反应:
indice_phot:光解、quench、异相反应等按一阶过程进入 fill_matrix。
indice_3:A + A -> B + C,反应速率项用 c(A)^2。
indice_4:A + B -> C + D,反应速率项用 c(A)*c(B)。
- 用
!$OMP THREADPRIVATE 保证 OpenMP 线程各自持有这些数组副本。
伪代码
module types_asis:
define integer kind jpim = 4
define real kind jprb = 8
type z3spec:
coefficient_1, species_index_1
coefficient_2, species_index_2
coefficient_3, species_index_3
type z4spec:
coefficient_1, species_index_1
coefficient_2, species_index_2
coefficient_3, species_index_3
coefficient_4, species_index_4
declare saved allocatable arrays:
indice_phot(:) as z3spec
indice_3(:) as z3spec
indice_4(:) as z4spec
mark arrays THREADPRIVATE
end module
参与的主题流程
| 主题 |
参与方式 |
| 光化学隐式积分 |
提供反应化学计量表的数据结构,photochemistry_mod::fill_matrix 用它装配 ASIS Jacobian |
| 离子化学和氘化学 |
不直接判断开关;当 ionchem 或 deutchem 为真时,photochemistry_mod::indice 会向这些数组追加对应反应 |
| 异相化学 |
indice_phot 也保存 HO2/OH/H2O2 + ice/dust 的一阶化异相反应索引 |
写法特点
- 文件只有 35 行,没有
contains 区、没有例程、没有外部 I/O。
z1/z3/z5/z7 不是命名为 reactant/product 的语义字段,复现时必须结合 photochemistry_mod::indice 的构造顺序和 fill_matrix 的消费顺序解释。
- 产物缺失时并不省略字段,而是写入
0.0, i_dummy;fill_matrix 仍会访问占位索引,但零系数使产生项为零。
THREADPRIVATE 让这些 SAVE 数组在线程间隔离;若新增释放或重新分配路径,必须考虑每线程数组状态。
复现要点
- 先由
photochemistry_mod::indice 按 nb_phot_max/nb_reaction_3_max/nb_reaction_4_max 分配并填满三组数组,再由 fill_matrix 使用;反过来调用会访问未分配数组。
z3spec(a,i,b,j,c,k) 对应一阶或同物种二次反应时,不同数组的数学含义由使用点决定:indice_phot 用 v_phot,indice_3 用 v_3*c(A) 或 v_3*c(A)^2。
z4spec(a,i,b,j,c,k,d,l) 在 fill_matrix 中前两对是反应物,后两对是产物;二体矩阵拆分使用 eps_4=abs(c(A))/(abs(c(A))+abs(c(B))+1.d-10)。
- 数组长度必须与
photochemistry_mod::indice 实际计数一致;该子例程会打印计数并在不一致时调用 abort_physic("indice","wrong array dimensions",1)。
待确认
- 未找到这些 allocatable 数组的释放路径;是否有意按模型生命周期保留待确认。
jpim=4、jprb=8 是源码硬编码 kind 值,未见与全局 kind 模块统一;跨编译器 portability 需要构建体系确认。
相关页面