moldiff_red.F90

路径

LMDZ.MARS\libf\aeronomars\moldiff_red.F90

所属目录/模块

libf/aeronomars

文件定位

简化版("red")多组分分子扩散求解器,是 moldiff.F(legacy,死代码)的现代化精简版本。moldiff_red_mod 对 16 种扩散物种逐物种独立做隐式三对角扩散求解,含 Jeans H/H₂/D 逃逸和行星球积分通量输出。与 moldiff_MPF.F90 共享同一 thermosphere_mod 调用入口,通过 moldiff_scheme 开关切换(moldiff_scheme==1 选本模块,==2 选 MPF,默认 2)。July 2014 JYC 加入弹道输运耦合以计算 H/H₂ 的上边界逃逸速度。

定义的符号

符号 类型 行号 作用
moldiff_red_mod module 1 简化分子扩散模块,包装 moldiff_red 主例程和 ~20 个辅助例程
moldiff_red subroutine 9 主扩散求解器:11 个 intent(in) 参数 + 3 个逃逸通量输出
tridagbloc subroutine 694 块三对角求解器(Thomas 算法 + LU);定义但当前未被活跃调用
tridag subroutine 792 Thomas 算法三对角求解器;由主例程逐物种调用
LUBKSB subroutine 819 LU 回代;由 tridagbloc 调用
LUDCMP subroutine 858 LU 分解 + 部分主元选取;奇异矩阵时 ierr=1 返回
TMNEW subroutine 940 温度前向推进(含三个 tendency 项);当前被内联代码取代,无活跃调用
QMNEW subroutine 960 混合比前向推进;当前被内联代码取代,无活跃调用
HSCALE subroutine 979 对数压力标高 hp=-log(P(l+1)/P(l-1))
MMOY subroutine 995 平均分子量 massemoy=1/Σ(q/mmol)
DMMOY subroutine 1012 平均分子量垂直梯度(中心差分,端点单侧)
ZVERT subroutine 1026 逐层高度积分 Z(l)=Z(l-1)-H·log(P(l)/P(l-1))
RHOTOT subroutine 1057 总质量密度和逐物种分密度 rhoK=qq·rhoN
UPPER_RESOL subroutine 1077 GCM 网格到均匀 dz 精细网格的重插值(幂平均)
CORRMASS subroutine 1168 质量修正因子 FacMass=qq/qint
DCOEFF subroutine 1182 逐物种有效扩散系数(二元 dij 加权),(1-Nk/N)/interm
HSCALEREAL subroutine 1211 逐物种密度标高 H=-1/(dlnNk/dz)
VELVERT subroutine 1240 逐物种扩散垂直速度 W=-D·(1/H-1/Hmol-dT/T)
TIMEDIFF subroutine 1271 逐物种扩散时间尺度 `TIME=
DIFFPARAM subroutine 1286 无量纲化差分系数 alpha/beta/gama/delta/eps
MATCOEFF subroutine 1350 构造三对角矩阵系数 A/B/C/D(Dirichlet 底边界,扩散廓线顶边界含 FacEsc
Checkmass subroutine 1385 精细网格质量守恒诊断(>0.1% 打印警告)
Checkmass2 subroutine 1400 GCM 网格质量守恒诊断(>1% 打印警告)
GCMGRID_P subroutine 1422 精细网格到 GCM 网格回插(无 FacMass,用于质量修正计算)
GCMGRID_P2 subroutine 1523 精细网格到 GCM 网格回插(含 FacMass 修正),顶层以上用标高外推

模块参数

参数 行号 作用
Pdiff 15. Pa 3 低于此压力才计算扩散的阈值
tdiffmin 5d0 4 最小扩散时间步(秒)下限因子
dzres 2d0 km 5 精细网格垂直分辨率

SAVE / THREADPRIVATE 状态

变量 说明
qq, qnew, qint, FacMass 混合比和修正因子缓存 (nlayer,ncompdiff)
rhoK, rhokinit 物种分密度缓存 (nlayer,ncompdiff)
wi, Wad, Uthermal, Lambdaexo, Hspecie 逃逸和热速度 (ncompdiff)
Mtot1, Mtot2, Mraf1, Mraf2 质量守恒诊断 (ncompdiff)
i_h, i_h2, i_d H/H₂/D 在 ListeDiff 中的编号
il0 扩散起始垂直索引
ncompdiff, gcmind, firstcall, dij, step 物种计数、GCM 索引、初始化标志、扩散系数矩阵

全部标记 !$OMP THREADPRIVATE

16 种扩散物种(ListeDiff)

co2, o, n2, ar, co, h2, h, d2, hd, d, o2, h2o_vap, o3, n, he, hdo_vap

moldiff_MPF 的 ListeDiff 完全相同。

依赖的模块

use 模块 only 列表 用途 待确认
tracer_mod noms, mmol, nqmx tracer 名匹配和分子量
geometry_mod cell_area 逃逸通量乘以网格面积
planetwide_mod planetwide_sumval 行星球积分逃逸通量(!MESOSCALE 条件编译)
mod_phys_lmdz_para is_master, bcast il0 在 master 上计算后广播
moldiffcoeff_red_mod moldiffcoeff_red firstcall 获取 dij(ncompdiff,ncompdiff)

调用的关键例程

被调用例程 所在模块/文件 调用位置 作用
moldiffcoeff_red moldiffcoeff_red_mod firstcall 计算二元扩散系数矩阵 dij
planetwide_sumval planetwide_mod ig 循环后 对 PhiauxH/H2/D 做行星球积分得全局逃逸通量
bcast mod_phys_lmdz_para firstcall 广播 il0

输入

输入 来源 类型/维度 单位 含义
ngrid 调用方 integer 大气列数
nlayer 调用方 integer 垂直层数
nq 调用方 integer advected tracer 数
pplay 调用方 real(ngrid,nlayer) Pa 层中气压
pplev 调用方 real(ngrid,nlayer+1) Pa 层界气压
pt 调用方 real(ngrid,nlayer) K 温度
pdt 调用方 real(ngrid,nlayer) K/s 温度 tendency
pq 调用方 real(ngrid,nlayer,nq) kg/kg 质量混合比
pdq 调用方 real(ngrid,nlayer,nq) kg/kg/s tracer tendency
ptimestep 调用方 real s 物理时间步

输出

输出 去向 类型/维度 单位 含义
pdqdiff 调用方 real(ngrid,nlayer,nq) kg/kg/s 扩散导致的 tracer tendency
PhiEscH 调用方 real*8 s⁻¹ H 全球逃逸通量
PhiEscH2 调用方 real*8 s⁻¹ H₂ 全球逃逸通量
PhiEscD 调用方 real*8 s⁻¹ D 全球逃逸通量

共享状态与副作用

核心逻辑

  1. firstcall:匹配 16 种 ListeDiff 中存在于 noms 的物种,记 ncompdiffgcmindi_h/i_h2/i_d;找 il0pplay>Pdiff 的最高层+1)并广播;调 moldiffcoeff_reddij;分配所有缓存数组。

  2. 逐列循环ig=1,ngrid):

    • 温度前向推进:tt=pt+pdt*ptimestep(内联,不调 TMNEW)。
    • 混合比前向推进:qq=pq+pdq*ptimestep,下限 1d-30(内联,不调 QMNEW)。
    • 大气结构:HSCALE 压力标高 → MMOY 平均分子量 → DMMOY 梯度 → ZVERT 高度 → RHOTOT 密度。
    • 记录扩散层以上的初始柱质量 Mtot1
    • 安全检查:Zmax>4000 kmstop
    • 精细网格:nlraf=max((Zmax-Zmin)/dzres+1, 40),调 UPPER_RESOL 插值到均匀 dz 网格。
    • GCMGRID_P 回插检查质量,CORRMASS 计算 FacMass=qq/qint
    • 记录精细网格初始质量 Mraf1
    • qnew=qqil0 以下无扩散效果)。
  3. Jeans 逃逸速度

    • Uthermal=sqrt(2·kB·T_top/m)Lambdaexo=m·G·M_mars/(R_mars+Z_top)/kB/T_top
    • 对 H/H₂/D:wi=Uthermal/2/sqrt(pi)*exp(-Lambda)*(Lambda+1)
    • 其他物种:wi=0
    • 注意:无热扩散 αT 修正(MPF 版加了 αT=−0.25)。
  4. 逐物种扩散参数

    • DCOEFF:有效扩散系数 D=(1-Nk/N)/Σ(xj/Dij),用 dij 二元系数和 (P0/P)·(T/T0)^1.75 缩放。
    • HSCALEREAL:密度标高 H=-1/(dlnNk/dz)
    • VELVERT:扩散速度 W=-D·(1/H-1/Hmol-dT/T)
    • TIMEDIFF:扩散时间 |H/W|
    • 取全局 Tdiff=min(Tdiffrafmol),下限 tdiffmin·Mraf(nlraf)
  5. 时间分裂ntime=round(ptimestep/tdiff)

    • 逐物种、逐时间步:
      • 无量纲化:H0=kB·T0/m/gD0=Draf(nlraf)Time0=H0²/D0
      • DIFFPARAM:差分系数 alpha/beta/gama/delta/eps
      • MATCOEFF:三对角矩阵 A/B/C/D。底边界 Dirichlet,顶边界扩散廓线含 FacEsc=exp(-w·dz/D)
      • tridag:Thomas 算法求解 → Xtri → 更新 Rrafk(l,nn)=rho0·Xtri(l)
      • NaN/负值检查:若 Rrafk 异常则 stop(对 nn=16 回退到初始值)。
  6. 更新总密度和混合比Rraf=ΣRrafkQraf/Rraf/Nrafk/Mraf/Nraf/Praf 依次更新。

  7. 质量诊断:记录 Mraf2(扩散后精细网格柱质量)。

  8. 回插 GCM 网格GCMGRID_P2FacMass 修正,顶层以上用标高外推。RHOTOT 更新密度。

  9. 逃逸通量PhiauxH/H2/D(ig)=wi·Nrafk(nlraf)·cell_area(ig),ig 循环后调 planetwide_sumval 全球求和。

  10. 扩散 tendencypdqdiff(ig,l,gcmind(nn))=(qnew(l,nn)-qq(l,nn))/ptimestep

  11. 释放精细网格数组(每列释放,每列重新分配)。

伪代码

if firstcall:
  match 16 species against tracer noms → ncompdiff, gcmind, i_h/i_h2/i_d
  find il0: highest layer where pplay > Pdiff, +1, broadcast
  call moldiffcoeff_red → dij(ncompdiff,ncompdiff)
  allocate all SAVE arrays
  firstcall = .false.

for each column ig:
  tt = pt + pdt * ptimestep  (inline)
  qq = pq + pdq * ptimestep  (inline, floor 1d-30)

  atmospheric structure: HSCALE → MMOY → DMMOY → ZVERT → RHOTOT
  record Mtot1 (column mass above il0)
  stop if Zmax > 4000 km

  nlraf = max((Zmax-Zmin)/dzres + 1, 40)
  allocate fine-grid arrays
  UPPER_RESOL: interpolate to uniform dz grid
  GCMGRID_P: back-interpolate for mass check
  CORRMASS: FacMass = qq / qint
  record Mraf1 (fine-grid mass)

  qnew = qq  (no diffusion below il0)

  Jeans escape: Uthermal, Lambdaexo → wi for H/H2/D (no alphaT correction)

  for each species nn:
    DCOEFF → Draf
    HSCALEREAL → Hraf
    VELVERT → Wraf
    TIMEDIFF → Tdiffraf
  Tdiff = min(Tdiffrafmol), floor tdiffmin * Mraf(nlraf)
  ntime = round(ptimestep / Tdiff)

  for istep = 1 to ntime:
    for each species nn:
      non-dimensionalize: H0, D0, Time0
      DIFFPARAM → alpha/beta/gama/delta/eps
      MATCOEFF → A/B/C/D  (Dirichlet bottom, diffusion-profile top with FacEsc)
      tridag → Xtri
      Rrafk = rho0 * Xtri  (NaN/negative check)
    update total: Rraf, Qraf, Nrafk, Mraf, Nraf, Praf

  record Mraf2 (post-diffusion mass)
  GCMGRID_P2: back-interpolate to GCM grid with FacMass
  RHOTOT: update densities

  PhiauxH/H2/D(ig) = wi * Nrafk_top * cell_area(ig)

  pdqdiff = (qnew - qq) / ptimestep

  deallocate fine-grid arrays

planetwide_sumval(PhiauxH → PhiEscH)
planetwide_sumval(PhiauxH2 → PhiEscH2)
planetwide_sumval(PhiauxD → PhiEscD)

参与的主题流程

主题 参与方式
热层化学 moldiff_scheme==1 时的分子扩散求解器,为热层物种分离提供 tendency
氢逃逸 计算 H/H₂/D 的 Jeans 逃逸通量,输出行星积分通量

写法特点

与 moldiff.F / moldiff_MPF.F90 对比

特性 moldiff.F (legacy) moldiff_red.F90 moldiff_MPF.F90
物种数 14 16 16
扩散系数 Dickinson & Ridley 1972 α 矩阵 二元 dij + (1-x)/interm 简化 Wilke 多组分完整公式
数值求解 LU 求逆 + 隐式三对角 逐物种 tridag 逐物种隐式 + 五步时间分裂
涡流扩散 Krasnopolsky 2002
热扩散 αT H/H₂/D: αT=−0.25
质量守恒修正 O 质量守恒方程 可选质量守恒修正器
Jeans 逃逸 H/H₂ H/H₂/D H/H₂/D + αT
调用条件 死代码,无调用方 moldiff_scheme==1 moldiff_scheme==2(默认)
精细网格 均匀 dz ≥ 40 层 均匀 dz ≥ 40 层

调用方

调用方 文件 行号 条件
thermosphere_mod libf/aeronomars/thermosphere_mod.F 109 moldiff_scheme==1(非默认分支)

复现要点

待确认

相关页面