moldiff.F
快速理解
它做什么: 原版(legacy)多组分分子扩散模块(Dickinson & Ridley 1972)。当前为死代码,已被 moldiff_MPF 取代。
基本过程: α 矩阵表述 → LU 分解/求逆 → 隐式三对角求解 → 顶部 Jeans 逃逸。
关键结果: 扩散倾向 pdqdiff 和 H/H₂ 逃逸通量(活跃时);当前无直接调用方。
路径
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)重力分离项。
- 对 13×13 子矩阵(排除 O),每对物种
- LU 求逆 α 矩阵(第 291–310 行):
ludcmp_sp+lubksb_sp,得alfinv(l,nn,n) = y(nn,n)/hh(hh = rnew·T/g标高)。- 若 LU 失败(奇异矩阵),全列
pdqdiff = 0并return。
- 若 LU 失败(奇异矩阵),全列
- 三对角系数(第 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(扩散平衡)。
- H:
- 三对角求解(第 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× 差异)的物理依据。
相关页面
- aeronomars/index:
aeronomars目录总览,本文件在其"分子扩散"分类下。 - moldiffcoeff:提供
dij(14,14)二元扩散系数矩阵,由本文件 firstcall 调用。 - moldiffcoeff_red:简化变体扩散系数例程,供
moldiff_red/moldiff_MPF使用。 - tracer_mod:提供
igcm_*索引与mmol摩尔质量。 - conc_mod:提供
rnew/mmean混合气体属性。 - comcstfi_h:提供重力常数
g。 - conduction:热层分子热传导,与分子扩散共同影响热层温度/成分剖面。
- molvis:热层分子黏性速度扩散,与分子扩散并列为热层三大输运过程。