nlte_setup.F
路径
LMDZ.MARS\libf\phymars\nlte_setup.F
所属目录 / 模块
libf/phymars
文件定位
nlte_setup.F 是 CO2 15 微米 NLTE 快速参数化的运行时初始化文件。它把运行时数据目录 datafile_mod::datadir 下的 NLTEDAT 表文件读入 nlte_commons_h 的共享数组,并在非 MESOSCALE 编译路径下只让 is_master 进程执行文件 I/O,再用 bcast 把表数据广播到其他进程。
本文件当前没有启用顶部注释中的 MODULE nlte_setup_mod 包装;源码实际提供三个外部子程序:nlte_setup、LeeHISTOGRMS 和 GETK_dlvr11。physiq_mod.F 在 callnlte.and.nltemodel.eq.2 时调用 nlte_setup,而 nlte_tcool_mod.F 在主网格和 CTS 网格计算中调用 GETK_dlvr11 生成温度相关的碰撞速率族。
定义的符号
| 符号 |
类型 |
行号 |
作用 |
nlte_setup |
subroutine |
10 |
读取 NLTE 谱线、Tstar、VC 和历史谱线表,初始化若干固定跃迁系数。 |
LeeHISTOGRMS |
subroutine |
138 |
依次设置 4 个 hid26-*.dat 历史谱线表路径,并调用 rhist_03 读入缓存。 |
GETK_dlvr11 |
subroutine |
185 |
按输入温度计算 k19/k20/k21/k33 及其反向碰撞速率,写入 nlte_commons_h。 |
依赖的模块
| use 模块 |
only 列表 |
用途 |
待确认 |
datafile_mod |
datadir |
构造 datadir/NLTEDAT/... 表文件路径。 |
否 |
mod_phys_lmdz_para |
is_master |
非 MESOSCALE 路径下限制文件读取只在主进程执行。 |
否 |
mod_phys_lmdz_transfert_para |
bcast |
非 MESOSCALE 路径下广播主进程读入的表数组和标量。 |
否 |
nlte_paramdef_h |
nztabul, nb, nisot, indexisot, rf19, rf20, rf21a, rf21b, rf21c, rf33bc, ee, nu |
提供表维度、同位素编码、碰撞率缩放因子和波数常数。 |
否 |
nlte_commons_h |
elow, deltanu, lnpnbtab, tstar*tab, vc*tab, hisfile, k* 等 |
保存本文件读入或计算出的共享 NLTE 表和碰撞速率。 |
否 |
调用的关键例程
| 被调用例程 |
所在模块 / 文件 |
调用位置 |
作用 |
bcast |
mod_phys_lmdz_transfert_para |
81-82, 116-124 |
广播 elow/deltanu、Tstar 表、VC 表和临时标量 xx。 |
LeeHISTOGRMS |
本文件 |
131 |
读取 4 个历史谱线 histogram 表。 |
rhist_03 |
nlte_aux.F |
156, 164, 169, 174 |
从 hisfile 指向的 hid26-*.dat 文件读取历史谱线缓存,并在非 MESOSCALE 路径下广播。 |
输入
| 输入 |
来源 |
类型 / 维度 |
单位 |
含义 |
datadir |
datafile_mod |
string |
- |
运行时数据包根目录;本文件追加 /NLTEDAT/...。 |
NLTEDAT/enelow26.dat, enelow28.dat, enelow36.dat, enelow27.dat |
文件系统 |
每个同位素 nb 个数 |
谱线能级相关量 |
按 indexisot=[26,28,36,27] 顺序读取到 elow(k,:)。 |
NLTEDAT/deltanu26.dat, deltanu28.dat, deltanu36.dat, deltanu27.dat |
文件系统 |
每个同位素 nb 个数 |
cm-1 推断 |
按同位素读取到 deltanu(k,:)。 |
NLTEDAT/parametp_Tstar_IAA1204.dat |
文件系统 |
nztabul 行 |
混合 |
读入 lnpnbtab 和 tstar11/21/31/41tab。 |
NLTEDAT/parametp_VC_IAA1204.dat |
文件系统 |
nztabul 行 |
混合 |
读入 vc210/310/410tab;第一列读入局部变量 xx 后丢弃。 |
NLTEDAT/hid26-1.dat ... hid26-4.dat |
文件系统 |
历史谱线 histogram 表 |
谱线表量 |
由 LeeHISTOGRMS 逐个传给 rhist_03。 |
tt |
GETK_dlvr11 调用方 |
scalar real |
K |
计算碰撞速率的温度。 |
输出
| 输出 |
去向 |
类型 / 维度 |
单位 |
含义 |
elow, deltanu |
nlte_commons_h |
nisot x nb |
谱线表量 |
同位素谱线能级和线宽/频宽表。 |
a1_010_000, a2_010_000, a3_010_000, a4_010_000, a1_020_010 |
nlte_commons_h |
scalars |
- |
源码硬编码的跃迁系数。 |
lnpnbtab, tstar11tab, tstar21tab, tstar31tab, tstar41tab |
nlte_commons_h |
nztabul arrays |
混合 |
Tstar / 压力 tabulation。 |
vc210tab, vc310tab, vc410tab |
nlte_commons_h |
nztabul arrays |
混合 |
VC tabulation。 |
| 历史谱线缓存数组 |
nlte_aux.F::rhist_03 / nlte_commons_h |
nhist 相关数组 |
谱线表量 |
4 个 hid26-* 文件读入后的历史谱线缓存。 |
k19*, k20*, k21*, k23k21*, k24k21*, k34k21*, k33* |
nlte_commons_h |
scalars / nisot arrays |
碰撞速率 |
温度相关的正向和反向碰撞速率族。 |
共享状态与副作用
- 本文件会打开固定 Fortran unit
1、2、11、12 读表,LeeHISTOGRMS 间接通过 rhist_03 使用其内部文件 I/O。
nlte_setup 直接写入 nlte_commons_h 的谱线表、Tstar/VC 表和固定系数;GETK_dlvr11 直接写入碰撞速率共享数组。
- 非
MESOSCALE 编译路径下,只有 is_master 进程读文件;随后必须广播相关数组,否则非主进程会缺少 NLTE 表状态。
xx=xx 是源码字面上的自赋值,用于避免 xx 只在读表/广播路径中被使用而触发未使用警告;它不改变数值状态。
- 文件没有显式检查
open 或 read 错误;缺失 NLTEDAT 文件会导致 Fortran 运行时 I/O 失败。
核心逻辑
nlte_setup 设置本地 unit lun1=1、lun2=2。
- 在非
MESOSCALE 路径下进入 if(is_master),按 indexisot(k) 生成两位同位素代码,逐个打开 enelow*.dat 和 deltanu*.dat,跳过表头后读入 elow(k,1:nb) 与 deltanu(k,1:nb)。
- 非
MESOSCALE 路径下广播 elow 和 deltanu。
- 写入 5 个硬编码跃迁系数:
a1_010_000=1.3546d0、a2_010_000=1.3452d0、a3_010_000=1.1878d0、a4_010_000=1.2455d0、a1_020_010=4.35d0。
- 读取
parametp_Tstar_IAA1204.dat 的 nztabul 行到 lnpnbtab 和 4 个 tstar*tab;读取 parametp_VC_IAA1204.dat 的 nztabul 行到 vc*tab,首列读入 xx。
- 非
MESOSCALE 路径下广播 Tstar/VC 相关数组。
- 调用
LeeHISTOGRMS,后者依次把 hisfile 设为 hid26-1.dat 到 hid26-4.dat,并用 rhist_03(1..4) 读入历史谱线缓存。
GETK_dlvr11(tt) 把温度转为双精度 tdt,计算 k20、k19、k21 和 k33 族的正向速率,再用 exp(-ee*anu/tdt) 和 nu 波数差生成反向速率,逐项写入 nlte_commons_h。
伪代码
nlte_setup:
for k in 1..nisot:
isotcode = two_digit(indexisot(k))
read datadir/NLTEDAT/enelow{isotcode}.dat into elow(k,1:nb)
read datadir/NLTEDAT/deltanu{isotcode}.dat into deltanu(k,1:nb)
if not MESOSCALE:
broadcast elow and deltanu
set fixed transition coefficients a1/a2/a3/a4/a1_020_010
read parametp_Tstar_IAA1204.dat into lnpnbtab and tstar tables
read parametp_VC_IAA1204.dat into vc tables
if not MESOSCALE:
broadcast Tstar and VC tables
LeeHISTOGRMS:
for ihist in 1..4:
hisfile = datadir/NLTEDAT/hid26-{ihist}.dat
rhist_03(ihist)
GETK_dlvr11(tt):
tdt = dble(tt)
derive k20 and k19 families, including low-temperature clamps for k19xca/k19xcb
for each isotope:
write forward k19/k20 arrays
compute reverse k19/k20 rates from exp(-ee * wavenumber / tdt)
derive k21 family and pair ratios
derive k33c and k33cp for isotopes 2..nisot
参与的主题流程
| 主题 |
参与方式 |
| NLTE 15 微米 CO2 冷却 |
初始化 nlte_calc、nlte_aux 和后续 nlte_tcool_mod.F 所需的谱线表、Tstar/VC 表、历史谱线缓存和碰撞速率。 |
| 辐射计算 |
physiq_mod.F 的 NLTE 分支调用 nlte_setup 后,高层冷却参数化才能使用这些表状态。 |
| 并行运行 |
非 MESOSCALE 路径使用主进程读表再广播的模式,避免每个进程重复文件 I/O。 |
写法特点
- 文件是固定格式 Fortran,顶部和底部的 module 包装均被注释掉;当前符号以外部子程序方式参与链接。
- 源码保留旧 1-D NLTE 模型片段说明:
SETTINGS、LeeESCTVCISO_dlvr11、GETK_dlvr11.f。
GETK_dlvr11 使用硬编码经验公式和低温钳制:tt<=175. 时分别把 k19xca 和 k19xcb 固定为 3.3d-15 与 7.6d-16。
- 同位素文件名由
indexisot 控制,不是由循环号直接拼接;当前顺序来自 nlte_paramdef_h。
复现要点
- 调用
nlte_setup 前,datafile_mod::datadir 必须已经指向包含 NLTEDAT 子目录的数据包。
NLTEDAT 目录至少需要 enelow26/28/36/27.dat、deltanu26/28/36/27.dat、parametp_Tstar_IAA1204.dat、parametp_VC_IAA1204.dat 和 hid26-1..4.dat。
- 非
MESOSCALE 并行复现时要保留 is_master + bcast 语义;否则非主进程可能使用未初始化表。
GETK_dlvr11 必须在需要碰撞速率的温度剖面循环中按层调用;nlte_setup 只读表,不会预先填充所有温度的 k* 速率。
- 修改 nlte_paramdef_h 中的
nb、nisot、nztabul 或 indexisot 会直接改变本文件读表循环的合法尺寸和文件名集合。
待确认
parametp_Tstar_IAA1204.dat 与 parametp_VC_IAA1204.dat 各列的物理单位需要结合外部 IAA/CSIC 数据文档确认;本页只按源码读取顺序记录。
GETK_dlvr11 中 k19、k20、k21、k33 经验公式的实验或文献来源未在本文件中给出。
xx 广播后又自赋值的真实意图按源码行为推断为抑制未使用警告,未找到注释说明。
相关页面