moldiffcoeff.F
路径
LMDZ.MARS\libf\aeronomars\moldiffcoeff.F
所属目录/模块
libf\aeronomars
文件定位
moldiffcoeff.F 定义 moldiffcoeff_mod,提供例程 moldiffcoeff,按 Nair 1994(pg 131)计算 14 种高层大气物种之间的二元分子扩散系数矩阵 dij(14,14)。首次调用时从 tracer_mod::igcm_* 识别 GCM tracer 索引(缺任一则 stop),随后用 H2-X 与 H-O 基础系数按 sqrt(mmol) 质量缩放填充对称矩阵(对角 1.0)。该例程由 moldiff(分子扩散主模块)调用。作者 MAC 2002。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
moldiffcoeff_mod |
module |
1(END MODULE 227) |
包装分子扩散系数计算的模块 |
moldiffcoeff |
subroutine |
7(END SUBROUTINE 225) |
计算 dij(14,14) 二元分子扩散系数矩阵 |
i_co..i_o |
integer parameters |
39–52 |
本地物种索引 1–14(O 必须为末位,高层主导) |
g_co2 等 14 个 |
integer save THREADPRIVATE |
55–68 |
GCM tracer 索引缓存,firstcall 从 igcm_* 设值 |
gcmind(14) |
integer save THREADPRIVATE |
73 |
本地索引→GCM 索引映射 |
firstcall |
logical save THREADPRIVATE |
76 |
首次调用标志 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
tracer_mod |
igcm_co2/co/o/o1d/o2/o3/h/h2/oh/ho2/h2o2/n2/ar/h2o_vap,mmol |
取 GCM tracer 索引与摩尔质量,做存在性校验与质量缩放 |
- |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
open/write/close |
Fortran intrinsic |
198/220/223 |
每次调用写诊断文件 coeffs.dat(unit 56) |
stop |
Fortran intrinsic |
86 等 |
firstcall 缺 tracer 时硬中止(非 abort_physic) |
输入
| 输入 |
来源 |
类型 |
含义 |
igcm_*(14 个) |
tracer_mod |
integer |
GCM tracer 索引;firstcall 校验非 0 |
mmol |
tracer_mod |
real array |
tracer 摩尔质量,用于 sqrt 质量缩放 |
输出
| 输出 |
去向 |
类型/维度 |
含义 |
dij |
moldiff.F:118 调用方 |
real (14,14) |
二元分子扩散系数矩阵,对称,对角 1.0 |
coeffs.dat |
文件 |
- |
每次调用覆写的 dij 诊断转储 |
共享状态与副作用
g_*(14)、gcmind、firstcall 为 SAVE + THREADPRIVATE(第 70–71、78 行)。
- firstcall 缺任一 tracer 调用
stop(硬中止,非 abort_physic)。
- 每次调用(非仅 firstcall)执行
open(56,file='coeffs.dat')、写 dij、close(56),并 print 'COEFF CALC'——文件 I/O 与标准输出副作用每次发生。
dij 计算在 firstcall 块之外(第 179–223 行),故每次调用重算(结果与状态无关,恒定)。
核心逻辑
- firstcall(第 81–176 行):从
igcm_* 设 14 个 g_*,每个校验非 0 否则 stop;填 gcmind(i_*)=g_*;firstcall=.false.。
- 基础系数(第 179–195 行):
dij(h2,co)=6.51e-5、(h2,n2)=6.74e-5、(h2,o2)=6.97e-5、(h2,co2)=5.50e-5;其余 dij(h2,*)=0;dij(h,o)=0.000114(第 195 行;第 194 行注释保留旧值 0.0000144)。
- 质量缩放填充(第 197–216 行):
open(56,'coeffs.dat');do n=1..14:
- 若
dij(h2,n)>0:dij(nn,n)=dij(h2,n)*sqrt(mmol(h2)/mmol(gcmind(nn)))(nn=n..14),对角置 1.0,对称。
- 若
dij(h2,n)==0:dnh=dij(h,o)*sqrt(mmol(o)/mmol(gcmind(n))),dij(nn,n)=dnh*sqrt(mmol(h)/mmol(gcmind(nn))),对角 1.0,对称。
- 转储(第 218–223 行):写
dij(n,nn) 到 unit 56;close(56)。
伪代码
moldiffcoeff(dij):
if firstcall:
g_* = igcm_* for 14 species; stop if any == 0
gcmind(i_*) = g_*
firstcall = false
# base coefficients (Nair 94)
dij(h2,co)=6.51e-5; dij(h2,n2)=6.74e-5; dij(h2,o2)=6.97e-5; dij(h2,co2)=5.50e-5
dij(h2, others)=0
dij(h,o)=0.000114
open(56,'coeffs.dat'); print 'COEFF CALC'
for n=1..14:
if dij(h2,n) > 0:
for nn=n..14: dij(nn,n)=dij(h2,n)*sqrt(mmol(h2)/mmol(gcmind(nn)))
if n==nn: dij(nn,n)=1.0
dij(n,nn)=dij(nn,n)
else:
dnh=dij(h,o)*sqrt(mmol(o)/mmol(gcmind(n)))
for nn=n..14: dij(nn,n)=dnh*sqrt(mmol(h)/mmol(gcmind(nn)))
if n==nn: dij(nn,n)=1.0
dij(n,nn)=dij(nn,n)
write dij to unit 56; close(56)
参与的主题流程
| 主题 |
参与方式 |
| 分子扩散 |
moldiff 调用,提供 dij 供高层大气分子扩散求解 |
写法特点
- 固定格式
.F(续行第 6 列 &)。
- 物种顺序固定 14 种,O 必须末位(高层主导,源码注释要求)。
- 基础系数 H2-CO/N2/O2/CO2 与 H-O 来自 Nair 1994;其余用
sqrt(mmol) Chapman-Enskog 质量缩放。
dij(h,o) 第 195 行 0.000114 覆盖第 194 行注释旧值 0.0000144(约 10×)。
- 对角强制 1.0,矩阵对称。
- firstcall 用
stop(非 abort_physic)中止。
- 局部
nq/i/iq 声明后未用。
复现要点
- 须先
initracer 设好 igcm_*;14 种 tracer 任一缺失即 stop。
dij 与运行状态无关(仅依赖常数 mmol 与基础系数),每次调用结果恒定;但每次调用都重算并覆写 coeffs.dat,并行/频繁调用时文件 I/O 为副作用。
coeffs.dat 用相对路径(CWD),unit 56 硬编码。
- O 须为第 14 物种;改变物种顺序须同步
i_* 与上游 moldiff。
待确认
- 每次调用重算
dij 并写 coeffs.dat 是否有意(结果恒定,疑可移入 firstcall)。
dij(h,o)=0.000114 相对注释旧值 0.0000144 的 ~10× 修正依据。
dij(h2,oh/ho2/h2o/h2o2/o3) 注释 !0003(3e-4)是否曾为候选值。
相关页面