iono_h.F90
路径
LMDZ.MARS\libf\aeronomars\iono_h.F90
所属目录/模块
libf\aeronomars
文件定位
iono_h.F90 定义 iono_h,是电离层/离子化学的共享状态模块。它保存 18 个物种“平衡标志”字符数组(*_eq,长度 nlayer)和 27 个离子/中性物种反应系数数组 tau*(real*8 (nreact,nlayer)),全部 SAVE/ALLOCATABLE 并 THREADPRIVATE;提供分配例程 allocate_param_iono 和电子温度函数 temp_elect。physiq_mod 在初始化时调用 allocate_param_iono 分配数组,paramfoto_compact 读取 tau*/*_eq 计算离子化学速率,calchim_mod 调用 temp_elect 取电子温度。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
iono_h |
module |
1(END MODULE 173) |
电离层共享状态模块 |
allocate_param_iono |
subroutine |
57(END 110) |
按 nlayer,nreact 分配 18 个标志数组与 27 个 tau* 数组 |
temp_elect |
function |
114(end 171) |
按高度计算电子温度(Viking 或 MAVEN 剖面) |
o1d_eq 等 18 个 |
character*1 save allocatable |
5–22 |
物种平衡标志 (nlayer):o1d_eq,ho2_eq,oh_eq,h_eq,n2d_eq,no2_eq,o3_eq,no_eq,cplus_eq,coplus_eq,oplus_eq,n2plus_eq,hplus_eq,co2plus_eq,o2plus_eq,noplus_eq,nplus_eq,hco2plus_eq |
tauco2 等 27 个 |
real*8 save allocatable |
23–49 |
物种反应系数 (nreact,nlayer):tauco2,tauo2,tauo3p,tauco,tauh,tauoh,tauho2,tauh2,tauh2o,tauo1d,tauh2o2,tauo3,taun,tauno,taun2,taun2d,tauno2,tauco2plus,tauoplus,tauo2plus,taucoplus,taucplus,taunplus,taunoplus,taun2plus,tauhplus,tauhco2plus |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
| 无 |
- |
- |
自包含模块,无 use 依赖 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
| 无外部例程 |
- |
- |
allocate_param_iono 仅 allocate;temp_elect 仅用 tanh 与表插值 |
输入
allocate_param_iono(nlayer,nreact):nlayer、nreact(integer)。 temp_elect(zkm,tt,origin):zkm 高度(km)、tt 中性温度(K)、origin 来源(1=Viking,2=MAVEN)。
输出
| 输出 |
去向 |
类型/维度 |
含义 |
18 个 *_eq + 27 个 tau* |
paramfoto_compact 等读取 |
char/real*8 数组 |
离子化学平衡标志与反应系数 |
temp_elect 返回值 |
calchim_mod:821 |
real |
电子温度(K) |
共享状态与副作用
- 45 个模块数组为
SAVE, ALLOCATABLE,并用 !$OMP THREADPRIVATE(第 51–53 行)声明;模块外可读取。
allocate_param_iono 仅分配,不赋初值,也无对应 deallocate 例程(见待确认)。
temp_elect 为纯函数性质(无副作用),但对 origin 非 1/2 打印错误并回退中性温度;photochemistry_mod 的 temp_elect(nlayer) 是调用方传入的电子温度数组,不是本函数调用。
- 无文件 I/O、无
getin、无 abort。
核心逻辑
allocate_param_iono(nlayer,nreact)(第 57–110 行):allocate 18 个 *_eq(nlayer) 与 27 个 tau*(nreact,nlayer)。
temp_elect(zkm,tt,origin)(第 114–171 行):
- Viking 表
zhanson=(120,130,150,175,200,225,250,275,300)、tehanson=(tt,200,300,500,1250,2000,2200,2400,2500)。
origin=1(Viking):zkm≤120 → tt;zkm≥300 → 2500;其间对 zhanson/tehanson 线性插值。
origin=2(MAVEN,Ergun et al. GRL 2015):zkm≤120 → tt;否则 temp_elect=(3140+120)/2 + (3140-120)/2*tanh((zkm-241)/60)。
- 其他
origin:打印错误,回退 tt。
伪代码
allocate_param_iono(nlayer, nreact):
allocate *_eq(nlayer) for 18 species
allocate tau*(nreact, nlayer) for 27 species
temp_elect(zkm, tt, origin):
if origin == 1: # Viking
if zkm <= 120: return tt
if zkm >= 300: return 2500
linear-interp tehanson over zhanson -> return
else if origin == 2: # MAVEN
if zkm <= 120: return tt
return (3140+120)/2 + (3140-120)/2 * tanh((zkm-241)/60)
else:
print error; return tt
参与的主题流程
| 主题 |
参与方式 |
| 电离层 / 离子化学 |
physiq 分配数组;paramfoto_compact 用 tau*/*_eq 算离子反应速率;calchim 用 temp_elect 取电子温度驱动电子温度依赖反应 |
写法特点
- 自由格式
.F90 模块;45 个数组全 SAVE+ALLOCATABLE+THREADPRIVATE。
character*1 平衡标志 + real*8 反应系数,物种覆盖中性(CO2/O2/O/H2O/…)与离子(CO2+/O+/O2+/…/HCO2+)。
temp_elect 内置 Viking 表与 MAVEN tanh 公式;MAVEN 公式注释说明 Langmuir 探针 <500K 不敏感,低热层(<150km)可能高估。
allocate_param_iono 无对应 deallocate;无分配前 allocated 守卫。
- photochemistry_mod 另有同名哑元数组
temp_elect(nlayer),与本函数无关(名称遮蔽)。
复现要点
- 须先
allocate_param_iono(nlayer,nreact) 再使用 tau*/*_eq;nreact 须与离子化学网络反应数一致。
temp_elect 依赖 origin:Viking(1) 用表插值,MAVEN(2) 用 tanh 公式;二者给出不同电子温度,影响电子温度依赖反应速率。
- 数组
THREADPRIVATE,并行复现需确认各线程完成分配。
- 无 deallocate 例程,重复分配需调用方自行避免。
待确认
- 无
deallocate_param_iono 是否有意(依赖进程退出释放或调用方管理)。
*_eq 标志的取值约定(如 'y'/'n')与赋值方,待 paramfoto_compact/chemthermos 文件页确认。
tau* 的赋值例程(疑为 paramfoto_compact 或 jthermcalc*),待相关文件页确认。
相关页面