nlte_aux.F
路径
LMDZ.MARS\libf\phymars\nlte_aux.F
所属目录/模块
libf/phymars
文件定位
nlte_aux.F 是 CO2 15 微米 NLTE 冷却快速方案的外部辅助例程集合。文件开头保留了 MODULE nlte_aux_mod / CONTAINS / END MODULE nlte_aux_mod 的注释行,但当前源码并没有启用 module 包装;下游通过外部函数和子程序名直接调用这些例程。
本文件合并了旧 1-D NLTE 模型的若干文件片段,包括 Planck 函数、振动温度表初始化、温度/高度/多维查表插值、escape probability 归一化、LU 分解和矩阵/向量工具,以及历史谱线表 hisfile 的读取和广播。它服务于 nlte_setup.F 的表读取、nlte_calc.F 的 NLTE 辐射查表和等效线宽计算,以及 nlte_tcool_mod.F 的冷却时间尺度矩阵求解。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
planckdp |
function |
103 |
用 nlte_paramdef_h::gamma/ee 计算给定温度和波数的 Planck 项。 |
leetvt |
subroutine |
118 |
把 ty/zy/zl 表转换并插值到各同位素振动温度数组。 |
initial |
subroutine |
155 |
清零 eqw/aa/cc/dd/ccbox/ddbox 等 NLTE 累积工作数组。 |
intershphunt |
subroutine |
180 |
按温度历史表插值 self Lorentz 与 Doppler 线宽数组。 |
interstrhunt |
subroutine |
235 |
按温度历史表插值谱线强度。 |
intzhunt / intzhunt_cts |
subroutine |
322 / 354 |
在高度网格上插值 CO2、压力、混合比、温度等状态量。 |
we_clean |
real*8 function |
390 |
组合 Lorentz/Doppler 近似计算 Voigt 等效线宽。 |
mztf_correccion |
subroutine |
466 |
根据低层 LTE/非 LTE 连接修正柱量 con。 |
mzescape_normaliz / mzescape_normaliz_02 |
subroutine |
526 / 573 |
对 escape probability 光学厚度数组归一化。 |
interdp_ESCTVCISO |
subroutine |
624 |
读取/插值 ESC/TVC/ISO 相关双精度表。 |
hunt_cts / huntdp / hunt |
subroutine |
664 / 733 / 793 |
有序网格定位工具,供插值例程查找包围区间。 |
interdp_limits |
subroutine |
860 |
带边界限制的一维双精度插值。 |
interhunt* / interhuntlimits* |
subroutine group |
956-1592 |
二维到五维查表插值及带限制版本。 |
lubksb_dp / ludcmp_dp / LUdec |
subroutine |
1619 / 1660 / 1749 |
LU 分解、回代和矩阵方程批量求解。 |
unit ... zero2v |
subroutine group |
1797-2173 |
单位矩阵、对角化、矩阵/向量乘加和清零工具。 |
suaviza |
subroutine |
2184 |
对一维数组做可选平滑。 |
mulmmf90 / resmmf90 |
subroutine |
2266 / 2282 |
矩阵乘法和残差矩阵计算。 |
gethist_03 |
subroutine |
2299 |
从已缓存的历史表数组恢复当前 thist/no/sk1/xls1/xld1。 |
rhist_03 |
subroutine |
2332 |
从 hisfile 读取历史谱线表,并在非 MESOSCALE 路径广播。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
nlte_paramdef_h |
nl, nzy, nhist, nbox_max, gamma, ee, nu 等 |
维度、谱线常数和辐射常数。 |
否 |
nlte_commons_h |
zy, ty, zl, thist, no, sk1, xls1, xld1, hisfile 等 |
NLTE 查找表、工作数组、谱线历史表缓存和输入文件名。 |
否 |
mod_phys_lmdz_para |
is_master |
非 MESOSCALE 路径中限制历史表只由主进程读取。 |
否 |
mod_phys_lmdz_transfert_para |
bcast |
非 MESOSCALE 路径中广播历史表缓存到其他进程。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
huntdp |
本文件 |
intershphunt、interstrhunt、多组 interhunt* |
在双精度有序网格中查找插值区间。 |
hunt / hunt_cts |
本文件 |
高度和 CTS 插值例程 |
在单精度/CTS 网格中查找插值区间。 |
abort_physic |
外部错误终止入口 |
多处 |
插值越界、Voigt 负值、奇异矩阵、平滑选项非法和 nbox 过大时终止。 |
ludcmp_dp / lubksb_dp |
本文件 |
LUdec |
分解矩阵并求解多右端线性系统。 |
bcast |
mod_phys_lmdz_transfert_para |
rhist_03 |
广播由主进程读入的历史谱线表。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
tp, xnu |
planckdp 调用方 |
scalar |
K / cm-1 |
温度和波数。 |
xtemp, thist, xls1, xld1, sk1 |
nlte_calc.F / nlte_commons_h |
arrays |
K / 谱线表量 |
温度历史表和谱线强度/线宽查表数据。 |
h, zl, zy |
intzhunt* 调用方 / nlte_commons_h |
scalar + arrays |
高度坐标 |
目标高度和 NLTE/GCM 高度网格。 |
y, pl, xalsa, xalda |
we_clean 调用方 |
scalar |
路径量 / 压力 / 线宽 |
等效线宽计算所需的吸收量、CO2 分压和 Lorentz/Doppler 线宽。 |
hisfile |
nlte_commons_h |
string |
- |
rhist_03 要读取的历史谱线表文件。 |
xx, aa, bb, m, n |
LUdec 调用方 |
matrices / integers |
- |
线性系统系数矩阵、右端矩阵和维度。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
planckdp |
nlte_tcool_mod.F |
real*8 |
erg cm-2 sr-1 cm |
Planck 辐射项。 |
alsa/alda、st/ts 等插值结果 |
nlte_calc.F |
arrays |
谱线表量 |
NLTE cooling 查表后的线强、线宽和状态量。 |
we_clean |
nlte_calc.F |
real*8 |
等效线宽 |
Voigt 近似后的等效宽度。 |
taustar* |
nlte_calc.F |
arrays |
光学厚度相关 |
escape probability 归一化后的光学厚度数组。 |
thist/no/sk1/xls1/xld1 |
nlte_commons_h |
arrays |
谱线表量 |
当前历史表工作副本。 |
mm_stored/nbox_stored/*_stored |
nlte_commons_h |
arrays |
谱线表量 |
rhist_03 从文件读入并缓存的历史表。 |
bb |
LUdec 调用方 |
matrix |
- |
线性系统解矩阵。 |
共享状态与副作用
initial、leetvt、gethist_03、rhist_03 等例程直接读写 nlte_commons_h 中的共享数组。
rhist_03 使用固定 Fortran unit 3 打开 hisfile,读取后关闭;非 MESOSCALE 编译路径只让 is_master 进程做文件 I/O,再用 bcast 广播数组。
- 多个插值例程在输入超出表范围时会写
stdout 警告或调用 abort_physic。intershphunt 对接近边界的温度做 0.01 K 容忍钳制,但真正越过查表边界仍可能终止。
we_clean 对 Voigt 组合项为负的情况调用 abort_physic,说明谱线数据或输入范围不再物理一致。
ludcmp_dp 在发现奇异矩阵时调用 abort_physic("ludcmp_dp","singular matrix!",1)。
核心逻辑
nlte_setup.F 初始化 NLTE 表文件名后,多次调用 rhist_03(ihist) 读取不同历史谱线表。非 MESOSCALE 并行路径由主进程读文件并广播缓存。
nlte_calc.F 进入具体 NLTE 冷却计算前调用 gethist_03(ihist),把某个历史表缓存恢复为当前 thist/no/sk1/xls1/xld1 工作数组。
intzhunt*、interstrhunt、intershphunt 和多组 interhunt* 按高度、温度和其他表坐标查找包围区间,做线性或多维线性插值。
we_clean 用 Lorentz、Doppler 和 Voigt 近似把吸收路径量与线宽合成为等效宽度;若组合项不可开方则终止。
mztf_correccion 和 mzescape_normaliz* 修正柱量和 escape probability 光学厚度,供 nlte_calc.F 的多谱带/多同位素计算继续使用。
nlte_tcool_mod.F 使用 planckdp 计算边界/层内 Planck 项,并用 LUdec 解冷却时间尺度相关的线性系统;suaviza 对某些剖面做平滑。
伪代码
setup phase:
for each NLTE history table:
rhist_03(ihist)
if not MESOSCALE:
master opens hisfile on unit 3
read mm_stored, nbox_stored, thist_stored, no/sk1/xls1/xld1
if nbox_stored > nbox_max:
abort
if not MESOSCALE:
broadcast cached arrays
calculation phase:
gethist_03(ihist)
copy cached history table into current working arrays
for each target layer/box:
locate height and temperature intervals with hunt/huntdp
interpolate state, line strength, Lorentz width and Doppler width
compute equivalent width with we_clean
normalize escape probability arrays
for cooling-time linear systems:
build coefficient matrices
LUdec calls ludcmp_dp + lubksb_dp
return solved vectors/matrices to nlte_tcool_mod
参与的主题流程
| 主题 |
参与方式 |
| NLTE 15 微米 CO2 冷却 |
为 nlte_calc.F 提供历史谱线表读取、温度/高度插值、等效线宽和 escape probability 工具。 |
| 辐射计算 |
nlte_tcool_mod.F 使用 planckdp 和 LUdec 构造/求解冷却时间尺度中的辐射矩阵。 |
| 并行运行 |
rhist_03 在非 MESOSCALE 路径中使用主进程读表和广播,避免每个进程重复读文件。 |
写法特点
- 文件保留固定格式 Fortran 和旧 1-D 模型来源注释,代码中混合
c 注释、! 注释、@/& 续行和预处理条件。
- 顶层 module 包装被注释掉,因此其他文件以
external 或隐式外部子程序方式引用本文件例程。
- 查表例程很多,命名以
hunt / interhunt 组合维度和精度,复现时需要按调用方实参确认具体坐标含义。
rhist_03 的文件 I/O 依赖 nlte_commons_h::hisfile 已由上游设置;本文件不负责构造路径。
复现要点
- 复现 NLTE cooling 前必须先通过
rhist_03 读入对应历史表,否则 gethist_03 只能复制未初始化或旧缓存。
nbox_stored(ihist) 不能超过 nlte_paramdef_h::nbox_max。
- 温度历史表插值对极小边界误差有容忍,但超出查表范围仍可能终止;输入温度网格需要与表范围一致。
we_clean 的 y、pl、xalsa、xalda 不能导致 Voigt 组合项为负;否则说明谱线参数或路径状态超出适用范围。
- 非
MESOSCALE 并行复现时要保证 mod_phys_lmdz_para 和 mod_phys_lmdz_transfert_para 的广播语义可用。
待确认
hisfile 的实际文件名和数据来源由 nlte_setup.F / 运行时数据目录决定,本页只确认 rhist_03 的读取格式。
mztf_correccion、mzescape_normaliz* 中各硬编码谱带/同位素修正的物理来源需要结合 IAA/CSIC 旧模型文档确认。
- 多组
interhunt* 例程的每个坐标变量物理含义需要在具体调用点逐一对应,不能仅凭例程名推断。
相关页面