nlte_tcool_mod.F
路径
LMDZ.MARS\libf\phymars\nlte_tcool_mod.F
所属目录 / 模块
libf/phymars
文件定位
nlte_tcool_mod.F 实现 nltemodel=2 使用的 CO2 15 微米 NLTE 快速冷却率方案。physiq_mod.F 在 callnlte 且 nltemodel.eq.2 时把 GCM 层压强、温度、高度和 CO2/N2/CO/O 混合比传入 nlte_tcool,本模块在内部把每个水平格点的 GCM 垂直剖面重采样到 NLTE 主网格和 CTS 延伸网格,调用 nlte_calc 与 nlte_aux 提供的 Curtis matrix、escape probability、插值、LU 求解和平滑工具,最后把 K/day 的 q15umco2_gcm 回填给调用方;physiq_mod.F 随后除以 86400 转为 K/s。
该文件还提供错误终止子程序 ERRORS。nlte_calc.F 中若干例程 use nlte_tcool_mod, only: errors,说明这里的错误处理不是只供本文件内部使用。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
nlte_tcool_mod |
module |
1 |
封装 nlte_tcool、NLTE 网格构造、CZA 求解、CTS 顶层冷却、单位换算和错误终止例程。 |
nlte_tcool |
subroutine |
30 |
主入口;逐水平格点计算 CO2 15 微米 NLTE 冷却率,并输出到 GCM 垂直网格。 |
NLTEdlvr11_ZGRID |
subroutine |
209 |
从 GCM 剖面构建 NLTE 主网格、细网格、CTS 网格和 CTS 细网格,并写入 nlte_commons_h 共享状态。 |
NLTEdlvr11_CZALU |
subroutine |
499 |
组装并求解 vibrational temperature / source function 相关线性系统,生成 hr110/hr210/hr310/hr410/hr121。 |
NLTEdlvr11_FB626CTS |
subroutine |
1295 |
在 CTS 延伸网格上计算 626 组分的 hr110CTS,用于顶层冷却率拼接。 |
hrkday_convert |
function |
1389 |
把体积冷却功率换算为 K/day 的因子,使用 daysec*n_avog/(cp*1.e4*mmean)。 |
ERRORS |
subroutine |
1415 |
根据 ierr 打印具体 NLTE 错误来源,并调用 abort_physic("nlte_tcool",...) 终止。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
conc_mod |
cpnew, mmean |
nlte_tcool 从 GCM 格点读取平均分子量和热容,供 K/day 换算。 |
否 |
nlte_paramdef_h |
nl, nltot, nl_cts 等 |
提供 NLTE 主网格、CTS 网格、谱线和物理常数维度。 |
否 |
nlte_commons_h |
input_cza, jlowerboundary, jtopCTS, pl, pl_cts, hr*, c*, vc*, taustar*, t/nt/co2/n2/co/o3p 等 |
作为 NLTE 计算的主要共享状态区;本文件大量读写网格、碰撞率、矩阵、源项和冷却率数组。 |
否 |
time_phylmdz_mod |
daysec |
hrkday_convert 使用每 sol 秒数。 |
否 |
param_v4_h |
n_avog |
hrkday_convert 使用阿伏伽德罗常数。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
NLTEdlvr11_ZGRID |
本文件 |
93-97 |
把当前 GCM 列转换到 NLTE 主网格和 CTS 网格。 |
interdp_ESCTVCISO |
nlte_aux.F |
101 |
将同位素 Tstar/VC 表插值到 NLTE 主网格。 |
MZESC110, MZTUD110, MZESC121, MZTVC121, MZMC121 |
nlte_calc.F |
104, 112, 711, 717-718 |
计算 escape probability、Curtis matrix、Tstar/VC 等光学量。 |
leetvt |
nlte_aux.F |
108 |
读取或恢复历史谱线相关 vibrational temperature 缓存。 |
zero*v/zero*m, unit, diago, mulmmf90, resmmf90, LUdec, sypvmv 等 |
nlte_aux.F |
多处 |
清零、矩阵代数和线性系统求解。 |
GETK_dlvr11 |
nlte_setup.F |
748, 1335 |
按当前层温度更新 k19/k20/k21/k33 碰撞速率族。 |
interhunt*, interdp_limits |
nlte_aux.F |
330-338, 375-377, 410-421, 472-476, 189-192 |
在 GCM、NLTE、CTS 和对数压强坐标之间插值。 |
suaviza |
nlte_aux.F |
195 |
对回插到 GCM 网格的冷却率剖面平滑。 |
abort_physic |
物理层公共终止例程 |
295-296, 1666-1667 |
对无法修复的边界或 NLTE 错误执行终止。 |
输入
| 输入 |
来源 |
类型 / 维度 |
单位 |
含义 |
ngridgcm |
physiq_mod.F |
integer |
- |
水平格点数。 |
n_gcm |
physiq_mod.F |
integer |
- |
GCM 垂直层数。 |
p_gcm(ngridgcm,n_gcm) |
physiq_mod.F::zplay*9.869e-6 |
real array |
atm |
层中心压强;physiq 从 Pa 换算为 atm 后传入。 |
t_gcm(ngridgcm,n_gcm) |
physiq_mod.F::pt |
real array |
K |
层中心温度。 |
z_gcm(ngridgcm,n_gcm) |
physiq_mod.F::zzlay |
real array |
m |
层中心高度;本模块入口处除以 1000 变为 km。 |
co2vmr_gcm, n2vmr_gcm, covmr_gcm, o3pvmr_gcm |
physiq_mod.F 由 tracer 和 mmean/mmol 生成 |
real arrays |
mol/mol |
CO2、N2、CO、O 体积分数。 |
mmean, cpnew |
conc_mod |
ngridgcm x n_gcm |
g/mol、J/kg/K 推断 |
hrkday_convert 的平均分子量和热容输入。 |
NLTEDAT 初始化表 |
nlte_setup |
共享数组 |
多种 |
GETK_dlvr11、Tstar/VC 和历史谱线缓存必须已初始化。 |
输出
| 输出 |
去向 |
类型 / 维度 |
单位 |
含义 |
q15umco2_gcm(ngridgcm,n_gcm) |
physiq_mod.F::zdtnlte |
real array |
K/day |
CO2 15 微米 NLTE 冷却率;physiq_mod.F 行 1055-1056 转为 K/s。 |
ierr |
调用方 |
integer |
- |
每个水平格点进入计算时置 0;若错误处理没有终止,可由调用方检查。 |
varerr |
调用方 |
real*8 |
依错误而定 |
与 ierr 对应的错误数值。 |
jlowerboundary, jtopboundary, jtopCTS |
nlte_commons_h |
integers |
- |
本次 GCM 列在 NLTE 主网格和 CTS 网格中的有效 GCM 层索引。 |
pl/t/co2/..., pl_cts/t_cts/co2_cts/..., hr*, vt*, el* |
nlte_commons_h |
arrays |
多种 |
中间网格、数密度、振动态、源项和冷却率共享状态。 |
共享状态与副作用
nlte_tcool 对每个水平格点循环时会重写 nlte_commons_h 中的主网格和 CTS 网格状态,包括 pl/t/nt/co2/n2/co/o3p、pl_cts/t_cts/nt_cts/co2_cts/...、jlowerboundary/jtopboundary/jtopCTS、hrkday_factor*、hr*、vt*、el* 等。
input_cza 在同一列内先被设为 0,再设为 1,分别执行两次 NLTEdlvr11_CZALU;第一次生成振动温度缓存,第二次计算 CZA 相关通道。
- 多处
write(*,*) 输出温度越界、顶边界修正和错误诊断;严重错误最终进入 abort_physic。
NLTEdlvr11_ZGRID 当 GCM 顶层不足以覆盖 Ptop_atm 或 CTS 顶层时,会把 jtopboundary 或 jtopCTS 改为 n_gcm 并继续;底边界压强不满足时直接终止。
ERRORS 是模块内公开子程序,被 nlte_calc.F 通过 use nlte_tcool_mod, only: errors 复用。
核心逻辑
nlte_tcool 逐水平格点复制当前列的压强、温度、成分、高度、mmean 和 cpnew;高度从 m 转为 km。
- 调用
NLTEdlvr11_ZGRID:根据 Pbottom_atm/Ptop_atm 找到 NLTE 主模型的 GCM 层范围,构造 nl 层主网格、nzy 细网格、从 zl(nl-1) 开始的 nl_cts CTS 网格以及 nzy_cts CTS 细网格。
- 在主网格和 CTS 网格上插值压强、温度、混合比、平均分子量、热容,并由
nt=7.339e+21*p/t 转为数密度;同时计算 hrkday_factor 和 hrkday_factor_cts。
- 调用 Tstar/VC、MZESC、MZTUD、历史谱线和矩阵工具,先以
input_cza=0 求解基本振动温度,再以 input_cza=1 求解包含 CZA 通道的冷却率。
NLTEdlvr11_CZALU 在每个 NLTE 层调用 GETK_dlvr11(t(i)),用 CO2/N2/CO/O 数密度、k19/k20/k21/k33 碰撞速率和 Einstein 系数组装多组耦合线性系统;通过矩阵消元与 LUdec 求得 el11/el21/el31/el41,可选求 el12,然后生成 hr110/hr210/hr310/hr410/hr121 并换算到 K/day。
NLTEdlvr11_FB626CTS 在 CTS 网格调用 GETK_dlvr11(t_cts(i)),计算 626 组分高层 hr110CTS。
- 主网格总冷却率为
hr110+hr210+hr310+hr410+hr121;第 nl-1 点与 hr110CTS(1) 取平均,CTS 后续点接到 q15umco2_nltot,超出实际 CTS 的点置零。
- 以
-log(p) 坐标把 q15umco2_nltot 从 NLTE/CTS 组合网格插回原 GCM 网格的 jlowerboundary:jtopCTS 范围,对结果平滑后写入 q15umco2_gcm。
伪代码
for ig in 1..ngridgcm:
copy GCM column fields into 1-D work arrays
convert z from m to km
NLTEdlvr11_ZGRID:
find jlowerboundary where p <= Pbottom_atm
find jtopboundary where p <= Ptop_atm, or clamp to n_gcm
build NLTE main grid zl/pl/t/species/number densities
build fine grid zy/py/ty/co2y
build CTS grid from zl(nl-1), limited by GCM top
build CTS fine grid and jtopCTS
interpolate Tstar and VC tables to NLTE grids
compute escape probability / Curtis matrix terms
input_cza = 0; NLTEdlvr11_CZALU()
input_cza = 1; NLTEdlvr11_CZALU()
NLTEdlvr11_FB626CTS()
q_total(1:nl) = hr110 + hr210 + hr310 + hr410 + hr121
merge q_total(nl-1) with first CTS value
append remaining CTS values, zero unused CTS extension
interpolate q_total back to the original GCM pressure grid
smooth the interpolated profile
write q15umco2_gcm(ig,:)
参与的主题流程
| 主题 |
参与方式 |
| NLTE 15 微米 CO2 冷却 |
作为 nltemodel=2 的核心冷却率计算器,依赖 nlte_setup.F 初始化的表和碰撞速率公式、nlte_calc.F 的光学矩阵构造、nlte_aux.F 的插值与线性代数工具。 |
| 辐射倾向合成 |
physiq_mod.F 把本模块输出的 zdtnlte 转为 K/s 后参与后续辐射倾向和 blendrad 合成。 |
| 高层大气参数化 |
通过 CTS 延伸网格把主 NLTE 网格顶端以上的高层 626 组分冷却率拼接回 GCM 网格。 |
写法特点
- 固定格式 Fortran 文件,但实际外层是
MODULE nlte_tcool_mod,内部包含多个旧 1-D 模型例程。
- 大量物理工作数组不通过参数传递,而是放在
nlte_commons_h 中作为共享状态;调用顺序错误会直接改变后续结果。
NLTEdlvr11_CZALU 使用两阶段 input_cza 模式:第一次计算并保存振动温度,第二次使用该振动温度处理额外通道。
- 源码注释承认 CTS 外推网格在
nl_cts_real < nl_cts 时会按最后两层压强比继续外推;这是复现时需要保持的历史行为。
- 错误编号集中在
ERRORS,但很多内部错误路径会先返回 ierr,主入口随即调用 ERRORS 并终止。
复现要点
- 调用
nlte_tcool 前必须先在 physiq_mod.F 初始化阶段执行 nlte_setup,否则 Tstar/VC 表、历史谱线缓存和 GETK_dlvr11 所需常数不完整。
- 输入压强必须是 atm;
physiq_mod.F 明确用 zplay*9.869e-6 从 Pa 转为 atm。
- 输入高度必须在
nlte_tcool 入口处按源码行为从 m 转为 km;如果外部已传 km,会导致 NLTE 网格高度范围错误。
- GCM 顶层若达不到
Ptop_atm 或 CTS 顶层,源码会夹到 n_gcm 继续;底边界达不到 Pbottom_atm 则会终止。
q15umco2_gcm 在本模块内是 K/day;耦合到物理倾向时必须像 physiq_mod.F 一样除以 86400。
nl_cts_real 必须至少能支持访问 pl_cts(nl_cts_real-1) 和 taustar11_cts(2);源码没有显式保护极小 CTS 有效层数。
待确认
hrkday_convert 注释称输入冷却功率单位为 erg s-1 cm-3,但 cpmean_nlte 和 mmean_nlte 的精确单位约定需要结合 conc_mod 和上游热容定义继续核验。
NLTEdlvr11_FB626CTS 末尾计算 slopeTstar110/maxslope,但本文件没有继续使用 maxslope;保留意图需要外部方案文档确认。
NLTEdlvr11_CZALU 中 itt_cza=13/15 分支的物理选择来自 nlte_paramdef_h 和 IAA/CSIC 方案,本文只按源码控制流记录。
相关页面