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_modmoldiff.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 行)

  1. 调用 moldiffcoeff(dij) 获取 14×14 二元扩散系数矩阵。
  2. 逐一检查 14 个必需 tracer 的 igcm_* 索引;任一为 0 即 stop
  3. 建立 gcmind(1:14) 映射(本地物种索引 → GCM tracer 索引)。

逐列求解(第 222–459 行,do ig=1,ngrid

  1. 前向推算温度和混合比(第 224–249 行):tt = pt + pdt·dt + pdteuv·dt + pdtconduc·dtqq = pq + pdq·dt,钳位 ≥ 1e-30
  2. 标高和平均分子量梯度(第 233–255 行):hp = -log(p(l+1)/p(l-1))dmmeandz = (mmean(l+1)-mmean(l-1))/hp,边界层用 3 点差分。
  3. 构造 α 矩阵(第 259–286 行,Dickinson & Ridley 1972):
    • 对 13×13 子矩阵(排除 O),每对物种 (nn, n)dij(nn,n)·ptfacptfac = (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) 重力分离项。
  4. LU 求逆 α 矩阵(第 291–310 行):ludcmp_sp + lubksb_sp,得 alfinv(l,nn,n) = y(nn,n)/hhhh = rnew·T/g 标高)。
    • 若 LU 失败(奇异矩阵),全列 pdqdiff = 0return
  5. 三对角系数(第 316–334 行):
    • del1 = hp·p/(g·dt)del2 = (hp/2)²·p/(g·dt)
    • aa/bb/cc 分别为下/主/上对角线系数,包含 alfinv 垂直梯度和 b 项。
  6. 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 · wiabfac(H/H₂) = 0(逃逸边界),其余物种 abfac = 1(扩散平衡)。
  7. 三对角求解(第 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)
  8. 写倾向(第 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) == 0stop

LUBKSB_SP(第 498–531 行)

Numerical Recipes 风格 LU 回代。输入 A(NP,NP)INDX 置换向量,原地修改 B

LUDCMP_SP(第 537–616 行)

Numerical Recipes 风格 LU 分解 + 部分主元选取。奇异矩阵(行最大元素为 0)时设 ierr=1return(不再 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 中未被 usemoldiff 未被 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 行)选择。callmoldiffconf_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(默认)

待确认

  1. moldiff.F 是否在某个未编译的测试路径中仍被引用(当前 libf 全目录 grep 无 use moldiff_modcall moldiff)。
  2. moldiff_red 的具体算法差异——两者均标注 legacy,但 moldiff.F 的 α 矩阵维数固定为 13×13(排除 O),而 moldiff_red 使用动态维度。
  3. 第 370–376 行注释块 "TEMPORAIRE: no escape for h and h2" 是否曾被启用(当前被注释,逃逸生效)。
  4. dij(h,o) = 0.000114moldiffcoeff.F 第 195 行的覆盖旧值 0.0000144(~10× 差异)的物理依据。

相关页面