param_read_e107.F
路径
LMDZ.MARS\libf\aeronomars\param_read_e107.F
所属目录 / 模块
libf\aeronomars
文件定位
param_read_e107.F 定义 param_read_e107_mod,提供热层 E107 参数读取例程 param_read_e107。它是当前源码中可见的热层参数初始化入口:physiq_mod.F 在 callthermos 为真时先调用 fill_data_thermos、allocate_param_thermos、allocate_param_iono,再调用 param_read_e107。
该例程把 datadir/EUVDAT/param_v6 下的柱含量、透过率/光吸收表、E10.7 拟合系数和 Mars-year E107 时间序列表读入 param_v4_h,并设置解离/电离效率表。与旧版 param_read 相比,本文件改用 param_v6/trans*.dat,新增 fit_js_e107.dat、e107_MY*.dat 和 Schunk & Nagy (2000) 分支比文件,并显式支持 callkeys_mod::solvaryear 选择太阳活动年表。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
param_read_e107_mod |
module |
1(end module 554) |
封装 E107 版热层参数读取例程 |
param_read_e107 |
subroutine |
7(end subroutine 552) |
读取 EUVDAT/param_v6 表格、E107 序列和电离分支比,初始化 param_v4_h 热层共享参数 |
filename |
local character*13 |
37 |
根据 solvaryear 构造 e107_MYxx.dat 文件名 |
ierr |
local integer |
35 |
只用于 coln.dat 打开失败检测 |
nada |
local real |
36 |
读取电离分支比文件第二列总电离效率的占位变量 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
param_v4_h |
c1_16,c17_24,c25_29,c30_31,c32..c36,t0,jabsifotsintpar,ninter,nz2,nabs,e107,date_e107,e107_tab,coefit0..coefit4,efdis*,efion*,fluxtop,ct1,ct2,p1,p2 等 |
写入热层 EUV 表、E107 拟合系数、时间序列和解离/电离效率 |
jfotsout/crscabsi2/co2crsc195/co2crsc295/ct1/ct2/p1/p2/e107 在本例程 use 列表中出现但未直接写入 |
datafile_mod |
datadir |
拼接 EUVDAT/param_v6 和 EUVDAT/*branchingratio* 文件路径 |
- |
mod_phys_lmdz_para |
is_master |
限定大部分文件 I/O 在 master 进程执行 |
- |
mod_phys_lmdz_transfert_para |
bcast |
广播 master 读入的数组到其他进程 |
efiono3p/efionn/efionno/efionh 在所有进程本地设置,未单独广播 |
callkeys_mod |
solvaryear |
选择 e107_MYxx.dat 年表文件 |
错误提示写“24 and 37”,而条件允许 23..37 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
bcast |
mod_phys_lmdz_transfert_para |
276-297, 410-415, 448-451, 479-482, 512-515 |
广播柱含量、透过率、E107 拟合/时间表和部分电离分支效率 |
open/read/close |
Fortran intrinsic |
多处 |
读取 param_v6 表、E107 年表和分支比文件 |
write/STOP |
Fortran intrinsic |
51-60, 260-263, 270 |
缺 coln.dat 或 solvaryear 不合法时中止;读取 E107 表时逐行打印调试信息 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
datadir |
datafile_mod / callphys.def |
character path |
- |
数据目录根路径 |
solvaryear |
callkeys_mod / callphys.def |
integer |
Mars year |
选择 e107_MYxx.dat;源码条件允许 23..37 |
coln.dat |
datadir/EUVDAT/param_v6 |
ASCII table |
mixed |
柱含量分组,反向写入 c1_16/c17_24/.../c36 |
trans*.dat |
datadir/EUVDAT/param_v6 |
ASCII tables |
mixed |
13 个吸收体的 jabsifotsintpar(i,absorber,interval) 表 |
fit_js_e107.dat |
datadir/EUVDAT/param_v6 |
ASCII table |
- |
coefit0..coefit4(ninter,nabs) 多项式拟合系数 |
e107_MYxx.dat |
datadir/EUVDAT/param_v6 |
669 行时间序列 |
- |
date_e107(1:669) 和 e107_tab(1:669) |
co2/o2/n2/co ion_branchingratio_schunkandnagy2000_param.dat |
datadir/EUVDAT |
ASCII tables |
fraction |
CO2、O2、N2、CO 的总电离效率和通道相对比例 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
c1_16,c17_24,c25_29,c30_31,c32..c36 |
param_v4_h |
real arrays over nz2 |
mixed |
柱含量查找表 |
jabsifotsintpar |
param_v4_h |
real (nz2,nabs,ninter) |
mixed |
各吸收体/区间的透过率或光吸收参数 |
t0 |
param_v4_h |
real (nz2) |
K |
所有进程本地设为 195. 后广播 |
fluxtop |
param_v4_h |
real (ninter) |
- |
所有进程本地设为 1. 后广播 |
coefit0..coefit4 |
param_v4_h |
real (ninter,nabs) |
- |
E10.7 到光吸收参数的多项式拟合系数 |
date_e107,e107_tab |
param_v4_h |
real (669) |
- |
E107 时间轴和表值 |
efdis* |
param_v4_h |
real (ninter) |
fraction |
各物种解离效率 |
efionco2,efiono2,efionn2,efionco,efiono3p,efionn,efionno,efionh |
param_v4_h |
real arrays |
fraction |
电离效率和通道分支 |
共享状态与副作用
- 写入
param_v4_h 的大量模块变量;例程无入参/出参。
- master 读取
param_v6 表和 E107/分支比文件,再通过 bcast 分发主要读入数组。
t0、fluxtop、解离效率硬编码段和部分电离效率在所有进程本地执行,不完全依赖广播。
coln.dat 打不开时直接 STOP;fit_js_e107.dat、e107_MYxx.dat 和分支比文件未使用 iostat。
- 读取 E107 年表时每行执行
write(*,*) 'param_read_e107/292', date_e107(i), e107_tab(i), i,会产生 669 行标准输出。
核心逻辑
- master 打开
EUVDAT/param_v6/coln.dat,缺失则打印 datadir 修复提示并 STOP。
- master 打开 26 个
trans*.dat 表,跳过两行表头,按 i=nz2..1 反向填入柱含量和 jabsifotsintpar。
- master 关闭表文件;所有进程设置
t0(:)=195. 和 fluxtop(:)=1.。
- master 读取
fit_js_e107.dat:对每个 inter=1..ninter 先跳一行,再读 j=1..nabs 的 coefit0..coefit4。
- master 检查
solvaryear,构造 e107_MYxx.dat,读取 669 行 date_e107/e107_tab 并打印每行。
- 广播
t0/fluxtop、柱含量、jabsifotsintpar、coefit0..coefit4、date_e107/e107_tab。
- 所有进程清零解离/电离效率数组,并硬编码 H2O、H2O2、O3、NO2、H2、O/N/H 等效率。
- master 分别读取 CO2、O2、N2、CO 的 Schunk & Nagy 分支比文件,用第二列总电离效率计算
efdis* = 1 - total_ionization,并把各通道相对比例乘上总电离效率。
- 每类分支比读取后广播对应
efion* 与 efdis*,再对高区间解离效率设为 1。
伪代码
param_read_e107():
if is_master:
open param_v6/coln.dat with iostat, stop if missing
open all trans*.dat tables, skip two header rows
read coln.dat and trans*.dat from nz2 down to 1
close table units
t0(:) = 195
fluxtop(:) = 1
if is_master:
read fit_js_e107.dat into coefit0..coefit4
if solvaryear in 23..37:
filename = "e107_MY"//solvaryear//".dat"
else:
print error; stop
read 669 date/e107 rows into date_e107/e107_tab and print each row
bcast table arrays and E107 arrays
zero efdis*/efion*
set hard-coded dissociation efficiencies
for species in CO2, O2, N2, CO:
if is_master:
read species branching-ratio file
derive efdis* and efion* channels
bcast species efdis*/efion*
set remaining high intervals to fully dissociated
set O(3P), N, NO, H ionization efficiencies locally
参与的主题流程
| 主题 |
参与方式 |
| 热层初始化 |
physiq_mod.F 在 callthermos 分支中调用本例程,载入热层 EUV/E107 参数 |
| 热层 EUV 加热 |
hrtherm/jthermcalc_e107 消费 fluxtop、coefit*、date_e107/e107_tab 和 jabsifotsintpar |
| 热层化学/光化学 |
paramfoto_compact 注释说明会使用 jthermcalc_e107 光吸收率和本例程给出的 ionization/dissociation branching ratios |
写法特点
- 固定格式
.F,硬编码 unit 和文件名。
- 只有
coln.dat 和 solvaryear 有显式错误分支;其他输入文件依赖 Fortran I/O 运行时错误。
- E107 年表长度硬编码为 669,文件名长度
character*13 正好容纳 e107_MYxx.dat。
- 错误提示说
solvaryear must be between 24 and 37,但条件实际允许 23。
lnblnk、k 局部变量声明后未见使用;ct1/ct2/p1/p2 在 use 列表中但 E107 路径不读 varflujo.dat。
复现要点
callphys.def 中需使 callthermos 为真,才会在 physiq_mod 初始化段触发本例程。
datadir 必须包含 EUVDAT/param_v6/coln.dat、所有 trans*.dat、fit_js_e107.dat、对应 e107_MYxx.dat 以及 EUVDAT/*ion_branchingratio_schunkandnagy2000_param.dat。
solvaryear 必须满足源码条件 23 <= solvaryear <= 37;否则 STOP。
- 并行复现需确认 master 读取后广播完成,尤其是 E107 拟合系数和分支比数组。
- 标准输出会包含 669 行 E107 表值打印,批量运行日志可能较长。
待确认
solvaryear 合法范围的代码条件(23..37)与报错文案(24..37)不一致,需确认哪个是设计意图。
e107 标量由 param_v4_h 声明;本例程不直接赋值,实际运行时写入见 jthermcalc_e107_mod.F的 E10.7 插值逻辑。
efdisno 没有从文件读取,后续 efionno(inter)=1.-efdisno(inter) 依赖前面清零和局部设置;NO 解离效率是否应来自旧版 efdis_inter.dat 待确认。
efiono3p/efionn/efionno/efionh 是所有进程本地硬编码而非广播;这应是安全的,但需在并行路径中确认没有线程私有初始化差异。
相关页面