chemthermos_readini.F
快速理解
它做什么: 从 chemthermos_reactionrates.def 读取 61 个热层气相反应的 Arrhenius 速率常数。被 calchim_mod 在 firstcall 调用。
基本过程: 循环 61 次 → 每次读 rc1/rc2/rc3 三元组 → 填入 param_v4_h::rcoef(61,3)。
关键结果: rcoef(61,3),被 paramfoto_compact 按 k=rcoef(i,1)*(T/300)^rcoef(i,2)*exp(rcoef(i,3)/T) 算反应速率。
路径
LMDZ.MARS\libf\aeronomars\chemthermos_readini.F
所属目录/模块
libf\aeronomars
文件定位
chemthermos_readini.F 定义 chemthermos_readini_mod,提供唯一例程 chemthermos_readini:从运行目录下的 chemthermos_reactionrates.def 读取 61 个热层气相化学反应的 Arrhenius 速率常数参数,填入共享模块 param_v4_h::rcoef(61,3)。该例程由 calchim_mod 在 firstcall、if(.not.unichim) 条件下调用一次;rcoef 随后被 paramfoto_compact 取用,按 k=rcoef(i,1)*(T/300)^rcoef(i,2)*exp(rcoef(i,3)/T) 计算 ch2..ch87 各反应速率。
反应逐项含义、文献来源与文件格式详见参考页 reaction-rates;本页只从源码视角记录读取例程的 use/call/输入输出/副作用。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
chemthermos_readini_mod |
module | 1(END MODULE 40) |
包装反应速率读取例程的模块 |
chemthermos_readini |
subroutine | 7(END SUBROUTINE 38) |
读取 chemthermos_reactionrates.def 填充 param_v4_h::rcoef |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
param_v4_h |
rcoef |
写入反应速率系数数组 rcoef(61,3)(real*8,定义于 param_v4_h.F90:45) |
param_v4_h 中 rcoef 为普通 module array,未显式声明 SAVE/THREADPRIVATE |
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
abort_physic |
LMDZ 物理工具(本例程 use 列表未显式声明其模块) | 34 | 文件缺失时中止运行 |
open / read / close |
Fortran intrinsic | 19 / 22–26 / 31 | 读取格式化反应速率文件 |
write |
Fortran intrinsic | 33 | 文件缺失时打印空行提示 |
输入
chemthermos_readini 无哑元参数,输入来自文件:
| 输入 | 来源 | 类型 | 含义 |
|---|---|---|---|
chemthermos_reactionrates.def |
运行目录(CWD,相对路径) | formatted ASCII | 61 个反应的 Arrhenius 参数,1 行头 + 每反应 3 行(2 行说明 + 1 行 rc1,rc2,rc3) |
输出
| 输出 | 去向 | 类型/维度 | 含义 |
|---|---|---|---|
rcoef |
param_v4_h 模块变量;使用方 paramfoto_compact |
real*8 (61,3) |
反应速率系数:(,1)=A、(,2)=B 温度指数、(,3)=C 活化温度 |
共享状态与副作用
- 写入
param_v4_h::rcoef(61,3)(real*8);param_v4_h 中该数组未显式声明SAVE/THREADPRIVATE,本文件也不含相关声明。 - 文件 I/O 使用硬编码单位
unit=10;文件名为硬编码相对路径chemthermos_reactionrates.def(非datadir拼接)。 - 文件缺失(
ierr/=0)时打印空行并abort_physic中止。 - 无诊断输出、不读取配置键、无
getin覆盖文件名。
核心逻辑
open(unit=10,file='chemthermos_reactionrates.def',status='old',iostat=ierr)(第 19–20 行)。- 若
ierr==0(第 21 行):read(10,*)跳过文件头(第 22 行);do i=1,61(第 23–30 行):两次read(10,*)跳过该反应的方程与文献说明行,再read(10,*) rc1,rc2,rc3读数据行,赋值rcoef(i,1:3)=rc1,rc2,rc3;close(10)(第 31 行)。
- 否则(第 32–36 行):
write(*,*)打印空行,call abort_physic("chemthermos_readini",'Cannot find file chemthermos_reactionrates.def',1)。
伪代码
chemthermos_readini():
open unit=10, file='chemthermos_reactionrates.def', status='old', iostat=ierr
if ierr == 0:
read(10,*) # skip header
for i = 1..61:
read(10,*) # skip reaction equation line
read(10,*) # skip source/literature line
read(10,*) rc1, rc2, rc3
rcoef(i,1)=rc1; rcoef(i,2)=rc2; rcoef(i,3)=rc3
close(10)
else:
write(*,*)
call abort_physic("chemthermos_readini", "Cannot find file ...", 1)
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 热层化学 / 光化学 | calchim_mod firstcall(if(.not.unichim))调用,载入反应速率;paramfoto_compact 消费 rcoef 计算 ch2..ch87 供 chemthermos 化学源汇 |
写法特点
- 固定格式
.F(续行用第 6 列$/&)。 - 文件以相对路径打开(
chemthermos_reactionrates.def),运行时须位于当前工作目录,而非datadir——与read_phototable(datadir拼接 +phototable配置键)不同。 - 文件名与单位
10均硬编码,无getin覆盖。 - 每反应读 3 行(2 行说明 + 1 行数据),与
reaction-rates.md记录的 184 行格式一致。
复现要点
- 运行目录须含
chemthermos_reactionrates.def(来自deftank),否则abort_physic中止;不经过datadir。 - 仅在
calchim_modfirstcall 且.not.unichim时调用;unichim=true路径跳过本读取。 - 反应数严格为 61,与
param_v4_h::rcoef(61,3)维度绑定;增删反应须同步改数组维度与文件。 rcoef(1..33)由paramfoto_compact用中性温度tcte计算,rcoef(34..61)用电子温度t_elect计算(见 reaction-rates);本例程不区分,仅顺序读入。rcoef在 param_v4_h 中是普通 module array,未显式THREADPRIVATE;本例程在 master/所有进程均会执行打开与读取(无is_master守卫)。
待确认
abort_physic的宿主模块未在本例程use列表显式声明,可能经其他 host 模块间接可用;待确认。- 本例程无
is_master守卫,是否所有 MPI 进程都打开同一文件(以及是否依赖文件系统可见性),待确认并行运行约定。
相关页面
- reaction-rates:
chemthermos_reactionrates.def的逐反应速率常数、文献来源与文件格式参考。 - aeronomars/index:
aeronomars目录总览,本文件在其“光化学”分类下。 - param_v4_h:共享参数模块文件页,定义
rcoef(61,3)并确认其非显式THREADPRIVATE。 - calchim_mod:调用方文件页,含
chemthermos_readini调用点与unichim分支。 - paramfoto_compact:
rcoef使用方,用 61 组 Arrhenius 参数计算ch2..ch87。 - chemthermos:热层化学文件页,消费本例程读入的反应速率并调用
paramfoto_compact。