moldiff_MPF.F90
路径
LMDZ.MARS\libf\aeronomars\moldiff_MPF.F90
所属目录/模块
libf\aeronomars
文件定位
moldiff_MPF_mod 是 LMDZ.MARS 的当前默认(moldiff_scheme==2)分子扩散模块,在 Pdiff=15 Pa 以上热层区域求解动态数量(最多 16 种)中性物种的分子扩散。它基于 Modified Pass Flow (MPF) 方法(Parshev et al. 1987,2023 年 6 月 JYC 更新),逐物种独立求解含分子扩散、涡旋扩散和热扩散的隐式一维垂直输运方程,并在顶部用 Jeans 逃逸处理 H/H₂/D 逃逸通量。与 moldiff_red(legacy scheme)的主要区别是:可选柱质量修正器(call_mass_fixer_moldiff_MPF)和 MPF 算法框架。由 thermosphere_mod.F 在 callmoldiff 且 moldiff_scheme==2 时调用。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
moldiff_MPF_mod |
module |
1 |
包装 MPF 分子扩散主例程和 ~22 个内部辅助例程 |
moldiff_MPF |
subroutine |
12–876 |
16 物种 MPF 分子扩散求解器 |
tridagbloc |
subroutine |
885–981 |
块三对角 Thomas 算法求解器(LU 分解) |
tridag |
subroutine |
983–1004 |
标准三对角 Thomas 算法求解器 |
LUBKSB |
subroutine |
1010–1043 |
LU 分解回代(Numerical Recipes) |
LUDCMP |
subroutine |
1049–1129 |
LU 分解 + 部分主元选取(Numerical Recipes,NMAX=100) |
TMNEW |
subroutine |
1131–1149 |
前向推算温度(已定义但主例程内联,未调用) |
QMNEW |
subroutine |
1151–1168 |
前向推算混合比(已定义但主例程内联,未调用) |
HSCALE |
subroutine |
1170–1184 |
对数气压标高 |
MMOY |
subroutine |
1186–1201 |
平均分子质量 |
DMMOY |
subroutine |
1203–1215 |
平均分子质量垂直梯度(3 点差分) |
ZVERT |
subroutine |
1217–1246 |
静力方程积分求高度 |
RHOTOT |
subroutine |
1248–1266 |
总质量密度和分密度 |
UPPER_RESOL |
subroutine |
1268–1357 |
GCM 网格→等间距高度网格重插 |
CORRMASS |
subroutine |
1359–1370 |
质量修正因子 |
DCOEFF |
subroutine |
1373–1400 |
Wilke 多组分扩散系数 |
HSCALEREAL |
subroutine |
1402–1429 |
物种密度标高 |
VELVERT |
subroutine |
1431–1460 |
扩散垂直速度 |
TIMEDIFF |
subroutine |
1462–1474 |
扩散时间尺度 |
DIFFPARAM |
subroutine |
1477–1503 |
无量纲扩散方程系数 |
SEQUENCY |
subroutine |
1506–1524 |
α/β 递推序列 |
Checkmass |
subroutine |
1526–1539 |
质量守恒诊断(高度网格) |
Checkmass2 |
subroutine |
1541–1561 |
质量守恒诊断(气压网格) |
GCMGRID_P |
subroutine |
1563–1662 |
高度网格→GCM 气压网格回插(用于质量估计) |
GCMGRID_P2 |
subroutine |
1664–1778 |
高度网格→GCM 气压网格回插(最终,含 FacMass) |
扩散物种列表(ListeDiffNb=16)
| 本地索引 |
ListeDiff 名 |
物种 |
备注 |
| 1 |
co2 |
CO₂ |
|
| 2 |
o |
O |
|
| 3 |
n2 |
N₂ |
|
| 4 |
ar |
Ar |
|
| 5 |
co |
CO |
|
| 6 |
h2 |
H₂ |
Jeans 逃逸 + 质量修正器补偿 |
| 7 |
h |
H |
Jeans 逃逸 |
| 8 |
d2 |
D₂ |
|
| 9 |
hd |
HD |
热扩散 alphaT=-0.25 |
| 10 |
d |
D |
Jeans 逃逸 |
| 11 |
o2 |
O₂ |
质量修正器补偿 O |
| 12 |
h2o_vap |
H₂O |
|
| 13 |
o3 |
O₃ |
|
| 14 |
n |
N |
质量修正器补偿 |
| 15 |
he |
He |
|
| 16 |
hdo_vap |
HDO |
|
模块级参数
| 参数 |
类型 |
值 |
说明 |
Pdiff |
real*8, parameter |
15. |
扩散计算的气压阈值 (Pa) |
tdiffmin |
real*8, parameter |
5d0 |
最小扩散时间步 (s) |
dzres |
real*8, parameter |
2d0 |
扩散网格分辨率 (km) |
call_mass_fixer_moldiff_MPF |
logical, save |
.false. |
质量修正器开关;由 conf_phys.F 通过 getin_p 读取 |
共享状态(SAVE + OMP THREADPRIVATE)
| 变量 |
类型 |
说明 |
i_h/i_h2/i_d/i_hd |
integer, save |
逃逸物种在扩散列表中的索引(初始化 1000 表示不存在) |
il0 |
integer, save |
扩散起始垂直索引(pplay > Pdiff 之上第一层) |
il1 |
integer, save |
质量修正缩放起始索引(pplay > 1 Pa 之上第一层) |
ncompdiff |
integer, save |
实际扩散物种数 |
gcmind(:) |
integer, allocatable, save |
本地索引→GCM tracer 索引映射 |
masscorrfac(:) |
real*8, allocatable, save |
各物种质量修正因子 |
firstcall |
logical, save |
首次调用标志 |
dij(:,:) |
real, allocatable, save |
二元扩散系数矩阵 |
step |
real, save |
调用计数器 |
use 依赖
| 模块 |
引用符号 |
用途 |
tracer_mod |
noms, mmol |
tracer 名称和摩尔质量 |
geometry_mod |
cell_area |
网格面积(计算逃逸通量 s⁻¹) |
planetwide_mod |
planetwide_sumval |
全行星求和(非 MESOSCALE,逃逸通量汇总) |
mod_phys_lmdz_para |
is_master, bcast |
并行通信(il0/il1 广播) |
moldiffcoeff_red_mod |
moldiffcoeff_red |
二元扩散系数矩阵 dij |
call 调用
| 被调例程 |
所在模块/文件 |
调用位置 |
作用 |
moldiffcoeff_red |
moldiffcoeff_red_mod |
238 |
firstcall 时获取 dij 扩散系数矩阵 |
bcast |
mod_phys_lmdz_para |
232–233 |
广播 il0/il1 |
planetwide_sumval |
planetwide_mod |
868–870 |
逃逸通量全行星求和 |
ludcmp |
本文件 |
tridagbloc 内 |
LU 分解块三对角矩阵 |
lubksb |
本文件 |
tridagbloc 内 |
LU 回代 |
moldiff_MPF 参数表
| 参数 |
方向 |
维度 |
说明 |
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) |
pdqdiff |
out |
(ngrid, nlayer, nq) |
分子扩散 tracer 倾向 (kg/kg/s) |
PhiEscH |
out |
scalar |
H 全行星逃逸通量 (s⁻¹) |
PhiEscH2 |
out |
scalar |
H₂ 全行星逃逸通量 (s⁻¹) |
PhiEscD |
out |
scalar |
D 全行星逃逸通量 (s⁻¹) |
共享状态与副作用
call_mass_fixer_moldiff_MPF 为 module 级 SAVE 变量,由 conf_phys.F(第 1258–1264 行)通过 getin_p("call_mass_fixer_moldiff_MPF", ...) 读取。
firstcall 翻转后 dij、gcmind 和可选 masscorrfac 被 SAVE 缓存,后续调用跳过初始化。
- 所有 SAVE 变量均有
!$OMP THREADPRIVATE 声明,支持 OpenMP 并行。
- 每次 firstcall 打印
'specie X diffused in moldiff_MPF' 和 'number of diffused species: N'。
- 非
MESOSCALE 编译时,调用 planetwide_sumval 对逃逸通量做全行星求和。
MESOSCALE 编译时,打印 "no planetwide in MESOSCALE" 并跳过求和。
Zmax > 4000 km 或 NaN 时 stop。
GCMGRID_P2 中的外推循环设 compteur >= 100000 上限防无限循环。
核心逻辑
firstcall 初始化(第 150–267 行)
- 构造 16 物种
ListeDiff 列表,逐 tracer 按 noms 名匹配,统计实际存在的 ncompdiff 种。
- 记录
i_h/i_h2/i_d/i_hd 在扩散列表中的位置(默认 1000 表示不存在)。
- master 上找
il0(pplay > 15 Pa 之上第一层)和可选 il1(pplay > 1 Pa 之上第一层),再 bcast。
- 调用
moldiffcoeff_red(dij, indic_diff, gcmind, ncompdiff) 获取二元扩散系数矩阵。
- 分配所有 SAVE 工作数组(
qq/qnew/qint/FacMass/rhoK/rhokinit 和可选质量修正数组 Mtot1-3/Mhi1-2)。
逐列求解(第 297–865 行,do ig=1,ngrid)
- 前向推算(第 304–323 行):
tt = pt + pdt·dt(NaN 检查);qq = pq + pdq·dt(max(1d-30) 钳位)。
- 大气结构(第 327–344 行):
HSCALE 气压标高、MMOY 平均分子质量、DMMOY 梯度、ZVERT 静力高度、RHOTOT 密度。
- 质量守恒前测(第 352–369 行,仅
call_mass_fixer):柱积分质量 Mtot1 和 1 Pa 以上质量 Mhi1。
- 安全检查(第 377–384 行):
Zmax > 4000 km 则 stop。
- 高度网格构造(第 390–415 行):
nlraf = (Zmax-Zmin)/dzres + 1(最少 40 层),UPPER_RESOL 将 GCM 气压层插值到等间距高度网格(Rrafk 用幂律插值保持正性)。
- 涡旋扩散(第 422–426 行):Krasnopolsky 2002 方案
K = K0·sqrt(T·T_TOA·kB/P),K0=1.2e11。
- 质量修正因子(第 430–435 行):
GCMGRID_P 回插→CORRMASS 得 FacMass = qq/qint。
- Jeans 逃逸速度(第 487–501 行):对 H/H₂/D,
wi = Uthermal/(2√π)·exp(-Λ)·(Λ+1);热扩散系数 alphaT=-0.25(H/H₂/D/HD)。
- 扩散系数和时间步(第 513–541 行):逐物种
DCOEFF(Wilke 多组分公式)、HSCALEREAL、VELVERT(含热扩散项)、TIMEDIFF。最终 tdiff = ptimestep/5,ntime = ptimestep/tdiff = 5。
- 时间循环(第 552–678 行,
do istep=1,ntime):
- 逐物种非无量纲化:
H0 = kT₀/(m·g),D0 = Draf(TOA),Time0 = H0²/D0。
DIFFPARAM:构造 delta/ksi/eps/zeta/prod/loss 含温度梯度和热扩散。
SEQUENCY:从顶到底递推 alpha/beta。
- 从底到顶正向求解
Xtri(l) 得新密度分布。
- NaN/负值检查(CO₂ 负值
stop)。
- 更新
Rrafk、总密度、混合比、气压。
- 回插到 GCM 网格(第 693–694 行):
GCMGRID_P2 含 FacMass 修正。
- 逃逸通量(第 702–706 行):
Phiaux(ig) = wi·Nrafk(nlraf)·cell_area(ig)。
- 质量修正器(第 724–806 行,仅
call_mass_fixer):
- 柱积分
Mtot2/Mhi2(扩散后)。
- 非 H/N/O 物种:
masscorrfac = (Mtot1 - Mhi2)/(Mtot2 - Mhi2),缩放 il1 以下混合比。
- O 损失 → 补偿 O₂(
masscorrfac1);H → H₂;N → N₂。
- 写倾向(第 816–848 行):
call_mass_fixer:非 CO₂ 物种 pdqdiff = (qnew-qq)/ptimestep,CO₂ 倾向 = -Σ(其他)。
- 传统:所有物种直接
pdqdiff = (qnew-qq)/ptimestep。
全行星逃逸通量汇总(第 867–873 行)
非 MESOSCALE:planetwide_sumval(PhiauxH, PhiEscH) 等。MESOSCALE 跳过。
伪代码
moldiff_MPF(ngrid, nlayer, nq, ..., pdqdiff, PhiEscH, PhiEscH2, PhiEscD):
if firstcall:
build ListeDiff(16), match present species → ncompdiff
find i_h, i_h2, i_d, i_hd
find il0 (P > 15 Pa boundary), il1 (P > 1 Pa boundary)
moldiffcoeff_red(dij)
allocate SAVE arrays
firstcall = .false.
PhiEscH = PhiEscH2 = PhiEscD = 0
for ig = 1, ngrid:
tt = pt + pdt * dt # forward temperature
qq = pq + pdq * dt # forward mixing ratios, clip ≥ 1e-30
HSCALE, MMOY, DMMOY, ZVERT, RHOTOT # atmospheric structure
if mass_fixer: Mtot1, Mhi1 # pre-diffusion column mass
nlraf = max(40, (Zmax-Zmin)/dzres+1) # refined altitude grid
UPPER_RESOL → Praf/Traf/Qraf/Zraf/... # interpolate to equal-dz grid
Kraf = K0 * sqrt(T*T_TOA*kB/P) # eddy diffusion (Krasnopolsky 2002)
GCMGRID_P + CORRMASS → FacMass # mass correction factors
for nn = 1, ncompdiff:
DCOEFF (Wilke), HSCALEREAL, VELVERT, TIMEDIFF
tdiff = ptimestep / 5; ntime = 5
for istep = 1, ntime:
for nn = 1, ncompdiff:
non-dimensionalize (H0, D0, Time0)
DIFFPARAM → delta/ksi/eps/zeta/prod/loss
SEQUENCY → alpha/beta (top-down recurrence)
Xtri = forward solve (bottom-up) # new density profile
update Rrafk(l,nn) = rho0 * Xtri(l)
update Rraf, Qraf, Mraf, Praf
GCMGRID_P2 → qnew (back to GCM pressure grid, with FacMass)
PhiauxH/H2/D(ig) = wi * Nrafk(nlraf) * cell_area(ig)
if mass_fixer:
Mtot2, Mhi2 # post-diffusion column mass
scale qnew(1:il1) for non-H/N/O species # column mass conservation
compensate O2/H2/N2 below 1 Pa for O/H/N losses
pdqdiff(non-CO2) = (qnew-qq)/dt
pdqdiff(CO2) = -sum(other tendencies) # ensure total = 0
else:
pdqdiff = (qnew-qq)/dt for all species
if not MESOSCALE:
planetwide_sumval(PhiauxH/H2/D → PhiEscH/H2/D)
参与的主题流程
| 主题 |
参与方式 |
| 热层分子扩散(MPF 方案) |
thermosphere_mod 在 callmoldiff 且 moldiff_scheme==2(默认)时调用,输出 zdqmoldiff 倾向和 H/H₂/D 逃逸通量 |
| 高层大气逃逸 |
Jeans 逃逸公式计算 H/H₂/D 的 TOA 逃逸通量,非 MESOSCALE 时全行星求和 |
| 质量守恒修正 |
可选 call_mass_fixer_moldiff_MPF 对扩散后的柱质量做缩放修正,用 CO₂ 补偿总倾向 |
写法特点
- 自由格式 F90(
& 续行),但部分内部辅助例程使用固定格式风格。
- 大量 SAVE + OMP THREADPRIVATE 工作数组,避免每次调用重新分配。
- 扩散物种数动态(按
noms 名匹配),而非像 moldiff.F 那样固定 14 种。
- 使用
moldiffcoeff_red(简化变体)而非 moldiffcoeff(原版),gcmind 由本文件构造后传入。
tdiff = ptimestep/5 硬编码(第 541 行),前面计算的物理扩散时间 Tdiff 被覆盖。注释保留多种 K0 备选值(6e10 到 1.2e12)。
- 涡旋扩散
K0=1.2e11(第 282 行),注释中保留 Krasnopolsky 2002 原始值和其他测试值。
TMNEW 和 QMNEW 定义但未调用——主例程内联了等价逻辑。
tridagbloc 和 tridag 定义但主例程未调用——MPF 方案使用 SEQUENCY 递推 + 显式前向求解替代了三对角直接求解。
GCMGRID_P 和 GCMGRID_P2 功能相似,但 P2 版本额外应用 FacMass 并在 call_mass_fixer 路径中按 sum(qq(il,:)) 归一化。
- 外推区使用气压标高指数衰减逐层推进(
do while (pnew2 >= pp(il))),设 100000 次上限防无限循环。
复现要点
conf_phys.F 读取 call_mass_fixer_moldiff_MPF(默认 .false.)。设为 .true. 启用质量修正器。
thermosphere_mod.F 通过 moldiff_scheme(默认 2)选择本文件。callmoldiff 须为 .true.(由 deftank 配置设定)。
- 需要
tracer_mod 中存在 ListeDiff 中的物种名(如 'co2','h2','h','d','hd' 等)才能正确设置 i_h/i_h2/i_d/i_hd。缺失不影响扩散计算,仅跳过逃逸通量。
moldiffcoeff_red 要求 noms 中存在 'h2'/'h'/'o'(由 moldiffcoeff_red 内部查找);缺失会导致 mmol 越界。
cell_area 来自 geometry_mod,用于逃逸通量面积加权。
- 非
MESOSCALE 编译时依赖 planetwide_mod::planetwide_sumval。
调用关系
| 调用方 |
位置 |
说明 |
thermosphere_mod.F |
第 114 行 |
moldiff_scheme==2(默认)时调用 moldiff_MPF |
conf_phys.F |
第 53/1258 行 |
仅读取 call_mass_fixer_moldiff_MPF 标志,不调用主例程 |
deftank 配置
| deftank 配置 |
callmoldiff |
moldiff_scheme |
| MCD5 |
.true. |
未设(默认 2 → MPF,即本文件) |
| MCD6 |
.true. |
1(legacy moldiff_red) |
| GCM5/GCM6 |
.false. |
— |
与 moldiff.F/moldiff_red 的区别
| 特征 |
moldiff.F(legacy) |
moldiff_red.F90 |
moldiff_MPF.F90(本文件) |
| 物种数 |
固定 14 |
动态 ncompdiff |
动态 ncompdiff(最多 16) |
| 扩散系数 |
moldiffcoeff(固定 14) |
moldiffcoeff_red |
moldiffcoeff_red |
| 算法 |
Dickinson & Ridley 1972 α 矩阵 + LU 求逆 |
二元 dij 简化公式逐物种隐式三对角求解 |
MPF (Parshev et al. 1987):逐物种独立 SEQUENCY 递推 |
| H/H₂ 逃逸 |
Jeans (Hunten 1973) |
含 D 逃逸 |
含 D + HD 热扩散 alphaT |
| 质量守恒 |
O 反算 |
O 反算 |
可选柱质量修正器 + CO₂ 补偿 |
| 涡旋扩散 |
无 |
待确认 |
Krasnopolsky 2002 K0=1.2e11 |
| 时间步 |
单次求解 |
待确认 |
ptimestep/5,5 子步 |
| 活跃状态 |
死代码 |
moldiff_scheme==1 |
moldiff_scheme==2(默认) |
待确认
tdiff = ptimestep/5 硬编码(第 541 行)覆盖了前面计算的物理扩散时间 Tdiff,是否有物理依据或仅为数值稳定性。
K0=1.2e11 值相对 Krasnopolsky 2002 原文的适用范围——注释中列出 6e10 到 1.2e12 多个备选值,最终选择依据。
tridagbloc(块三对角求解器)和 tridag(标准三对角求解器)已定义但主例程未调用——是否为 MPF 重构前的遗留代码。
TMNEW/QMNEW 已定义但未调用——同上,主例程内联了等价逻辑。
GCMGRID_P2 中 call_mass_fixer 分支用 sum(qq(il,:)) 归一化(第 1720 行),与传统分支的 rhoknew/rhonew 不同——其物理含义是否为补偿非扩散 tracer 的质量份额。
相关页面