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 全球逃逸通量 |
共享状态与副作用
- 读
tracer_mod::noms/mmol:firstcall 物种匹配和持续分子量计算。 - 读
geometry_mod::cell_area:逃逸通量面积加权。 - 写
planetwide_sumval全局和:输出PhiEscH/H2/D。 - SAVE/THREADPRIVATE 缓存数组在 firstcall 分配后持续存在。
- 无数值文件 I/O。
核心逻辑
firstcall:匹配 16 种 ListeDiff 中存在于
noms的物种,记ncompdiff、gcmind、i_h/i_h2/i_d;找il0(pplay>Pdiff的最高层+1)并广播;调moldiffcoeff_red得dij;分配所有缓存数组。逐列循环(
ig=1,ngrid):- 温度前向推进:
tt=pt+pdt*ptimestep(内联,不调TMNEW)。 - 混合比前向推进:
qq=pq+pdq*ptimestep,下限1d-30(内联,不调QMNEW)。 - 大气结构:
HSCALE压力标高 →MMOY平均分子量 →DMMOY梯度 →ZVERT高度 →RHOTOT密度。 - 记录扩散层以上的初始柱质量
Mtot1。 - 安全检查:
Zmax>4000 km则stop。 - 精细网格:
nlraf=max((Zmax-Zmin)/dzres+1, 40),调UPPER_RESOL插值到均匀dz网格。 GCMGRID_P回插检查质量,CORRMASS计算FacMass=qq/qint。- 记录精细网格初始质量
Mraf1。 qnew=qq(il0以下无扩散效果)。
- 温度前向推进:
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)。
逐物种扩散参数:
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)。
时间分裂:
ntime=round(ptimestep/tdiff)。- 逐物种、逐时间步:
- 无量纲化:
H0=kB·T0/m/g,D0=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 回退到初始值)。
- 无量纲化:
- 逐物种、逐时间步:
更新总密度和混合比:
Rraf=ΣRrafk,Qraf/Rraf/Nrafk/Mraf/Nraf/Praf依次更新。质量诊断:记录
Mraf2(扩散后精细网格柱质量)。回插 GCM 网格:
GCMGRID_P2用FacMass修正,顶层以上用标高外推。RHOTOT更新密度。逃逸通量:
PhiauxH/H2/D(ig)=wi·Nrafk(nlraf)·cell_area(ig),ig 循环后调planetwide_sumval全球求和。扩散 tendency:
pdqdiff(ig,l,gcmind(nn))=(qnew(l,nn)-qq(l,nn))/ptimestep。释放精细网格数组(每列释放,每列重新分配)。
伪代码
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 逃逸通量,输出行星积分通量 |
写法特点
- JulY 2014 JYC 注释:标题注释提到 "ADD BALISTIC Transport coupling to compute wup for H and H2",但实际源码中 Jeans 逃逸公式是标准形式,未见弹道输运的显式耦合。
TMNEW/QMNEW遗留:这两个子例程定义在模块内但主例程用内联代码替代,保留了源码注释中的CALL TMNEW/QMNEW行。tridagbloc遗留:块三对角求解器保留在模块中但未被主例程调用(pre-refactor 残留)。DCOEFF简化:用(1-Nk/N)/interm而非 Wilke 完整多组分公式(MPF 版用 Wilke),注释中有 "Temporary: eliminate modification to include Wilke's formulation"。- 无涡流扩散:与 MPF 版不同,本模块不包含 Krasnopolsky 涡流扩散廓线。
- 无热扩散:Jeans 逃逸不含 αT=−0.25 热扩散修正(MPF 版有)。
- 无质量守恒修正器:MPF 版有可选
call_mass_fixer_moldiff_MPF,本模块无对应功能。 - 硬编码常数:
g=3.72d0、Rmars=3390000d0、Mmars=6.4d23、pi=3.141592653、ij0=6000(测试列号)均在子例程内部重复定义。 MESOSCALE条件编译:planetwide_mod的 use 和planetwide_sumval调用在#ifndef MESOSCALE下,mesoscale 模式打印警告。step变量:firstcall 中设为 1 后未被使用。
与 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(非默认分支) |
复现要点
moldiff_scheme在thermosphere_mod.F中默认为 2(选 MPF),需设为 1 才能执行本模块。- 依赖
moldiffcoeff_red提供dij,需确保 tracer 列表中包含 ListeDiff 中的物种。 - 需要 MCD5/MCD6 配置开启
callmoldiff(conf_phys.F)。 Pdiff=15 Pa决定了扩散起始高度,典型火星条件下约 65–80 km。- 逃逸通量输出依赖
planetwide_sumval,mesoscale 模式下不可用。
待确认
- 标题注释提到 "BALISTIC Transport coupling" 但实际 Jeans 逃逸公式是标准形式,未见弹道输运的显式实现,可能指
Uthermal/Lambdaexo的推导方式。 DCOEFF注释 "Temporary: eliminate modification to include Wilke's formulation" 暗示曾经尝试加入 Wilke 公式后又回退,具体原因未说明。step变量 firstcall 设 1 后未使用,可能为遗留。ij0=6000硬编码测试列号,实际 ngrid 可能远小于此值,诊断输出永远不会触发。Checkmass/Checkmass2被注释掉,质量守恒诊断当前不活跃。
相关页面
- moldiff:原版 legacy 14 物种分子扩散模块(死代码)。
- moldiff_MPF:MPF 增强版,默认
moldiff_scheme==2。 - moldiffcoeff_red:简化扩散系数矩阵,由本模块 firstcall 调用。
- moldiffcoeff:原版扩散系数矩阵,供 legacy
moldiff使用。 - aeronomars/index:
aeronomars目录总览,本文件在其"分子扩散"分类下。 - tracer_mod:提供
noms/mmol/nqmx。