nlte_calc.F
路径
LMDZ.MARS\libf\phymars\nlte_calc.F
所属目录/模块
libf/phymars
文件定位
nlte_calc.F 是 CO2 15 微米 NLTE 冷却快速方案中的光学厚度、escape probability 和 Curtis-matrix 系数计算文件。文件顶部保留了注释掉的 MODULE nlte_calc_mod / USE nlte_aux_mod / CONTAINS 包装,当前源码实际提供一组外部子程序,由 nlte_tcool_mod.F 直接调用。
本文件负责把 nlte_commons_h 中的温度、CO2 数密度、混合比、谱线参数和历史谱线表转换成 c110/vc110、c121/vc121、taustar11_cts、taustar12 等冷却矩阵输入。它不读文件;历史谱线表读取、插值定位、等效线宽和归一化工具来自 nlte_aux。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
MZESC110 |
subroutine |
35 |
在 CTS 网格上计算 110 跃迁的 escape probability 光学厚度 taustar11_cts。 |
MZTUD110 |
subroutine |
233 |
计算主 110 带的 Curtis matrix c110 和边界向量 vc110。 |
MZCUD110 |
subroutine |
626 |
把 110 带的 tau/tauinf 转换为 c110/vc110。 |
MZMC121 |
subroutine |
715 |
合并 121 热带三个子带的 Curtis matrix 和边界向量,写入 c121/vc121。 |
MZTUD121 |
subroutine |
789 |
计算单个 121 子带的 Curtis matrix 和边界向量。 |
MZCUD121 |
subroutine |
1155 |
把单个 121 子带的 tau/tauinf 转换为输出矩阵 c/vc。 |
MZESC121 |
subroutine |
1251 |
汇总 121 三个子带的 escape probability,写入 taustar12。 |
MZESC121sub |
subroutine |
1301 |
计算单个 121 子带的 taustar/tauinf。 |
MZTVC121 |
subroutine |
1505 |
汇总 121 三个子带的边界向量 vc121。 |
MZTVC121sub |
subroutine |
1557 |
计算单个 121 子带的边界向量。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
nlte_tcool_mod |
errors |
把 ierr/varerr 转交给 NLTE cooling-time 错误处理。 |
否 |
nlte_paramdef_h |
nl, nzy, nl_cts, nzy_cts, nbox_max, nhist, imr, ee, nu, nu12_0200, nu12_1000 等 |
维度、同位素混合比、谱线常数和热带频率。 |
否 |
nlte_commons_h |
c110, vc110, c121, vc121, taustar11_cts, taustar12, co2y, co2y_cts, nty, nty_cts, v626t1, zl, zy, deltanu, deltaz, elow, eqw, aa, cc, dd 等 |
NLTE 状态剖面、谱线工作数组、矩阵输出和 escape probability 输出。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块/文件 |
调用位置 |
作用 |
gethist_03 |
nlte_aux.F |
MZESC110、MZTUD110、MZTUD121、MZESC121sub、MZTVC121sub |
选择当前谱带/子带的历史谱线表。 |
initial |
nlte_aux.F |
多个积分循环入口 |
清零 eqw/aa/cc/dd 和 box 累积数组。 |
intzhunt / intzhunt_cts |
nlte_aux.F |
高度层循环 |
在 GCM 或 CTS 高度网格上插值 CO2、压力、混合比和温度。 |
interstrhunt / intershphunt |
nlte_aux.F |
光学厚度积分 |
按温度历史表插值线强和线宽。 |
we_clean |
nlte_aux.F |
光学厚度积分 |
由路径吸收量、CO2 分压和线宽计算 Voigt 等效线宽。 |
mztf_correccion |
nlte_aux.F |
110/121 主网格计算 |
修正顶层柱量 con,连接外推柱量和内部表。 |
mzescape_normaliz / mzescape_normaliz_02 |
nlte_aux.F |
MZESC121 / MZESC110 |
归一化 escape probability 光学厚度数组。 |
MZCUD110 / MZCUD121 |
本文件 |
MZTUD110 / MZTUD121 |
把 transmissivity 差分转换为 Curtis matrix 和边界向量。 |
MZESC121sub / MZTVC121sub |
本文件 |
MZESC121 / MZTVC121 |
分别计算 121 子带 escape probability 和边界向量。 |
abort_physic |
外部错误终止入口 |
MZMC121 |
热带索引超出 2/3/4 时终止。 |
输入
| 输入 |
来源 |
类型/维度 |
单位 |
含义 |
ig |
nlte_tcool_mod.F 调用方 |
integer |
- |
CTS 网格计算中的水平列索引,仅传入 MZESC110。 |
nl_cts_real, nzy_cts_real |
nlte_tcool_mod.F 调用方 |
integer |
- |
CTS 工作网格的实际层数和高度点数。 |
co2y, co2y_cts, nty, nty_cts |
nlte_commons_h |
arrays |
数密度/总数密度 |
CO2 与总数密度剖面,用于柱量和混合比。 |
zl, zy, zl_cts |
nlte_commons_h |
arrays |
高度坐标 |
目标层和历史表高度坐标。 |
v626t1 |
nlte_commons_h |
array |
K |
626 同位素振动温度表,用于插值修正柱量。 |
deltanu, deltaz, deltaz_cts |
nlte_commons_h |
scalar/array |
波数宽度 / 高度步长 |
把等效线宽转换为透过率和矩阵差分系数。 |
ib |
本文件内部循环 |
integer |
- |
121 热带子带索引,取 2、3、4。 |
输出
| 输出 |
去向 |
类型/维度 |
单位 |
含义 |
taustar11_cts |
nlte_commons_h,nlte_tcool_mod.F 读取 |
nl_cts array |
无量纲/光学厚度相关 |
110 跃迁 CTS 网格 escape probability。 |
c110 |
nlte_commons_h,nlte_tcool_mod.F 读取 |
nl x nl matrix |
差分矩阵系数 |
110 主带 Curtis matrix。 |
vc110 |
nlte_commons_h,nlte_tcool_mod.F 读取 |
nl vector |
边界向量系数 |
110 主带边界/外部贡献。 |
c121 |
nlte_commons_h,nlte_tcool_mod.F 读取 |
nl x nl matrix |
差分矩阵系数 |
121 热带三子带合成 Curtis matrix。 |
vc121 |
nlte_commons_h,nlte_tcool_mod.F 读取 |
nl vector |
边界向量系数 |
121 热带三子带合成边界贡献。 |
taustar12 |
nlte_commons_h,nlte_tcool_mod.F 读取 |
nl array |
无量纲/光学厚度相关 |
121 热带合成 escape probability。 |
ierr, varerr |
调用方或 errors |
integer + real*8 |
- |
数值错误代码和触发值。 |
共享状态与副作用
- 本文件主要通过
nlte_commons_h 读写共享工作数组;例如 c110/vc110/c121/vc121/taustar11_cts/taustar12 是下游 nlte_tcool_mod.F 继续使用的状态。
- 多个例程直接写
ibcode1,用字符形式标识当前谱带/子带,再调用 gethist_03(ib) 切换历史谱线表。
- 错误处理分两类:大多数数值问题设置
ierr/varerr 并返回,由调用方 errors 处理;MZMC121 的非法子带索引使用 abort_physic。
- 例程会对
c110/c121/vc110/vc121/taustar* 和若干局部矩阵清零后重算;调用顺序依赖 nlte_tcool_mod.F 的初始化。
核心逻辑
MZESC110 在 CTS 高度网格上用 co2y_cts/nty_cts/ty_cts/py_cts 建立柱量和混合比,读取 110 历史表,逐层积分得到 tauinf,最后调用 mzescape_normaliz_02 得到 taustar11_cts。
MZTUD110 把 GCM 主网格的 CO2 柱量按振动温度修正,读取 110 历史表,逐层/逐路径计算 tau(in,ir) 与 tauinf(in);若最大透过率超过 1,返回错误 42。
MZCUD110 对 tau/tauinf 做差分,乘以 pi*deltanu 和垂直差分算子,写出 c110 与 vc110。
MZMC121 对 121 热带的三个子带 ib=2,3,4 逐一调用 MZTUD121,再按频率比例和温度指数因子合成 c121/vc121。
MZESC121 逐一调用 MZESC121sub 计算三个 121 子带的 escape probability,再按频率比例合成并调用 mzescape_normaliz。
MZTVC121 逐一调用 MZTVC121sub 计算三个子带边界向量,再按频率比例合成 vc121。
伪代码
nlte_tcool_mod calls nlte_calc routines:
for 110 band:
MZESC110:
build CTS CO2 column and mixing-ratio arrays
get history table 1
integrate layer-to-space optical depths
normalize taustar11_cts
MZTUD110:
interpolate vibration temperature to GCM grid
correct CO2 column and get history table 1
for each source layer in:
integrate optical paths to lower layers and to space
use interstrhunt/intershphunt + we_clean for equivalent widths
MZCUD110 converts tau differences into c110 and vc110
for 121 hot band:
MZMC121:
for ib in 2, 3, 4:
MZTUD121 computes one sub-band matrix and vector
scale by frequency/temperature factors
accumulate into c121 and vc121
MZESC121:
for ib in 2, 3, 4:
MZESC121sub computes one sub-band taustar
scale and normalize into taustar12
MZTVC121:
for ib in 2, 3, 4:
MZTVC121sub computes one sub-band boundary vector
scale and accumulate into vc121
参与的主题流程
| 主题 |
参与方式 |
| NLTE 15 微米 CO2 冷却 |
生成 nlte_tcool_mod.F 所需的 110/121 带 escape probability、Curtis matrix 和边界向量。 |
| 辐射矩阵求解 |
c110/c121/vc110/vc121 进入后续 vibrational population 和 cooling-rate 矩阵计算。 |
| 数值错误传播 |
通过 ierr/varerr 把非正 CO2 柱量、非正压力、透过率大于 1、负 vc 等问题传给 errors。 |
写法特点
- 固定格式 Fortran,旧 1-D 文件名保留在注释中,顶层 module 包装未启用。
- 110 和 121 代码结构高度相似:先积分光学路径得到
tau/tauinf,再转成矩阵或 escape probability。
MZMC121、MZESC121 和 MZTVC121 都把 ib=2,3,4 三个热带子带按频率比例合成;MZMC121 还含温度指数缩放因子。
- 多处用
ff=1.0d10 防止过小数值,并用 beta=1.8d5 把 box 柱量传给 we_clean。
复现要点
- 调用本文件前,
nlte_setup.F 必须已经填好 nlte_commons_h 的 CO2/温度/高度/谱线表路径与历史表缓存。
nlte_aux.F::rhist_03 读入的历史谱线表必须覆盖 ib=1..4,否则 gethist_03(ib) 恢复的表不完整。
co2y 顶层非正、压力非正、混合比非正或 tau > 1 都会触发 ierr/varerr,不能忽略返回值。
- 121 热带只按源码支持
ib=2,3,4;扩展谱带时需要同时修改合成例程和历史表索引。
MZTVC121sub 遇到负 vc 会用上一层值替代,但仍在末尾统计 minvc;复现时要保留这个数值保护顺序。
待确认
ierr 代码 33、42、43、45、46、51、52、83 等的完整语义需要结合 nlte_tcool_mod.F::errors 继续整理。
beta=1.8d5、ff=1.0d10、2.d5*deltaz 等常数的物理单位来源需要旧 IAA/CSIC 文档确认。
- 121 热带三个子带频率缩放因子的物理推导本页按源码记录,未外推解释。
相关页面