nlte_commons_h.F90
路径
LMDZ.MARS\libf\phymars\nlte_commons_h.F90
所属目录 / 模块
libf/phymars
文件定位
nlte_commons_h.F90 定义真实 Fortran module nlte_commons_h,把旧 1-D NLTE 15 微米 CO2 参数化中的多个 common block 合并成一组 save module 变量。它本身不包含 contains、subroutine 或 function;作用是为 nlte_setup.F、nlte_aux、nlte_calc 和 nlte_tcool_mod.F 共享谱线常数、查表数据、主网格/CTS 网格大气剖面、Curtis matrices、escape probability、振动温度、碰撞率和历史谱线缓存。
源文件几乎所有变量都声明为 save 并配套 !$OMP THREADPRIVATE(...)。因此它不是普通只读参数头文件,而是 NLTE 计算链的每线程共享状态仓库:上游初始化例程写入表和剖面,辅助/矩阵例程读写工作数组,下游 cooling-time 例程再读取结果矩阵和加热率。
定义的符号
| 符号 | 类型 | 行号 | 作用 |
|---|---|---|---|
nlte_commons_h |
module | 1 | NLTE 15 微米 CO2 参数化共享状态模块。 |
elow, deltanu |
module variable | 17 | 按同位素和谱带保存低能级能量与波数宽度。 |
nu11, nu12, nu121, nu21, nu31, nu41 |
module variable | 22-25 | 110/121/210/310/410 等跃迁或谱带频率。 |
a1_010_000, a1_020_010, a2_010_000, a3_010_000, a4_010_000 |
module variable | 33-36 | Einstein A 系数。 |
lnpnbtab, vc210tab, vc310tab, vc410tab, tstar11tab, tstar21tab, tstar31tab, tstar41tab |
module variable | 46-49 | NLTE 预计算表,供 escape probability / CTS 路径插值。 |
input_cza |
module variable | 57 | 标记 CZA/NLTE 输入是否可用,供 cooling-time 路径分支判断。 |
v626t1, v628t1, v636t1, v627t1 |
module variable | 65-68 | 四组同位素振动温度剖面。 |
vt11, vt12, vt21, vt31, vt41 |
module variable | 73 | 15 微米各带振动温度输出。 |
hr110, hr121, hr210, hr310, hr410 |
module variable | 77-78 | 各带冷却/加热率剖面。 |
el11, el12, el21, el31, el41 |
module variable | 82-85 | 15 微米带相关能级或源项数组。 |
sl110, sl121, sl210, sl310, sl410 |
module variable | 89-92 | 15 微米谱线强度或源项数组。 |
c110, c121, c210, c310, c410 |
module variable | 102-105 | Curtis matrix 系数,供 nlte_tcool_mod.F 求解能级与冷却率。 |
vc110, vc121, vc210, vc310, vc410 |
module variable | 106-107 | Curtis matrix 边界向量。 |
taustar11, taustar21, taustar31, taustar41, taustar12, taustar11_cts |
module variable | 115-117 | cool-to-space formulation 的 escape probability 光学厚度数组。 |
zl, t, pl, nt, co2, n2, co, o3p, co2vmr, n2vmr, covmr, o3pvmr, hrkday_factor |
module variable | 128-131 | 主 NLTE/GCM 垂直网格大气状态。 |
zy, ty, py, nty, co2y |
module variable | 138 | 高分辨率透过率/插值网格大气状态。 |
deltaz, deltazy, deltaz_cts, deltazy_cts, jlowerboundary, jtopboundary, jtopCTS |
module variable | 144-145 | 主网格、插值网格和 CTS 网格的步长与边界索引。 |
zl_cts, t_cts, pl_cts, nt_cts, co2_cts, n2_cts, co_cts, o3p_cts, co2vmr_cts, n2vmr_cts, covmr_cts, o3pvmr_cts, hrkday_factor_cts, mmean_cts, cpnew_cts |
module variable | 154-160 | CTS 网格大气状态、平均分子量和热容。 |
zy_cts, ty_cts, py_cts, nty_cts, co2y_cts |
module variable | 167-168 | CTS 高分辨率透过率/插值网格状态。 |
k19*, k20*, k21*, k33*, k23k21*, k24k21*, k34k21* |
module variable | 177-193 | 振动-平动、振动-振动和末级组合碰撞率系数。 |
ibcode1, ka, alsa, alda, kr, hisfile, pp, ta, w, sk1, xls1, xld1, thist, no, nbox, eqw, aa, cc, dd, ddbox, ccbox, mr, mr_cts |
module variable | 200-228 | NLTE 历史谱线表、等效线宽和矩阵积分工作状态。 |
sk1_stored, xls1_stored, xld1_stored, thist_stored, no_stored, nbox_stored, mm_stored |
module variable | 234-239 | 按谱带缓存的历史谱线表,供 rhist_03 读入和 gethist_03 恢复。 |
依赖的模块
| use 模块 | only 列表 | 用途 | 待确认 |
|---|---|---|---|
nlte_paramdef_h |
nb, nisot, nztabul, nl, nl_cts, nzy, nzy_cts |
定义谱带、同位素、表长和垂直网格维度。 | 否 |
nlte_paramdef_h |
nbox_max, nhist |
定义历史谱线表缓存和 box 工作数组上限。 | 否 |
调用的关键例程
| 被调用例程 | 所在模块 / 文件 | 调用位置 | 作用 |
|---|---|---|---|
| 无 | - | - | 本文件只声明共享 module 变量,不含可执行例程。 |
输入
| 输入 | 来源 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
nl, nl_cts, nzy, nzy_cts |
nlte_paramdef_h |
integer parameter | - | 决定主网格、CTS 网格和高分辨率透过率网格数组大小。 |
nb, nisot, nztabul, nhist, nbox_max |
nlte_paramdef_h |
integer parameter | - | 决定谱带、同位素、查表和历史谱线缓存维度。 |
| 谱线、表、碰撞率和大气剖面数值 | nlte_setup.F、nlte_tcool_mod.F、nlte_aux.F、nlte_calc.F |
module variables | 混合 | 本模块只分配共享存储;实际数值由上下游例程写入。 |
输出
| 输出 | 去向 | 类型/维度 | 单位 | 含义 |
|---|---|---|---|---|
elow/deltanu、频率和 Einstein 系数 |
nlte_calc.F、nlte_tcool_mod.F |
arrays / scalars | 谱线量 | 谱线积分、能级方程和冷却矩阵的基本常数。 |
zl/t/pl/nt/...、zy/ty/py/...、CTS 剖面 |
nlte_aux.F、nlte_calc.F、nlte_tcool_mod.F |
arrays | 高度、压力、温度、数密度等 | 主网格与 CTS 网格上的大气状态。 |
c*、vc*、taustar* |
nlte_tcool_mod.F |
matrices / vectors | 矩阵系数或无量纲光学厚度 | nlte_calc.F 写入后,cooling-time 求解读取。 |
hr*、vt*、el*、sl* |
nlte_tcool_mod.F 和调用链下游 |
arrays | 冷却率、温度或源项 | NLTE 各带计算结果缓存。 |
*_stored 和当前 thist/no/sk1/xls1/xld1 |
nlte_aux.F、nlte_calc.F |
arrays | 谱线表量 | 历史谱线表读入、缓存和按谱带恢复的工作状态。 |
共享状态与副作用
- 所有主要变量均为
savemodule 状态,且每组变量后都有!$OMP THREADPRIVATE指令;OpenMP 运行时每个线程保留自己的副本。复现时不能假设一个线程写入后其他线程自动可见。 nlte_setup.F写入谱线常数、预计算表、hisfile和碰撞率;nlte_aux.F::rhist_03再根据hisfile填充*_stored历史表缓存。nlte_tcool_mod.F的初始化/准备路径写入主网格、CTS 网格、边界索引、mmean_cts/cpnew_cts等大气状态;同一文件后续读取这些状态并求解各带冷却。- nlte_calc 读取
elow/deltanu、大气剖面和历史谱线表工作数组,并写出c110/vc110/c121/vc121/taustar12/taustar11_cts等矩阵输入。 - nlte_aux 的
initial、gethist_03、rhist_03和插值例程会直接清零、恢复或读取eqw/aa/cc/dd、thist/no/sk1/xls1/xld1、mr/mr_cts等工作变量。
核心逻辑
- 编译期从
nlte_paramdef_h取得所有数组维度,nlte_commons_h据此声明旧 common block 对应的 module 变量。 nlte_setup.F在初始化阶段读取或计算谱线常数、查表数据、历史表文件名和碰撞率,并写入本模块。nlte_tcool_mod.F把 GCM 输入剖面转换为 NLTE 主网格、CTS 网格和高分辨率插值网格状态,写入本模块的zl/t/pl/...、zy/ty/...、zl_cts/t_cts/...。nlte_aux.F读取历史谱线表到*_stored,再按当前谱带恢复为thist/no/sk1/xls1/xld1工作数组,并提供插值/等效线宽工具。nlte_calc.F用共享剖面、谱线表和工作数组构造 Curtis matrices、边界向量和 escape probability,并写回c*、vc*、taustar*。nlte_tcool_mod.F读取这些矩阵和速率系数,计算 NLTE 振动温度、各带冷却率和最终冷却贡献。
伪代码
compile-time:
import NLTE dimensions from nlte_paramdef_h
allocate saved, threadprivate module variables
setup phase:
nlte_setup writes spectral constants, tabulation arrays and rates
nlte_setup sets hisfile for each history table
nlte_aux.rhist_03 reads history tables into *_stored caches
profile preparation:
nlte_tcool_mod writes main and CTS atmospheric profiles
nlte_tcool_mod sets grid spacing and boundary indices
matrix construction:
nlte_aux.gethist_03 copies one stored table into current work arrays
nlte_calc reads profiles and line tables
nlte_calc writes Curtis matrices, boundary vectors and taustar arrays
cooling solve:
nlte_tcool_mod reads rates, matrices, taustar and profiles
nlte_tcool_mod updates vt*, hr*, el* and sl* result arrays
参与的主题流程
| 主题 | 参与方式 |
|---|---|
| NLTE 15 微米 CO2 冷却 | 保存从初始化、查表、矩阵构造到 cooling-time 求解之间传递的全部共享状态。 |
| 辐射计算 | c*、vc*、taustar*、hr* 等数组进入 CO2 15 微米非 LTE 冷却贡献计算。 |
| 并行/OpenMP 运行 | THREADPRIVATE 使 NLTE 状态按线程隔离,初始化和计算必须在每线程语义下保持一致。 |
写法特点
- 文件保留旧
common /.../注释,下面用 module 变量替代,这使旧 1-D 模型命名仍可追溯。 - 本文件没有
public/private显式限制;下游通过use nlte_commons_h, only: ...选择需要的共享变量。 - 同一物理流程的数组分散在多个旧 common block 分组中,例如谱线常数、矩阵、主网格、CTS 网格、碰撞率和历史谱线缓存,需要按上下游读写关系理解。
real与real*8混用:大气剖面多为real,谱线、矩阵、速率和历史表多为real*8。复现或接口迁移时不能统一假设为双精度。
复现要点
- 必须先完成
nlte_setup.F的表和速率初始化,再进入nlte_tcool_mod.F/nlte_calc.F计算;否则本模块中的save数组可能仍未初始化。 - 历史谱线表必须通过
rhist_03写入*_stored,再由gethist_03恢复当前谱带工作数组;直接调用矩阵例程会依赖这些缓存状态。 nbox_max、nhist、nb等维度来自nlte_paramdef_h,输入表尺寸超过这些上限会在下游读表或积分阶段触发错误。- OpenMP 复现时要确认每个线程都拥有正确初始化后的
THREADPRIVATE副本;这类状态不会自动跨线程共享。 - 主网格与 CTS 网格分别使用
nl/nzy和nl_cts/nzy_cts维度,不能把taustar11_cts、*_cts剖面和主网格数组混用。
待确认
input_cza的完整状态枚举和分支语义需要结合nlte_tcool_mod.F后续页面整理。k19*、k20*、k21*、k33*等碰撞率系数的物理来源需结合nlte_setup.F和旧 IAA/CSIC 文档确认。real主剖面与real*8谱线/矩阵数组混合精度是否有历史误差控制依据,源文件本身未解释。
相关页面
- phymars 目录
- nlte_aux
- nlte_calc
- nlte_setup.md:负责填充谱线表、历史表文件名和碰撞率。
- nlte_tcool_mod.md:负责填充大气状态并读取本模块结果求解 NLTE cooling-time。
- nlte_paramdef_h.md:定义本模块数组维度和谱线常数。
- nltecool