moldiff.F
路径
LMDZ.MARS\libf\aeronomars\moldiff.F
概述
moldiff_mod 是 LMDZ.MARS 的原版(legacy)分子扩散模块,在 65 km 以上热层区域求解 14 种中性物种的多组分分子扩散。它采用 Dickinson & Ridley (1972) 的 α 矩阵表述,经 LU 分解/求逆后转为隐式三对角系统求解混合比倾向,并在顶部用 Jeans 逃逸方程处理 H/H₂ 逃逸通量。
当前状态:无直接调用方。 thermosphere_mod.F 通过 moldiff_scheme 开关(默认 2)选择 moldiff_red(legacy scheme, moldiff_scheme==1)或 moldiff_MPF(MPF scheme, moldiff_scheme==2),两者均不引用 moldiff_mod。moldiff.F 为遗留死代码,changelog 记录了从活跃使用到逐步被 moldiff_red/moldiff_MPF 取代的完整历史。
定义符号
| 符号 |
类型 |
行号 |
说明 |
moldiff_mod |
module |
1 |
包装分子扩散主例程和三个数值辅助例程 |
moldiff |
subroutine |
7–461 |
14 物种多组分分子扩散求解器 |
tridag_sp |
subroutine |
467–492 |
三对角矩阵 Thomas 算法求解器 |
LUBKSB_SP |
subroutine |
498–531 |
LU 分解回代(Numerical Recipes) |
LUDCMP_SP |
subroutine |
537–616 |
LU 分解 + 部分主元选取(Numerical Recipes) |
物种编号(moldiff 内部)
| 本地索引 |
参数名 |
物种 |
备注 |
| 1 |
i_co |
CO |
|
| 2 |
i_n2 |
N₂ |
|
| 3 |
i_o2 |
O₂ |
|
| 4 |
i_co2 |
CO₂ |
|
| 5 |
i_h2 |
H₂ |
|
| 6 |
i_h |
H |
|
| 7 |
i_oh |
OH |
|
| 8 |
i_ho2 |
HO₂ |
|
| 9 |
i_h2o |
H₂O |
|
| 10 |
i_h2o2 |
H₂O₂ |
|
| 11 |
i_o1d |
O(¹D) |
|
| 12 |
i_o3 |
O₃ |
|
| 13 |
i_ar |
Ar |
|
| 14 |
i_o |
O |
必须排最后——高层大气主导物种 |
共享状态(SAVE + OMP THREADPRIVATE)
| 变量 |
类型 |
说明 |
g_co2/g_co/g_o/g_o1d/g_o2/g_o3/g_h/g_h2/g_oh/g_ho2/g_h2o2/g_n2/g_ar/g_h2o |
integer, save |
14 个 tracer 的 GCM 索引 |
gcmind(14) |
integer, save |
本地索引→GCM 索引映射 |
firstcall |
logical, save |
首次调用标志 |
dij(14,14) |
real, save |
二元扩散系数矩阵缓存 |
use 依赖
| 模块 |
引用符号 |
用途 |
tracer_mod |
igcm_co2, igcm_co, igcm_o, igcm_o1d, igcm_o2, igcm_o3, igcm_h, igcm_h2, igcm_oh, igcm_ho2, igcm_h2o2, igcm_n2, igcm_ar, igcm_h2o_vap, mmol |
14 个 tracer 索引 + 摩尔质量 |
conc_mod |
rnew, mmean |
混合气体比气体常数和平均摩尔质量 |
comcstfi_h |
g |
重力加速度 |
moldiffcoeff_mod |
moldiffcoeff |
14 物种二元扩散系数矩阵 dij |
call 调用
| 被调例程 |
所在模块 |
用途 |
moldiffcoeff |
moldiffcoeff_mod |
firstcall 时获取 dij(14,14) 扩散系数矩阵 |
ludcmp_sp |
本文件 |
LU 分解 α 矩阵 |
lubksb_sp |
本文件 |
LU 回代求 α 逆矩阵 |
tridag_sp |
本文件 |
三对角隐式求解各物种混合比 |
moldiff 参数表
| 参数 |
方向 |
维度 |
说明 |
ngrid |
in |
scalar |
大气柱数 |
nlayer |
in |
scalar |
大气层数 |
nq |
in |
scalar |
平流 tracer 数 |
pplay |
in |
(ngrid, nlayer) |
层中心气压 (Pa) |
pplev |
in |
(ngrid, nlayer+1) |
层界面气压 (Pa) |
pt |
in |
(ngrid, nlayer) |
温度 (K) |
pdt |
in |
(ngrid, nlayer) |
温度总倾向 (K/s) |
pq |
in |
(ngrid, nlayer, nq) |
tracer 质量混合比 (kg/kg) |
pdq |
in |
(ngrid, nlayer, nq) |
tracer 倾向 (kg/kg/s) |
ptimestep |
in |
scalar |
物理时步 (s) |
zzlay |
in |
(ngrid, nlayer) |
层中心高度 (m) |
pdteuv |
in |
(ngrid, nlayer) |
EUV 加热倾向 (K/s) |
pdtconduc |
in |
(ngrid, nlayer) |
热传导倾向 (K/s) |
pdqdiff |
out |
(ngrid, nlayer, nq) |
分子扩散 tracer 倾向 (kg/kg/s) |
核心逻辑
firstcall 初始化(第 117–213 行)
- 调用
moldiffcoeff(dij) 获取 14×14 二元扩散系数矩阵。
- 逐一检查 14 个必需 tracer 的
igcm_* 索引;任一为 0 即 stop。
- 建立
gcmind(1:14) 映射(本地物种索引 → GCM tracer 索引)。
逐列求解(第 222–459 行,do ig=1,ngrid)
- 前向推算温度和混合比(第 224–249 行):
tt = pt + pdt·dt + pdteuv·dt + pdtconduc·dt;qq = pq + pdq·dt,钳位 ≥ 1e-30。
- 标高和平均分子量梯度(第 233–255 行):
hp = -log(p(l+1)/p(l-1));dmmeandz = (mmean(l+1)-mmean(l-1))/hp,边界层用 3 点差分。
- 构造 α 矩阵(第 259–286 行,Dickinson & Ridley 1972):
- 对 13×13 子矩阵(排除 O),每对物种
(nn, n) 按 dij(nn,n)·ptfac(ptfac = (1e5/p)·(T/273)^1.75)计算扩散系数。
alf(nn,n) = qq(nn)/ntot/1.66e-27 · (1/(mmol(n)·d(nn)) - 1/(mmol(O)·d_O))。
- 对角线修正
alfdiag。
b(l,n) = -(dmmeandz/mmean + mmol(n)/mmean - 1) 重力分离项。
- LU 求逆 α 矩阵(第 291–310 行):
ludcmp_sp + lubksb_sp,得 alfinv(l,nn,n) = y(nn,n)/hh(hh = rnew·T/g 标高)。
- 若 LU 失败(奇异矩阵),全列
pdqdiff = 0 并 return。
- 三对角系数(第 316–334 行):
del1 = hp·p/(g·dt),del2 = (hp/2)²·p/(g·dt)。
aa/bb/cc 分别为下/主/上对角线系数,包含 alfinv 垂直梯度和 b 项。
- Jeans 逃逸通量(第 339–376 行,Hunten 1973 eq. 5):
- H:
wi(H) = √(2kT/(m·1.6605e-27)) / (2√π) · (1+pote)·exp(-pote);pote = (R_mars+z)/(kT/(m·g))。
- H₂:同公式。
flux(H/H₂) = qq(nz)·dens/m_H · wi,abfac(H/H₂) = 0(逃逸边界),其余物种 abfac = 1(扩散平衡)。
- 三对角求解(第 385–435 行,逐物种):
- 组装
atri/btri/ctri/rtri(层 2 到 nz-1),含交叉物种耦合项。
- 顶部边界(第 408–414 行):逃逸物种用
flux;非逃逸物种用 abfac·ctri/(3-2·hp·b) 扩散平衡条件。
- 底部边界(第 417 行):完全混合
btri(1) += atri(1)。
tridag_sp 求解得 qnew(l,nn),钳位 ≥ 1e-30。
- 顶层
qnew(nz,nn) 由逃逸通量或扩散平衡外推。
- 底层
qnew(1,nn) = qnew(2,nn)。
- 写倾向(第 437–447 行):仅在
zlocal > 65000 m 时写入:
pdqdiff(ig,l,n) = (qnew(l,n) - qq(l,n)) / ptimestep。
- O 倾向由质量守恒反算:
pdqdiff(ig,l,g_o) = -Σ_{n≠O} pdqdiff(ig,l,n)。
辅助例程
tridag_sp(第 467–492 行)
Thomas 算法三对角求解器。a/b/c 为下/主/上对角线,r 为右端向量,输出 u。主元 b(j)-a(j)·gam(j) == 0 时 stop。
LUBKSB_SP(第 498–531 行)
Numerical Recipes 风格 LU 回代。输入 A(NP,NP) 和 INDX 置换向量,原地修改 B。
LUDCMP_SP(第 537–616 行)
Numerical Recipes 风格 LU 分解 + 部分主元选取。奇异矩阵(行最大元素为 0)时设 ierr=1 并 return(不再 stop),由调用方决定后续处理。
伪代码
moldiff(ngrid, nlayer, nq, pplay, ..., pdqdiff):
if firstcall:
moldiffcoeff(dij)
for each of 14 tracers: check igcm_* != 0
build gcmind(1:14)
firstcall = .false.
for ig = 1, ngrid:
tt = pt + (pdt + pdteuv + pdtconduc) * dt # forward temperature
qq = pq + pdq * dt # forward mixing ratios
hp = -log(p(l+1)/p(l-1)) # log-pressure thickness
dmmeandz = d(mmean)/hp # mean molecular weight gradient
for l = 1, nz:
build alf(13×13) from dij, qq, mmol, ntot # Dickinson-Ridley alpha matrix
ludcmp_sp(alf) + lubksb_sp → alfinv # invert alpha
build b(l,n) gravity separation term
build aa/bb/cc tridiagonal coefficients from alfinv gradients
compute Jeans escape flux for H and H2 at TOA (Hunten 1973)
for nn = 1, 13: # solve each species
assemble tridiagonal system with cross-coupling
apply escape BC (H/H2) or diffusive equilibrium BC (others) at top
apply perfect mixing BC at bottom
tridag_sp → qnew(:,nn)
for l where z > 65 km:
pdqdiff(l, n) = (qnew - qq) / dt # tendency for each species
pdqdiff(l, O) = -sum(pdqdiff(l, n≠O)) # O by mass conservation
调用关系
| 调用方 |
位置 |
说明 |
| 无直接调用方 |
— |
moldiff_mod 在整个 libf 中未被 use,moldiff 未被 call。 |
取代关系
thermosphere_mod.F(第 18–19 行)引入 moldiff_red_mod::moldiff_red(legacy scheme)和 moldiff_MPF_mod::moldiff_MPF(MPF scheme),通过 moldiff_scheme 开关(默认 2,第 67–68 行)选择。callmoldiff 在 conf_phys.F 读取(默认 .false.,MCD5/MCD6 配置开启 .true.,MCD6 设 moldiff_scheme=1),要求 callthermos=.true.。
| deftank 配置 |
callmoldiff |
moldiff_scheme |
| MCD5 |
.true. |
未设(默认 2 → MPF) |
| MCD6 |
.true. |
1(legacy moldiff_red) |
| GCM5/GCM6 |
.false. |
— |
与 moldiff_red/moldiff_MPF 的区别
| 特征 |
moldiff.F(本文件) |
moldiff_red.F90 |
moldiff_MPF.F90 |
| 物种数 |
固定 14 |
动态 ncompdiff(按 indic_diff 筛选) |
动态 ncompdiff |
| 扩散系数 |
moldiffcoeff(固定 14 物种) |
moldiffcoeff_red(动态物种列表) |
moldiffcoeff_red |
| H/H₂ 逃逸 |
Jeans 方程(Hunten 1973 eq. 5) |
含 D 同位素逃逸 PhiEscD |
含 D + 质量修正器 |
| 质量守恒 |
O 反算 |
O 反算 |
可选 call_mass_fixer_moldiff_MPF 柱质量修正 |
| 应用高度 |
z > 65 km |
配置相关 |
配置相关 |
| 活跃状态 |
死代码 |
moldiff_scheme==1 |
moldiff_scheme==2(默认) |
待确认
moldiff.F 是否在某个未编译的测试路径中仍被引用(当前 libf 全目录 grep 无 use moldiff_mod 或 call moldiff)。
- 与
moldiff_red 的具体算法差异——两者均标注 legacy,但 moldiff.F 的 α 矩阵维数固定为 13×13(排除 O),而 moldiff_red 使用动态维度。
- 第 370–376 行注释块 "TEMPORAIRE: no escape for h and h2" 是否曾被启用(当前被注释,逃逸生效)。
dij(h,o) = 0.000114 与 moldiffcoeff.F 第 195 行的覆盖旧值 0.0000144(~10× 差异)的物理依据。
相关页面