thermosphere_mod.F
路径
LMDZ.MARS\libf\aeronomars\thermosphere_mod.F
所属目录/模块
libf/aeronomars
文件定位
热层物理过程总调度模块;在 physiq_mod 的 callthermos 分支下逐列调用,依次执行 EUV 加热、分子热传导、分子黏性扩散和分子扩散,把各子过程 tendency 累加回 pdt/pdu/pdv/pdq,并输出 H/H₂/D 逃逸通量。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
thermosphere_mod |
module | 1 | 包装 thermosphere 子例程,保存 moldiff_scheme |
moldiff_scheme |
integer, save |
5 | 分子扩散方案选择(1=legacy moldiff_red,2=MPF moldiff_MPF),默认 2 |
thermosphere |
subroutine | 10 | 热层物理过程主调度;按开关依次调 EUV、传导、黏性、扩散并累加 tendency |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
ioipsl_getin_p_mod |
getin_p |
firstcall 读取 moldiff_scheme 配置 |
无 |
moldiff_red_mod |
moldiff_red |
legacy 分子扩散(moldiff_scheme==1) |
无 |
moldiff_MPF_mod |
moldiff_MPF |
MPF 分子扩散(moldiff_scheme==2,默认) |
无 |
euvheat_mod |
euvheat |
EUV 加热 | 无 |
conduction_mod |
conduction |
分子热传导 | 无 |
molvis_mod |
molvis |
分子黏性速度扩散 | 无 |
conc_mod |
rnew, cpnew |
各层气体常数和比热(传递给子过程) | 无 |
comcstfi_h |
r, cpp |
通用气体常数和比热常量 | 无 |
mod_phys_lmdz_para |
is_master |
firstcall 日志输出 | 无 |
callkeys_mod |
calleuv, callconduct, callmoldiff, callmolvis |
四个子过程开关 | 无 |
调用的关键例程
| 被调用例程 | 所在模块/文件 | 调用位置 | 作用 |
|---|---|---|---|
getin_p |
ioipsl_getin_p_mod |
行 68 | firstcall 读 moldiff_scheme 配置 |
euvheat |
euvheat_mod |
行 83 | calleuv 下计算 EUV 加热倾向 zdteuv |
conduction |
conduction_mod |
行 90 | callconduct 下计算分子热传导倾向 zdtconduc |
molvis |
molvis_mod |
行 97, 99 | callmolvis 下分别对 pu/pv 计算分子黏性倾向 zdumolvis/zdvmolvis |
moldiff_red |
moldiff_red_mod |
行 109 | callmoldiff 且 moldiff_scheme==1 时调用 |
moldiff_MPF |
moldiff_MPF_mod |
行 114 | callmoldiff 且 moldiff_scheme==2(默认)时调用 |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
ngrid |
physiq_mod |
integer |
— | 水平格点数 |
nlayer |
physiq_mod |
integer |
— | 垂直层数 |
nq |
physiq_mod |
integer |
— | advected tracer 数 |
pplev |
physiq_mod |
real (ngrid,nlayer+1) |
Pa | 层界面气压 |
pplay |
physiq_mod |
real (ngrid,nlayer) |
Pa | 中层气压 |
dist_sol |
physiq_mod |
real |
AU | 日火距离 |
mu0 |
physiq_mod |
real (ngrid) |
— | 太阳天顶角余弦 |
ptimestep |
physiq_mod |
real |
s | 物理时间步 |
zday |
physiq_mod |
real |
sol | 自 Ls=0 起的日期 |
tsurf |
physiq_mod |
real (ngrid) |
K | 地表温度 |
zzlev |
physiq_mod |
real (ngrid,nlayer+1) |
m | 层界面高度 |
zzlay |
physiq_mod |
real (ngrid,nlayer) |
m | 中层高度 |
pt |
physiq_mod |
real (ngrid,nlayer) |
K | 当前温度 |
pq |
physiq_mod |
real (ngrid,nlayer,nq) |
kg/kg | tracer 混合比 |
pu |
physiq_mod |
real (ngrid,nlayer) |
m/s | 纬向风 |
pv |
physiq_mod |
real (ngrid,nlayer) |
m/s | 经向风 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
zdteuv |
physiq_mod |
real (ngrid,nlayer) |
K/s | EUV 加热温度倾向 |
zdtconduc |
physiq_mod |
real (ngrid,nlayer) |
K/s | 分子热传导温度倾向 |
zdumolvis |
physiq_mod |
real (ngrid,nlayer) |
m/s² | 纬向风分子黏性倾向 |
zdvmolvis |
physiq_mod |
real (ngrid,nlayer) |
m/s² | 经向风分子黏性倾向 |
zdqmoldiff |
physiq_mod |
real (ngrid,nlayer,nq) |
kg/kg/s | 分子扩散 tracer 倾向 |
PhiEscH |
physiq_mod |
real*8 |
s⁻¹ | H 总逃逸通量 |
PhiEscH2 |
physiq_mod |
real*8 |
s⁻¹ | H₂ 总逃逸通量 |
PhiEscD |
physiq_mod |
real*8 |
s⁻¹ | D 总逃逸通量 |
输入输出(inout)
| 变量 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|
pdt |
real (ngrid,nlayer) |
K/s | 温度倾向;子过程倾向依次累加 |
pdq |
real (ngrid,nlayer,nq) |
kg/kg/s | tracer 倾向;callmoldiff 后累加 |
pdu |
real (ngrid,nlayer) |
m/s² | 纬向风倾向;callmolvis 后累加 |
pdv |
real (ngrid,nlayer) |
m/s² | 经向风倾向;callmolvis 后累加 |
共享状态与副作用
moldiff_scheme(integer, save):firstcall 由getin_p读取,默认 2(MPF),标记THREADPRIVATE。firstcall(logical, save):初始化标志,标记THREADPRIVATE。- 倾向累加顺序(影响后续子过程的预测温度/密度):EUV → 热传导 → 分子黏性 → 分子扩散。
核心逻辑
firstcall 初始化(行 65-73):
moldiff_scheme默认 2,通过getin_p("moldiff_scheme",...)可覆盖;master 进程打印。清零所有 tendency 缓存(行 76-80):
zdteuv/zdtconduc/zdumolvis/zdvmolvis/zdqmoldiff全部置零,保证未开启的子过程不贡献 tendency。EUV 加热(
calleuv,行 82-87):调euvheat得zdteuv,累加到pdt。分子热传导(
callconduct,行 89-94):调conduction得zdtconduc,累加到pdt。此时pdt已含 EUV,故传导看到的预测温度包含 EUV 加热。分子黏性(
callmolvis,行 96-104):分别对pu/pv调molvis,得zdumolvis/zdvmolvis,累加到pdu/pdv。分子扩散(
callmoldiff,行 106-122):按moldiff_scheme选择moldiff_red(1)或moldiff_MPF(2),得zdqmoldiff和逃逸通量PhiEscH/H2/D,累加到pdq。
伪代码
if firstcall:
moldiff_scheme = 2
moldiff_scheme = getin_p("moldiff_scheme")
firstcall = false
zdteuv = zdtconduc = zdumolvis = zdvmolvis = zdqmoldiff = 0
if calleuv:
euvheat(...) -> zdteuv
pdt += zdteuv
if callconduct:
conduction(...) -> zdtconduc
pdt += zdtconduc
if callmolvis:
molvis(..., pu) -> zdumolvis
molvis(..., pv) -> zdvmolvis
pdu += zdumolvis
pdv += zdvmolvis
if callmoldiff:
if moldiff_scheme == 1:
moldiff_red(...) -> zdqmoldiff, PhiEscH, PhiEscH2, PhiEscD
else:
moldiff_MPF(...) -> zdqmoldiff, PhiEscH, PhiEscH2, PhiEscD
pdq += zdqmoldiff
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| 热层物理 | 总调度入口,依次执行 EUV 加热、热传导、黏性扩散和分子扩散 |
| 高层大气逃逸 | 分子扩散子过程输出 H/H₂/D Jeans 逃逸通量 |
| 光化学前驱 | physiq_mod 中 thermosphere 在 calchim 之后调用;热层化学已写回 zycol,本例程追加物理过程 tendency |
写法特点
- 固定格式 Fortran(
.F),续行符$/&。 moldiff_scheme和firstcall标记save+THREADPRIVATE。- 倾向累加顺序固定:EUV → 传导 → 黏性 → 扩散;后续子过程看到的
pdt/pdu/pdv已含上游贡献。 - 未开启的子过程 tendency 缓存已预置为 0,调用方可安全使用诊断。
molvis被调用两次(pu和pv),接口参数位置一致。
复现要点
- 需要
callkeys_mod中calleuv/callconduct/callmolvis/callmoldiff四个开关正确设置。 callthermos须为.true.才能进入physiq_mod的热层分支;conf_phys.F检查四个子开关依赖callthermos。moldiff_scheme由getin_p读取,可在callphys.def中覆盖。conc_mod::rnew/cpnew/Akknew需已由update_r_cp_mu_ak更新(photochem.or.callthermos为真时)。- EUV 加热先于热传导,复现时须保持该顺序。
待确认
r/cpp(comcstfi_h)是否在本例程中被使用,还是仅为传递给子过程而引入。- 四个子开关的具体默认值和 MCD5/MCD6 配置组合。
相关页面
- euvheat:EUV 加热子过程
- conduction:分子热传导子过程
- molvis:分子黏性速度扩散子过程
- moldiff_red:legacy 分子扩散方案
- moldiff_MPF:MPF 分子扩散方案(默认)
- physiq_mod:调用方,
callthermos分支 - callkeys_mod:四个子过程开关
- conc_mod:提供
rnew/cpnew - aeronomars/index