3156 lines
83 KiB
Rust
3156 lines
83 KiB
Rust
//! 大气模型状态。
|
||
//!
|
||
//! 重构自 TLUSTY `MODELQ.FOR` 中的 COMMON 块。
|
||
//! 包含温度、密度、电子密度、占据数等物理状态。
|
||
|
||
use super::constants::*;
|
||
|
||
// ============================================================================
|
||
// MODPAR - 模型参数
|
||
// ============================================================================
|
||
|
||
/// 模型基本参数。
|
||
/// 对应 COMMON /MODPAR/
|
||
#[derive(Debug, Clone)]
|
||
pub struct ModPar {
|
||
/// 深度 (柱质量密度, g/cm²)
|
||
pub dm: Vec<f64>,
|
||
/// 温度 (K)
|
||
pub temp: Vec<f64>,
|
||
/// 电子密度 (cm⁻³)
|
||
pub elec: Vec<f64>,
|
||
/// 总粒子密度 (cm⁻³)
|
||
pub dens: Vec<f64>,
|
||
/// 总粒子数
|
||
pub totn: Vec<f64>,
|
||
|
||
/// 总原子密度
|
||
pub anto: Vec<f64>,
|
||
/// 金属原子密度
|
||
pub anma: Vec<f64>,
|
||
/// 中性氢密度
|
||
pub anh1: Vec<f64>,
|
||
/// 深度变量
|
||
pub zd: Vec<f64>,
|
||
|
||
// 辅助温度量
|
||
/// h/kT
|
||
pub hkt1: Vec<f64>,
|
||
/// 1/T
|
||
pub tk1: Vec<f64>,
|
||
/// h/(kT)²
|
||
pub hkt21: Vec<f64>,
|
||
/// sqrt(T)
|
||
pub sqt1: Vec<f64>,
|
||
|
||
// 迭代中间量
|
||
pub temp1: Vec<f64>,
|
||
pub elec1: Vec<f64>,
|
||
pub dens1: Vec<f64>,
|
||
pub densi: Vec<f64>,
|
||
pub densim: Vec<f64>,
|
||
|
||
// 散射相关
|
||
/// 电子散射不透明度
|
||
pub elscat: Vec<f64>,
|
||
/// 线性化辐射参数
|
||
pub alab: Vec<f64>,
|
||
|
||
// 深度差分
|
||
pub deldm: Vec<f64>,
|
||
pub dedm1: f64,
|
||
pub deldmz: Vec<f64>,
|
||
|
||
// 速度场
|
||
pub thetav: Vec<f64>,
|
||
pub viscd: Vec<f64>,
|
||
pub dalpmx: f64,
|
||
pub xhyd: f64,
|
||
|
||
// 全局量
|
||
pub dmtot: f64,
|
||
pub rrdil: f64,
|
||
pub tempbd: f64,
|
||
pub alptav: f64,
|
||
pub alpgav: f64,
|
||
pub nalp: i32,
|
||
pub ibeta: i32,
|
||
}
|
||
|
||
impl Default for ModPar {
|
||
fn default() -> Self {
|
||
Self {
|
||
dm: vec![0.0; MDEPTH],
|
||
temp: vec![0.0; MDEPTH],
|
||
elec: vec![0.0; MDEPTH],
|
||
dens: vec![0.0; MDEPTH],
|
||
totn: vec![0.0; MDEPTH],
|
||
anto: vec![0.0; MDEPTH],
|
||
anma: vec![0.0; MDEPTH],
|
||
anh1: vec![0.0; MDEPTH],
|
||
zd: vec![0.0; MDEPTH],
|
||
hkt1: vec![0.0; MDEPTH],
|
||
tk1: vec![0.0; MDEPTH],
|
||
hkt21: vec![0.0; MDEPTH],
|
||
sqt1: vec![0.0; MDEPTH],
|
||
temp1: vec![0.0; MDEPTH],
|
||
elec1: vec![0.0; MDEPTH],
|
||
dens1: vec![0.0; MDEPTH],
|
||
densi: vec![0.0; MDEPTH],
|
||
densim: vec![0.0; MDEPTH],
|
||
elscat: vec![0.0; MDEPTH],
|
||
alab: vec![0.0; MDEPTH],
|
||
deldm: vec![0.0; MDEPTH],
|
||
dedm1: 0.0,
|
||
deldmz: vec![0.0; MDEPTH],
|
||
thetav: vec![0.0; MDEPTH],
|
||
viscd: vec![0.0; MDEPTH],
|
||
dalpmx: 0.0,
|
||
xhyd: 0.0,
|
||
dmtot: 0.0,
|
||
rrdil: 0.0,
|
||
tempbd: 0.0,
|
||
alptav: 0.0,
|
||
alpgav: 0.0,
|
||
nalp: 0,
|
||
ibeta: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// LEVPOP - 能级占据数
|
||
// ============================================================================
|
||
|
||
/// 能级占据数。
|
||
/// 对应 COMMON /LEVPOP/
|
||
#[derive(Debug, Clone)]
|
||
pub struct LevPop {
|
||
/// 占据数 (能级 × 深度)
|
||
pub popul: Vec<Vec<f64>>,
|
||
/// Boltzmann 因子
|
||
pub bfac: Vec<Vec<f64>>,
|
||
/// 逆占据数
|
||
pub popinv: Vec<Vec<f64>>,
|
||
|
||
/// 当前深度占据数
|
||
pub popgrp: Vec<f64>,
|
||
pub pop: Vec<f64>,
|
||
/// 束缚-自由源函数
|
||
pub sbf: Vec<f64>,
|
||
pub dsbf: Vec<f64>,
|
||
/// 离子配分函数
|
||
pub usum: Vec<f64>,
|
||
}
|
||
|
||
impl Default for LevPop {
|
||
fn default() -> Self {
|
||
Self {
|
||
popul: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
bfac: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
popinv: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
popgrp: vec![0.0; MLEVEL],
|
||
pop: vec![0.0; MLEVEL],
|
||
sbf: vec![0.0; MLEVEL],
|
||
dsbf: vec![0.0; MLEVEL],
|
||
usum: vec![0.0; MION],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// POPULS - 加速收敛用的历史占据数
|
||
// ============================================================================
|
||
|
||
/// 加速收敛用的历史占据数。
|
||
/// 对应 COMMON /POPULS/
|
||
#[derive(Debug, Clone)]
|
||
pub struct PopulS {
|
||
/// 历史占据数 1 (能级 × 深度)
|
||
pub popul1: Vec<Vec<f64>>,
|
||
/// 历史占据数 2 (能级 × 深度)
|
||
pub popul2: Vec<Vec<f64>>,
|
||
/// 历史占据数 3 (能级 × 深度)
|
||
pub popul3: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for PopulS {
|
||
fn default() -> Self {
|
||
Self {
|
||
popul1: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
popul2: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
popul3: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// GFFPAR - 自由-自由 Gaunt 因子
|
||
// ============================================================================
|
||
|
||
/// 自由-自由 Gaunt 因子参数。
|
||
/// 对应 COMMON /GFFPAR/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct GffPar {
|
||
/// Gaunt 因子 (深度)
|
||
pub gf0: Vec<f64>,
|
||
pub gf1: Vec<f64>,
|
||
pub gf2: Vec<f64>,
|
||
pub gf3: Vec<f64>,
|
||
pub gf4: Vec<f64>,
|
||
pub gf5: Vec<f64>,
|
||
pub gf6: Vec<f64>,
|
||
|
||
/// Gaunt 因子导数
|
||
pub gf0d: Vec<f64>,
|
||
pub gf1d: Vec<f64>,
|
||
pub gf2d: Vec<f64>,
|
||
pub gf3d: Vec<f64>,
|
||
pub gf4d: Vec<f64>,
|
||
pub gf5d: Vec<f64>,
|
||
pub gf6d: Vec<f64>,
|
||
|
||
/// 温度步长
|
||
pub deltt: Vec<f64>,
|
||
}
|
||
|
||
impl GffPar {
|
||
pub fn new() -> Self {
|
||
Self {
|
||
gf0: vec![0.0; MDEPTH],
|
||
gf1: vec![0.0; MDEPTH],
|
||
gf2: vec![0.0; MDEPTH],
|
||
gf3: vec![0.0; MDEPTH],
|
||
gf4: vec![0.0; MDEPTH],
|
||
gf5: vec![0.0; MDEPTH],
|
||
gf6: vec![0.0; MDEPTH],
|
||
gf0d: vec![0.0; MDEPTH],
|
||
gf1d: vec![0.0; MDEPTH],
|
||
gf2d: vec![0.0; MDEPTH],
|
||
gf3d: vec![0.0; MDEPTH],
|
||
gf4d: vec![0.0; MDEPTH],
|
||
gf5d: vec![0.0; MDEPTH],
|
||
gf6d: vec![0.0; MDEPTH],
|
||
deltt: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// TOTRAD - 总辐射场
|
||
// ============================================================================
|
||
|
||
/// 总辐射场。
|
||
/// 对应 COMMON /TOTRAD/
|
||
#[derive(Debug, Clone)]
|
||
pub struct TotRad {
|
||
/// 辐射强度 (频率 × 深度)
|
||
pub rad: Vec<Vec<f64>>,
|
||
/// 频率相关深度
|
||
pub fhd: Vec<f64>,
|
||
/// 吸收系数 × 辐射
|
||
pub fak: Vec<Vec<f64>>,
|
||
pub radk: Vec<Vec<f64>>,
|
||
|
||
/// 外辐射
|
||
pub extrad: Vec<f64>,
|
||
/// 外辐射强度 (频率 × 角度)
|
||
pub extint: Vec<Vec<f64>>,
|
||
/// 氦外辐射
|
||
pub hextrd: Vec<f64>,
|
||
/// 外部辐照角度参数 (COMMON/EXTINT/WANGLE)
|
||
pub wangle: f64,
|
||
|
||
// 全局量
|
||
pub trad: f64,
|
||
pub wdil: f64,
|
||
pub extot: f64,
|
||
pub tstar: f64,
|
||
}
|
||
|
||
impl Default for TotRad {
|
||
fn default() -> Self {
|
||
Self {
|
||
rad: vec![vec![0.0; MDEPTH]; MFREQ],
|
||
fhd: vec![0.0; MFREQ],
|
||
fak: vec![vec![0.0; MDEPTH]; MFREQ],
|
||
radk: vec![vec![0.0; MDEPTH]; MFREQ],
|
||
extrad: vec![0.0; MFREQ],
|
||
extint: vec![vec![0.0; MMU]; MFREQ],
|
||
hextrd: vec![0.0; MFREQ],
|
||
wangle: 0.0,
|
||
trad: 0.0,
|
||
wdil: 0.0,
|
||
extot: 0.0,
|
||
tstar: 0.0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// CURRAD - 当前深度辐射
|
||
// ============================================================================
|
||
|
||
/// 当前深度辐射。
|
||
/// 对应 COMMON /CURRAD/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CurRad {
|
||
pub rad1: Vec<f64>,
|
||
pub ali1: Vec<f64>,
|
||
pub fak1: Vec<f64>,
|
||
pub radcm: Vec<Vec<f64>>,
|
||
pub radl: Vec<Vec<f64>>,
|
||
pub absali: Vec<Vec<f64>>,
|
||
pub alih1: Vec<f64>,
|
||
}
|
||
|
||
impl Default for CurRad {
|
||
fn default() -> Self {
|
||
Self::new()
|
||
}
|
||
}
|
||
|
||
impl CurRad {
|
||
pub fn new() -> Self {
|
||
Self {
|
||
rad1: vec![0.0; MDEPTH],
|
||
ali1: vec![0.0; MDEPTH],
|
||
fak1: vec![0.0; MDEPTH],
|
||
radcm: vec![vec![0.0; MDEPTH]; MFREQ],
|
||
radl: vec![vec![0.0; MDEPTH]; MFREQL],
|
||
absali: vec![vec![0.0; MDEPTH]; MFREQL],
|
||
alih1: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// FRQALL - 频率相关数组
|
||
// ============================================================================
|
||
|
||
/// 频率相关数组。
|
||
/// 对应 COMMON /FRQALL/
|
||
#[derive(Debug, Clone)]
|
||
pub struct FrqAll {
|
||
/// 频率网格 (Hz)
|
||
pub freq: Vec<f64>,
|
||
/// 频率权重
|
||
pub w: Vec<f64>,
|
||
/// 谱线轮廓
|
||
pub prof: Vec<f64>,
|
||
/// 谱线权重
|
||
pub wch: Vec<f64>,
|
||
|
||
// 索引数组
|
||
pub jik: Vec<i32>,
|
||
pub ijx: Vec<i32>,
|
||
pub ijbf: Vec<i32>,
|
||
pub ifs0: i32,
|
||
pub kij: Vec<i32>,
|
||
pub lskip: Vec<Vec<i32>>,
|
||
}
|
||
|
||
impl Default for FrqAll {
|
||
fn default() -> Self {
|
||
Self {
|
||
freq: vec![0.0; MFREQ],
|
||
w: vec![0.0; MFREQ],
|
||
prof: vec![0.0; MFREQP],
|
||
wch: vec![0.0; MFREQ],
|
||
jik: vec![0; MFREQ],
|
||
ijx: vec![0; MFREQ],
|
||
ijbf: vec![0; MFREQ],
|
||
ifs0: 0,
|
||
kij: vec![0; MFREQ],
|
||
lskip: vec![vec![0; MFREQ]; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// TOTPRF - 总谱线轮廓
|
||
// ============================================================================
|
||
|
||
/// 谱线轮廓数组。
|
||
/// 对应 COMMON /TOTPRF/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct TotPrf {
|
||
/// 谱线轮廓 (深度 × 频率)
|
||
pub prflin: Vec<Vec<f32>>,
|
||
}
|
||
|
||
impl TotPrf {
|
||
pub fn new() -> Self {
|
||
Self {
|
||
prflin: vec![vec![0.0; MFREQP]; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// PHOEXP - 光电离截面展开
|
||
// ============================================================================
|
||
|
||
/// 光电离截面展开参数。
|
||
/// 对应 COMMON /PHOEXP/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct PhoExp {
|
||
/// 频率插值系数
|
||
pub aijbf: Vec<f64>,
|
||
/// 束缚-自由截面 (MCROSS × MFREQC)
|
||
pub bfcs: Vec<Vec<f32>>,
|
||
/// 频率索引
|
||
pub ifreqb: Vec<i32>,
|
||
}
|
||
|
||
impl PhoExp {
|
||
pub fn new() -> Self {
|
||
Self {
|
||
aijbf: vec![0.0; MFREQ],
|
||
bfcs: vec![vec![0.0; MFREQC]; MCROSS],
|
||
ifreqb: vec![0; MFREQC],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// OBFPAR - 束缚-自由跃迁参数
|
||
// ============================================================================
|
||
|
||
/// 束缚-自由跃迁参数。
|
||
/// 对应 COMMON /OBFPAR/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct ObfPar {
|
||
/// 束缚-自由跃迁对应的跃迁索引
|
||
pub itrbf: Vec<i32>,
|
||
}
|
||
|
||
impl ObfPar {
|
||
pub fn new() -> Self {
|
||
Self {
|
||
itrbf: vec![0; MBF],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// LEVADD - 能级附加数组
|
||
// ============================================================================
|
||
|
||
/// 能级附加数组。
|
||
/// 对应 COMMON /LEVADD/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct LevAdd {
|
||
/// 离子配分函数和 (离子 × 深度)
|
||
pub usums: Vec<Vec<f64>>,
|
||
/// 配分函数温度导数
|
||
pub dusmt: Vec<Vec<f64>>,
|
||
/// 配分函数密度导数
|
||
pub dusmn: Vec<Vec<f64>>,
|
||
/// 双电子复合截面 (离子 × 深度)
|
||
pub diesig: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl LevAdd {
|
||
pub fn new() -> Self {
|
||
Self {
|
||
usums: vec![vec![0.0; MDEPTH]; MION],
|
||
dusmt: vec![vec![0.0; MDEPTH]; MION],
|
||
dusmn: vec![vec![0.0; MDEPTH]; MION],
|
||
diesig: vec![vec![0.0; MDEPTH]; MION],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// WMCOMP - 氢能级权重和占据概率
|
||
// ============================================================================
|
||
|
||
/// 氢能级权重和占据概率。
|
||
/// 对应 COMMON /WMCOMP/
|
||
#[derive(Debug, Clone)]
|
||
pub struct WmComp {
|
||
/// 氢能级占据概率积分 (NLMX × 深度)
|
||
pub wnhint: Vec<Vec<f64>>,
|
||
/// He II 能级占据概率 (NLMX × 深度)
|
||
pub wnheii: Vec<Vec<f64>>,
|
||
/// 能级权重 (能级 × 深度)
|
||
pub wop: Vec<Vec<f64>>,
|
||
/// 能级权重标志 (负值表示合并能级)
|
||
pub ifwop: Vec<i32>,
|
||
}
|
||
|
||
impl Default for WmComp {
|
||
fn default() -> Self {
|
||
Self {
|
||
wnhint: vec![vec![0.0; MDEPTH]; NLMX],
|
||
wnheii: vec![vec![0.0; MDEPTH]; NLMX],
|
||
wop: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
ifwop: vec![0; MLEVEL],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// MRGPAR - 合并能级参数
|
||
// ============================================================================
|
||
|
||
/// 合并能级参数 (用于高激发态氢能级合并处理)。
|
||
/// 对应 COMMON /MRGPAR/
|
||
#[derive(Debug, Clone)]
|
||
pub struct MrgPar {
|
||
/// 合并能级截面参数 (MMER)
|
||
pub sgm0: Vec<f64>,
|
||
/// 频率参考 FRCH (MMER)
|
||
pub frch: Vec<f64>,
|
||
/// 截面扩展 (MMER × 深度)
|
||
pub sgext1: Vec<Vec<f64>>,
|
||
/// Gaunt 因子 (MMER × 深度)
|
||
pub gmer: Vec<Vec<f64>>,
|
||
/// 截面求和 (NLMX × MMER × 深度) - 3D 数组
|
||
pub sgmsum: Vec<Vec<Vec<f64>>>,
|
||
/// 截面求和导数 (NLMX × MMER × 深度) - 3D 数组
|
||
pub sgmsud: Vec<Vec<Vec<f64>>>,
|
||
/// Gaunt 因子 (MMER × 深度)
|
||
pub sgmg: Vec<Vec<f64>>,
|
||
/// 能级到合并能级的映射 (MLEVEL)
|
||
pub imrg: Vec<i32>,
|
||
/// 合并能级到能级的映射 (MMER)
|
||
pub iimer: Vec<i32>,
|
||
}
|
||
|
||
impl Default for MrgPar {
|
||
fn default() -> Self {
|
||
Self {
|
||
sgm0: vec![0.0; MMER],
|
||
frch: vec![0.0; MMER],
|
||
sgext1: vec![vec![0.0; MDEPTH]; MMER],
|
||
gmer: vec![vec![0.0; MDEPTH]; MMER],
|
||
// 3D 数组: [nlmx][mmer][depth]
|
||
sgmsum: vec![vec![vec![0.0; MDEPTH]; MMER]; NLMX],
|
||
sgmsud: vec![vec![vec![0.0; MDEPTH]; MMER]; NLMX],
|
||
sgmg: vec![vec![0.0; MDEPTH]; MMER],
|
||
imrg: vec![0; MLEVEL],
|
||
iimer: vec![0; MMER],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// FREAUX - 频率辅助数组
|
||
// ============================================================================
|
||
|
||
/// 频率辅助数组。
|
||
/// 对应 COMMON /FREAUX/
|
||
#[derive(Debug, Clone)]
|
||
pub struct FreAux {
|
||
/// Wien 定律系数 W0E = h*nu/kT 在阈值处
|
||
pub w0e: Vec<f64>,
|
||
/// Planck 函数系数 BNUE = 2h*nu³/c²
|
||
pub bnue: Vec<f64>,
|
||
/// 连续谱权重
|
||
pub wc: Vec<f64>,
|
||
/// 跃迁到连续谱的索引
|
||
pub ijtc: Vec<i32>,
|
||
/// ALI 频率索引
|
||
pub ijali: Vec<i32>,
|
||
/// 显式频率索引
|
||
pub ijex: Vec<i32>,
|
||
/// 频率索引
|
||
pub ijfr: Vec<i32>,
|
||
}
|
||
|
||
impl Default for FreAux {
|
||
fn default() -> Self {
|
||
Self {
|
||
w0e: vec![0.0; MFREQ],
|
||
bnue: vec![0.0; MFREQ],
|
||
wc: vec![0.0; MFREQ],
|
||
ijtc: vec![0; MTRANS],
|
||
ijali: vec![0; MFREQ],
|
||
ijex: vec![0; MFREQ],
|
||
ijfr: vec![0; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
// ============================================================================
|
||
// REPART - 辐射等效扩散参数
|
||
// ============================================================================
|
||
|
||
/// 辐射等效扩散参数。
|
||
/// 对应 COMMON /REPART/
|
||
#[derive(Debug, Clone)]
|
||
pub struct RePart {
|
||
/// 辐射等效积分
|
||
pub reint: Vec<f64>,
|
||
/// 辐射扩散因子
|
||
pub redif: Vec<f64>,
|
||
/// τ 分割点
|
||
pub taudiv: f64,
|
||
/// 最后深度索引
|
||
pub idlst: i32,
|
||
}
|
||
|
||
impl Default for RePart {
|
||
fn default() -> Self {
|
||
Self {
|
||
reint: vec![0.0; MDEPTH],
|
||
redif: vec![0.0; MDEPTH],
|
||
taudiv: 0.0,
|
||
idlst: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// TURBUL - 湍流速度
|
||
// ============================================================================
|
||
|
||
/// 湍流速度参数。
|
||
/// 对应 COMMON /TURBUL/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Turbul {
|
||
/// 湍流速度 VTURB(MDEPTH)
|
||
pub vturb: Vec<f64>,
|
||
/// 湍流速度平方 VTURBS(MDEPTH)
|
||
pub vturbs: Vec<f64>,
|
||
/// 湍流速度参数
|
||
pub vtb: f64,
|
||
/// 湍流标志
|
||
pub ipturb: i32,
|
||
}
|
||
|
||
impl Default for Turbul {
|
||
fn default() -> Self {
|
||
Self {
|
||
vturb: vec![0.0; MDEPTH],
|
||
vturbs: vec![0.0; MDEPTH],
|
||
vtb: 0.0,
|
||
ipturb: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// STRAUX - Stark 轮廓辅助变量
|
||
// ============================================================================
|
||
|
||
/// Stark 轮廓辅助变量。
|
||
/// 对应 COMMON /STRAUX/
|
||
#[derive(Debug, Clone)]
|
||
pub struct StrAux {
|
||
/// 谱线展宽参数
|
||
pub xk0: Vec<f64>,
|
||
/// 当前谱线展宽
|
||
pub xk: f64,
|
||
/// Doppler 展宽
|
||
pub dbeta: f64,
|
||
/// Doppler 宽度
|
||
pub betad: f64,
|
||
/// 辅助参数 A
|
||
pub adh: f64,
|
||
/// 分割点
|
||
pub divh: f64,
|
||
}
|
||
|
||
impl Default for StrAux {
|
||
fn default() -> Self {
|
||
Self {
|
||
xk0: vec![0.0; MLINH],
|
||
xk: 0.0,
|
||
dbeta: 0.0,
|
||
betad: 0.0,
|
||
adh: 0.0,
|
||
divh: 0.0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// PRESSR - 压力相关数组
|
||
// ============================================================================
|
||
|
||
/// 压力相关数组。
|
||
/// 对应 COMMON /PRESSR/
|
||
#[derive(Debug, Clone)]
|
||
pub struct PressR {
|
||
/// 总压力
|
||
pub ptotal: Vec<f64>,
|
||
/// 气体压力
|
||
pub pgs: Vec<f64>,
|
||
/// 辐射压力 (总)
|
||
pub pradt: Vec<f64>,
|
||
/// 辐射压力 (吸收)
|
||
pub prada: Vec<f64>,
|
||
}
|
||
|
||
impl Default for PressR {
|
||
fn default() -> Self {
|
||
Self {
|
||
ptotal: vec![0.0; MDEPTH],
|
||
pgs: vec![0.0; MDEPTH],
|
||
pradt: vec![0.0; MDEPTH],
|
||
prada: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// DWNPAR - 溶解分数参数
|
||
// ============================================================================
|
||
|
||
/// 溶解分数辅助参数。
|
||
/// 对应 COMMON /DWNPAR/
|
||
#[derive(Debug, Clone)]
|
||
pub struct DwnPar {
|
||
/// 电子密度的 2/3 次幂
|
||
pub elec23: Vec<f64>,
|
||
/// 修正因子
|
||
pub acor: Vec<f64>,
|
||
/// Z³ (Z = 1..MZZ)
|
||
pub z3: Vec<f64>,
|
||
/// 溶解分数参数 1
|
||
pub dwc1: Vec<Vec<f64>>,
|
||
/// 溶解分数参数 2
|
||
pub dwc2: Vec<f64>,
|
||
/// 溶解分数 (MMCDW × MDEPTH)
|
||
pub dwf1: Vec<Vec<f64>>,
|
||
/// 跃迁到溶解分数的映射 (MTRANS)
|
||
pub mcdw: Vec<i32>,
|
||
/// 溶解分数到跃迁的映射 (MMCDW)
|
||
pub itrcdw: Vec<i32>,
|
||
/// 溶解分数计数
|
||
pub ncdw: i32,
|
||
}
|
||
|
||
impl Default for DwnPar {
|
||
fn default() -> Self {
|
||
Self {
|
||
elec23: vec![0.0; MDEPTH],
|
||
acor: vec![0.0; MDEPTH],
|
||
z3: vec![0.0; MZZ],
|
||
dwc1: vec![vec![0.0; MDEPTH]; MZZ],
|
||
dwc2: vec![0.0; MDEPTH],
|
||
dwf1: vec![vec![0.0; MDEPTH]; MMCDW],
|
||
mcdw: vec![0; MTRANS],
|
||
itrcdw: vec![0; MMCDW],
|
||
ncdw: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// LINOVR - 谱线叠加
|
||
// ============================================================================
|
||
|
||
/// 谱线叠加参数。
|
||
/// 对应 COMMON /LINOVR/
|
||
#[derive(Debug, Clone)]
|
||
pub struct LinOvr {
|
||
/// 每个频率点的谱线数
|
||
pub nitj: Vec<i32>,
|
||
/// 每个频率点的跃迁索引
|
||
pub ijlin: Vec<i32>,
|
||
/// 谱线跃迁索引 (MITJ × MFREQ)
|
||
pub itrlin: Vec<Vec<i32>>,
|
||
}
|
||
|
||
impl Default for LinOvr {
|
||
fn default() -> Self {
|
||
Self {
|
||
nitj: vec![0; MFREQ],
|
||
ijlin: vec![0; MFREQ],
|
||
itrlin: vec![vec![0; MFREQ]; MITJ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// LINFRQ - 谱线频率
|
||
// ============================================================================
|
||
|
||
/// 谱线频率参数。
|
||
/// 对应 COMMON /LINFRQ/
|
||
#[derive(Debug, Clone)]
|
||
pub struct LinFrq {
|
||
/// 每个频率点的谱线数
|
||
pub nlines: Vec<i32>,
|
||
}
|
||
|
||
impl Default for LinFrq {
|
||
fn default() -> Self {
|
||
Self {
|
||
nlines: vec![0; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// COMPIF - 计算标志
|
||
// ============================================================================
|
||
|
||
/// 计算标志参数。
|
||
/// 对应 COMMON /COMPIF/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CompIf {
|
||
/// 经验线标志 (MTRANS)
|
||
pub linexp: Vec<bool>,
|
||
}
|
||
|
||
impl Default for CompIf {
|
||
fn default() -> Self {
|
||
Self {
|
||
linexp: vec![false; MTRANS],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// CUROPA - 当前不透明度
|
||
// ============================================================================
|
||
|
||
/// 当前不透明度参数。
|
||
/// 对应 COMMON /CUROPA/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CurOpa {
|
||
/// 吸收系数
|
||
pub abso1: Vec<f64>,
|
||
/// 发射系数
|
||
pub emis1: Vec<f64>,
|
||
/// 散射系数
|
||
pub scat1: Vec<f64>,
|
||
/// 总吸收
|
||
pub absot: Vec<f64>,
|
||
/// 显式频率吸收
|
||
pub absoe1: Vec<f64>,
|
||
/// 电子发射
|
||
pub emel1: Vec<f64>,
|
||
/// 谱线吸收
|
||
pub abso1l: Vec<f64>,
|
||
/// 谱线发射
|
||
pub emis1l: Vec<f64>,
|
||
/// 不透明度导数 (压力)
|
||
pub absopr: Vec<f64>,
|
||
/// 发射导数 (压力)
|
||
pub emispr: Vec<f64>,
|
||
}
|
||
|
||
impl Default for CurOpa {
|
||
fn default() -> Self {
|
||
Self {
|
||
abso1: vec![0.0; MDEPTH],
|
||
emis1: vec![0.0; MDEPTH],
|
||
scat1: vec![0.0; MDEPTH],
|
||
absot: vec![0.0; MDEPTH],
|
||
absoe1: vec![0.0; MFREX],
|
||
emel1: vec![0.0; MDEPTH],
|
||
abso1l: vec![0.0; MDEPTH],
|
||
emis1l: vec![0.0; MDEPTH],
|
||
absopr: vec![0.0; MDEPTH],
|
||
emispr: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// 氢线 Stark 展宽表格 (HYDPRF)
|
||
// ============================================================================
|
||
|
||
/// 氢线 Stark 展宽表格参数。
|
||
/// 对应 COMMON /HYDPRF/
|
||
#[derive(Debug, Clone)]
|
||
pub struct HydPrf {
|
||
/// 氢线轮廓 PRFHYD(MLINH,MHWL,MHT,MHE)
|
||
/// 注意:Fortran 是列优先,这里用 1D 数组模拟 4D
|
||
/// 索引:prfhyd[iline + mlinh*iwl + mlinh*mhwl*it + mlinh*mhwl*mht*ie]
|
||
pub prfhyd: Vec<f64>,
|
||
/// 氢线波长 WLHYD(MLINH,MHWL)
|
||
pub wlhyd: Vec<f64>,
|
||
/// 波长网格 WLH(MHWL,MLINH)
|
||
pub wlh: Vec<f64>,
|
||
/// 温度网格 XTLEM(MHT,MLINH)
|
||
pub xtlem: Vec<f64>,
|
||
/// 电子密度网格 XNELEM(MHE,MLINH)
|
||
pub xnelem: Vec<f64>,
|
||
/// 每条线的波长点数 NWLHYD(MLINH)
|
||
pub nwlhyd: Vec<i32>,
|
||
/// 波长点数 NWLH(MLINH)
|
||
pub nwlh: Vec<i32>,
|
||
/// 温度点数 NTH(MLINH)
|
||
pub nth: Vec<i32>,
|
||
/// 电子密度点数 NEH(MLINH)
|
||
pub neh: Vec<i32>,
|
||
/// 线索引 ILINH(4,22)
|
||
pub ilinh: Vec<i32>,
|
||
/// 氢线表格读取标志
|
||
pub ihydpr: i32,
|
||
}
|
||
|
||
impl Default for HydPrf {
|
||
fn default() -> Self {
|
||
use super::constants::{MHT, MHE, MHWL, MLINH};
|
||
Self {
|
||
// PRFHYD: MLINH * MHWL * MHT * MHE = 78 * 90 * 7 * 20 = 982,800
|
||
prfhyd: vec![0.0; MLINH * MHWL * MHT * MHE],
|
||
// WLHYD: MLINH * MHWL = 78 * 90 = 7,020
|
||
wlhyd: vec![0.0; MLINH * MHWL],
|
||
// WLH: MHWL * MLINH = 90 * 78 = 7,020
|
||
wlh: vec![0.0; MHWL * MLINH],
|
||
// XTLEM: MHT * MLINH = 7 * 78 = 546
|
||
xtlem: vec![0.0; MHT * MLINH],
|
||
// XNELEM: MHE * MLINH = 20 * 78 = 1,560
|
||
xnelem: vec![0.0; MHE * MLINH],
|
||
nwlhyd: vec![0; MLINH],
|
||
nwlh: vec![0; MLINH],
|
||
nth: vec![0; MLINH],
|
||
neh: vec![0; MLINH],
|
||
// ILINH: 4 * 22 = 88
|
||
ilinh: vec![0; 88],
|
||
ihydpr: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
impl HydPrf {
|
||
/// 获取 PRFHYD 值 (4D 数组访问)
|
||
///
|
||
/// # 参数
|
||
/// - `iline`: 谱线索引 (0-indexed)
|
||
/// - `iwl`: 波长索引 (0-indexed)
|
||
/// - `it`: 温度索引 (0-indexed)
|
||
/// - `ie`: 电子密度索引 (0-indexed)
|
||
pub fn get_prfhyd(&self, iline: usize, iwl: usize, it: usize, ie: usize) -> f64 {
|
||
use super::constants::{MHT, MHWL, MLINH};
|
||
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
|
||
self.prfhyd[idx]
|
||
}
|
||
|
||
/// 设置 PRFHYD 值 (4D 数组访问)
|
||
pub fn set_prfhyd(&mut self, iline: usize, iwl: usize, it: usize, ie: usize, value: f64) {
|
||
use super::constants::{MHT, MHWL, MLINH};
|
||
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
|
||
self.prfhyd[idx] = value;
|
||
}
|
||
|
||
/// 获取 WLHYD 值 (2D 数组访问)
|
||
pub fn get_wlhyd(&self, iline: usize, iwl: usize) -> f64 {
|
||
use super::constants::MLINH;
|
||
self.wlhyd[iline + MLINH * iwl]
|
||
}
|
||
|
||
/// 获取 WLH 值 (2D 数组访问,注意 Fortran 索引顺序)
|
||
/// Fortran: WLH(MHWL,MLINH) -> Rust: wlh[iwl + MHWL*iline]
|
||
pub fn get_wlh(&self, iwl: usize, iline: usize) -> f64 {
|
||
use super::constants::MHWL;
|
||
self.wlh[iwl + MHWL * iline]
|
||
}
|
||
|
||
/// 获取 XTLEM 值 (2D 数组访问)
|
||
/// Fortran: XTLEM(MHT,MLINH) -> Rust: xtlem[it + MHT*iline]
|
||
pub fn get_xtlem(&self, it: usize, iline: usize) -> f64 {
|
||
use super::constants::MHT;
|
||
self.xtlem[it + MHT * iline]
|
||
}
|
||
|
||
/// 获取 XNELEM 值 (2D 数组访问)
|
||
/// Fortran: XNELEM(MHE,MLINH) -> Rust: xnelem[ie + MHE*iline]
|
||
pub fn get_xnelem(&self, ie: usize, iline: usize) -> f64 {
|
||
use super::constants::MHE;
|
||
self.xnelem[ie + MHE * iline]
|
||
}
|
||
|
||
/// 设置 XTLEM 值 (2D 数组访问)
|
||
pub fn set_xtlem(&mut self, it: usize, iline: usize, value: f64) {
|
||
use super::constants::MHT;
|
||
self.xtlem[it + MHT * iline] = value;
|
||
}
|
||
|
||
/// 设置 XNELEM 值 (2D 数组访问)
|
||
pub fn set_xnelem(&mut self, ie: usize, iline: usize, value: f64) {
|
||
use super::constants::MHE;
|
||
self.xnelem[ie + MHE * iline] = value;
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// XENPRF - Xenomorph 谱线轮廓表
|
||
// ============================================================================
|
||
|
||
/// Xenomorph 氢线轮廓表。
|
||
/// 对应 COMMON /XENPRF/
|
||
#[derive(Debug, Clone)]
|
||
pub struct XenPrf {
|
||
/// 轮廓表 PRFXB(MLINH,MHWL,MHT,MHE) - 蓝翼
|
||
pub prfxb: Vec<f64>,
|
||
/// 轮廓表 PRFXR(MLINH,MHWL,MHT,MHE) - 红翼
|
||
pub prfxr: Vec<f64>,
|
||
/// 波长表 ALXEN(MLINH,MHWL)
|
||
pub alxen: Vec<f64>,
|
||
/// 温度网格 XTXEN(MHT,MLINH)
|
||
pub xtxen: Vec<f64>,
|
||
/// 电子密度网格 XNEXEN(MHE,MLINH)
|
||
pub xnexen: Vec<f64>,
|
||
/// 电子密度最小值
|
||
pub xnemin: f64,
|
||
/// 每条线的波长点数 NWLXEN(MLINH)
|
||
pub nwlxen: Vec<i32>,
|
||
/// 每条线的温度点数 NTHXEN(MLINH)
|
||
pub nthxen: Vec<i32>,
|
||
/// 每条线的电子密度点数 NEHXEN(MLINH)
|
||
pub nehxen: Vec<i32>,
|
||
/// 线索引 ILXEN(4,22)
|
||
pub ilxen: Vec<i32>,
|
||
/// 氢线标志
|
||
pub ihxenb: i32,
|
||
}
|
||
|
||
impl Default for XenPrf {
|
||
fn default() -> Self {
|
||
use super::constants::{MHT, MHE, MHWL, MLINH};
|
||
Self {
|
||
// PRFXB, PRFXR: MLINH * MHWL * MHT * MHE = 78 * 90 * 7 * 20 = 982,800
|
||
prfxb: vec![0.0; MLINH * MHWL * MHT * MHE],
|
||
prfxr: vec![0.0; MLINH * MHWL * MHT * MHE],
|
||
// ALXEN: MLINH * MHWL = 78 * 90 = 7,020
|
||
alxen: vec![0.0; MLINH * MHWL],
|
||
// XTXEN: MHT * MLINH = 7 * 78 = 546
|
||
xtxen: vec![0.0; MHT * MLINH],
|
||
// XNEXEN: MHE * MLINH = 20 * 78 = 1,560
|
||
xnexen: vec![0.0; MHE * MLINH],
|
||
xnemin: 0.0,
|
||
nwlxen: vec![0; MLINH],
|
||
nthxen: vec![0; MLINH],
|
||
nehxen: vec![0; MLINH],
|
||
// ILXEN: 4 * 22 = 88
|
||
ilxen: vec![0; 88],
|
||
ihxenb: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
impl XenPrf {
|
||
/// 获取 PRFXB 值 (4D 数组访问)
|
||
pub fn get_prfxb(&self, iline: usize, iwl: usize, it: usize, ie: usize) -> f64 {
|
||
use super::constants::{MHT, MHWL, MLINH};
|
||
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
|
||
self.prfxb[idx]
|
||
}
|
||
|
||
/// 设置 PRFXB 值 (4D 数组访问)
|
||
pub fn set_prfxb(&mut self, iline: usize, iwl: usize, it: usize, ie: usize, value: f64) {
|
||
use super::constants::{MHT, MHWL, MLINH};
|
||
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
|
||
self.prfxb[idx] = value;
|
||
}
|
||
|
||
/// 获取 PRFXR 值 (4D 数组访问)
|
||
pub fn get_prfxr(&self, iline: usize, iwl: usize, it: usize, ie: usize) -> f64 {
|
||
use super::constants::{MHT, MHWL, MLINH};
|
||
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
|
||
self.prfxr[idx]
|
||
}
|
||
|
||
/// 设置 PRFXR 值 (4D 数组访问)
|
||
pub fn set_prfxr(&mut self, iline: usize, iwl: usize, it: usize, ie: usize, value: f64) {
|
||
use super::constants::{MHT, MHWL, MLINH};
|
||
let idx = iline + MLINH * iwl + MLINH * MHWL * it + MLINH * MHWL * MHT * ie;
|
||
self.prfxr[idx] = value;
|
||
}
|
||
|
||
/// 获取 XTXEN 值 (温度网格, 2D)
|
||
pub fn get_xtxen(&self, it: usize, iline: usize) -> f64 {
|
||
use super::constants::MHT;
|
||
self.xtxen[it + MHT * iline]
|
||
}
|
||
|
||
/// 获取 XNEXEN 值 (电子密度网格, 2D)
|
||
pub fn get_xnexen(&self, ie: usize, iline: usize) -> f64 {
|
||
use super::constants::MHE;
|
||
self.xnexen[ie + MHE * iline]
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// RAYSCT - Rayleigh 散射截面
|
||
// ============================================================================
|
||
|
||
/// Rayleigh 散射截面参数。
|
||
/// 对应 COMMON /RAYSCT/
|
||
#[derive(Debug, Clone)]
|
||
pub struct RaySct {
|
||
/// 氢 Rayleigh 散射截面 (MFREQ)
|
||
pub rcs: Vec<f64>,
|
||
/// 氦 Rayleigh 散射截面 (MFREQ)
|
||
pub rche: Vec<f64>,
|
||
/// H2 Rayleigh 散射截面 (MFREQ)
|
||
pub rch2: Vec<f64>,
|
||
}
|
||
|
||
impl Default for RaySct {
|
||
fn default() -> Self {
|
||
Self {
|
||
rcs: vec![0.0; MFREQ],
|
||
rche: vec![0.0; MFREQ],
|
||
rch2: vec![0.0; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// EOSPAR - 状态方程粒子数密度
|
||
// ============================================================================
|
||
|
||
/// 状态方程粒子数密度参数。
|
||
/// 对应 COMMON /eospar/
|
||
#[derive(Debug, Clone)]
|
||
pub struct EosPar {
|
||
/// 分子粒子数密度 (600 × MDEPTH)
|
||
pub anmol: Vec<Vec<f64>>,
|
||
/// 原子粒子数密度 (100 × MDEPTH)
|
||
pub anato: Vec<Vec<f64>>,
|
||
/// 离子粒子数密度 (100 × MDEPTH)
|
||
pub anion: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for EosPar {
|
||
fn default() -> Self {
|
||
Self {
|
||
anmol: vec![vec![0.0; MDEPTH]; 600],
|
||
anato: vec![vec![0.0; MDEPTH]; 100],
|
||
anion: vec![vec![0.0; MDEPTH]; 100],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// SURFAC - 表面辐射通量
|
||
// ============================================================================
|
||
|
||
/// 表面辐射通量参数。
|
||
/// 对应 COMMON /SURFAC/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Surfac {
|
||
/// 表面辐射通量 (MFREQ)
|
||
pub flux: Vec<f64>,
|
||
/// 频率相关权重因子 (MFREQ)
|
||
pub fh: Vec<f64>,
|
||
/// 表面辐射强度 Q0 (MFREQ)
|
||
pub q0: Vec<f64>,
|
||
/// 表面辐射强度 UU0 (MFREQ)
|
||
pub uu0: Vec<f64>,
|
||
}
|
||
|
||
impl Default for Surfac {
|
||
fn default() -> Self {
|
||
Self {
|
||
flux: vec![0.0; MFREQ],
|
||
fh: vec![0.0; MFREQ],
|
||
q0: vec![0.0; MFREQ],
|
||
uu0: vec![0.0; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// CURRNT - 当前深度辐射参数
|
||
// ============================================================================
|
||
|
||
/// 当前深度辐射参数。
|
||
/// 对应 COMMON /CURRNT/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Currnt {
|
||
/// 普朗克函数权重 (MDEPTH)
|
||
pub xkf: Vec<f64>,
|
||
/// 1 - XKF (MDEPTH)
|
||
pub xkf1: Vec<f64>,
|
||
/// 普朗克函数 × XKF (MDEPTH)
|
||
pub xkfb: Vec<f64>,
|
||
}
|
||
|
||
impl Default for Currnt {
|
||
fn default() -> Self {
|
||
Self {
|
||
xkf: vec![0.0; MDEPTH],
|
||
xkf1: vec![0.0; MDEPTH],
|
||
xkfb: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// TOTFLX - 总辐射通量
|
||
// ============================================================================
|
||
|
||
/// 总辐射通量参数。
|
||
/// 对应 COMMON /TOTFLX/
|
||
#[derive(Debug, Clone)]
|
||
pub struct TotFlx {
|
||
/// 总辐射通量 (MDEPTH)
|
||
pub fltot: Vec<f64>,
|
||
/// 固定辐射通量 (MDEPTH)
|
||
pub flfix: Vec<f64>,
|
||
/// 显式频率辐射通量 (MDEPTH)
|
||
pub flexp: Vec<f64>,
|
||
/// 冷却率 (MDEPTH)
|
||
pub fcool: Vec<f64>,
|
||
/// 冷却率积分 (MDEPTH)
|
||
pub fcooli: Vec<f64>,
|
||
/// 辐射通量红翼 (MDEPTH)
|
||
pub flrd: Vec<f64>,
|
||
/// 辐射压力 (MDEPTH)
|
||
pub fprad: Vec<f64>,
|
||
/// 辐射梯度 (MDEPTH)
|
||
pub grad: Vec<f64>,
|
||
/// 辐射压力导数 (MDEPTH)
|
||
pub fprd: Vec<f64>,
|
||
/// 频率相关辐射梯度 (MFREQ × MDEPTH)
|
||
pub gradf: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for TotFlx {
|
||
fn default() -> Self {
|
||
Self {
|
||
fltot: vec![0.0; MDEPTH],
|
||
flfix: vec![0.0; MDEPTH],
|
||
flexp: vec![0.0; MDEPTH],
|
||
fcool: vec![0.0; MDEPTH],
|
||
fcooli: vec![0.0; MDEPTH],
|
||
flrd: vec![0.0; MDEPTH],
|
||
fprad: vec![0.0; MDEPTH],
|
||
grad: vec![0.0; MDEPTH],
|
||
fprd: vec![0.0; MDEPTH],
|
||
gradf: vec![vec![0.0; MDEPTH]; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// POPZR0 - 零占据数参数
|
||
// ============================================================================
|
||
|
||
/// 零占据数参数。
|
||
/// 对应 COMMON /POPZR0/
|
||
#[derive(Debug, Clone)]
|
||
pub struct PopZr0 {
|
||
/// 零占据数阈值
|
||
pub popzer: f64,
|
||
/// 零占据数阈值 2
|
||
pub popzr2: f64,
|
||
/// 占据数变化阈值
|
||
pub popzch: f64,
|
||
/// 相对占据数初始值 [MLVEXP × MDEPTH]
|
||
pub rpop0: Vec<Vec<f64>>,
|
||
/// 零占据数标志 [MLEVEL × MDEPTH]
|
||
pub ipzero: Vec<Vec<i32>>,
|
||
/// 能级组零占据标志 [MLVEXP × MDEPTH]
|
||
pub igzero: Vec<Vec<i32>>,
|
||
}
|
||
|
||
impl Default for PopZr0 {
|
||
fn default() -> Self {
|
||
Self {
|
||
popzer: 1e-30,
|
||
popzr2: 1e-15,
|
||
popzch: 1e-3,
|
||
rpop0: vec![vec![0.0; MDEPTH]; MLVEXP],
|
||
ipzero: vec![vec![0; MDEPTH]; MLEVEL],
|
||
igzero: vec![vec![0; MDEPTH]; MLVEXP],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// LEVREF - 能级参考参数
|
||
// ============================================================================
|
||
|
||
/// 能级参考参数。
|
||
/// 对应 COMMON /LEVREF/
|
||
#[derive(Debug, Clone)]
|
||
pub struct LevRef {
|
||
/// 相对占据数 [MLEVEL × MDEPTH]
|
||
pub sbpsi: Vec<Vec<f64>>,
|
||
/// 线性化相对占据数 [MLEVEL × MDEPTH]
|
||
pub sblpsi: Vec<Vec<f64>>,
|
||
/// 相对占据数温度导数 [MLEVEL × MDEPTH]
|
||
pub dsbpst: Vec<Vec<f64>>,
|
||
/// 相对占据数电子密度导数 [MLEVEL × MDEPTH]
|
||
pub dsbpsn: Vec<Vec<f64>>,
|
||
/// LTE 参考标志 [MLEVEL × MDEPTH]
|
||
pub iltref: Vec<Vec<i32>>,
|
||
/// 真实 LTE 参考标志 [MLEVEL × MDEPTH]
|
||
pub ilterf: Vec<Vec<i32>>,
|
||
/// 引导能级索引 [MLEVEL]
|
||
pub iguide: Vec<i32>,
|
||
}
|
||
|
||
impl Default for LevRef {
|
||
fn default() -> Self {
|
||
Self {
|
||
sbpsi: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
sblpsi: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
dsbpst: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
dsbpsn: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
iltref: vec![vec![0; MDEPTH]; MLEVEL],
|
||
ilterf: vec![vec![0; MDEPTH]; MLEVEL],
|
||
iguide: vec![0; MLEVEL],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// GOMEZ - Gomez 氢不透明度表
|
||
// ============================================================================
|
||
|
||
/// Gomez 氢不透明度表数据。
|
||
/// 对应 COMMON /TABHYG/, /TABLOH/, /NUMGOPAC/, /VECTORG/, /OPACITIEG/
|
||
#[derive(Debug, Clone)]
|
||
pub struct GomezTab {
|
||
/// 氢 Gomez 表电子密度限制
|
||
pub hglim: f64,
|
||
/// 氢 Gomez 表标志 (0=禁用)
|
||
pub ihgom: i32,
|
||
|
||
/// 频率表边界 log10
|
||
pub frgtb1: f64,
|
||
pub frgtb2: f64,
|
||
/// 电子密度表边界 (ln)
|
||
pub egtab1: f64,
|
||
pub egtab2: f64,
|
||
/// 温度表边界 (ln)
|
||
pub tgtab1: f64,
|
||
pub tgtab2: f64,
|
||
|
||
/// Gomez 表频率数、温度数、电子密度数
|
||
pub nugfreq: i32,
|
||
pub nugtemp: i32,
|
||
pub nugele: i32,
|
||
|
||
/// 温度向量 (ln) [MTABTH]
|
||
pub temvec: Vec<f64>,
|
||
/// 电子密度向量 (ln) [MTABEH]
|
||
pub elevec: Vec<f64>,
|
||
|
||
/// 频率表 [MFHTAB]
|
||
pub frgtab: Vec<f64>,
|
||
/// 氢截面表 (温度 × 电子密度 × 频率) [MTABTH × MTABEH × MFHTAB]
|
||
pub hydcrs: Vec<Vec<Vec<f64>>>,
|
||
}
|
||
|
||
impl Default for GomezTab {
|
||
fn default() -> Self {
|
||
Self {
|
||
hglim: 0.0,
|
||
ihgom: 0,
|
||
frgtb1: 0.0,
|
||
frgtb2: 0.0,
|
||
egtab1: 0.0,
|
||
egtab2: 0.0,
|
||
tgtab1: 0.0,
|
||
tgtab2: 0.0,
|
||
nugfreq: 0,
|
||
nugtemp: 0,
|
||
nugele: 0,
|
||
temvec: vec![0.0; MTABTH],
|
||
elevec: vec![0.0; MTABEH],
|
||
frgtab: vec![0.0; MFHTAB],
|
||
hydcrs: vec![vec![vec![0.0; MFHTAB]; MTABEH]; MTABTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// INTCFG - 插值配置
|
||
// ============================================================================
|
||
|
||
/// 频率插值配置。
|
||
/// 对应 COMMON /INTCFG/
|
||
#[derive(Debug, Clone)]
|
||
pub struct IntCfg {
|
||
/// 频率插值系数 [MFREQ]
|
||
pub yint: Vec<f64>,
|
||
/// 频率插值索引 [MFREQ]
|
||
pub jgint: Vec<i32>,
|
||
}
|
||
|
||
impl Default for IntCfg {
|
||
fn default() -> Self {
|
||
Self {
|
||
yint: vec![0.0; MFREQ],
|
||
jgint: vec![0; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// 综合模型状态
|
||
// ============================================================================
|
||
|
||
/// TLUSTY 大气模型状态。
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct ModelState {
|
||
pub modpar: ModPar,
|
||
pub levpop: LevPop,
|
||
pub populs: PopulS,
|
||
pub gffpar: GffPar,
|
||
pub totrad: TotRad,
|
||
pub currad: CurRad,
|
||
pub frqall: FrqAll,
|
||
pub totprf: TotPrf,
|
||
pub phoexp: PhoExp,
|
||
pub obfpar: ObfPar,
|
||
pub levadd: LevAdd,
|
||
pub wmcomp: WmComp,
|
||
pub mrgpar: MrgPar,
|
||
pub freaux: FreAux,
|
||
pub repart: RePart,
|
||
pub turbul: Turbul,
|
||
pub straux: StrAux,
|
||
pub pressr: PressR,
|
||
pub dwnpar: DwnPar,
|
||
pub linovr: LinOvr,
|
||
pub linfrq: LinFrq,
|
||
pub compif: CompIf,
|
||
pub curopa: CurOpa,
|
||
pub hydprf: HydPrf,
|
||
pub xenprf: XenPrf,
|
||
pub raysct: RaySct,
|
||
pub eospar: EosPar,
|
||
pub surfac: Surfac,
|
||
pub currnt: Currnt,
|
||
pub totflx: TotFlx,
|
||
pub popzr0: PopZr0,
|
||
pub levref: LevRef,
|
||
pub gomez: GomezTab,
|
||
pub intcfg: IntCfg,
|
||
pub heqaux: HeqAux,
|
||
pub prsaux: PrsAux,
|
||
pub grdpra: GrdPra,
|
||
pub ifpzpa: IfPzPa,
|
||
pub expraf: ExpRaf,
|
||
pub crswps: CrswPs,
|
||
pub rrrates: RrRates,
|
||
pub crates: CraTes,
|
||
pub frqint: FrqInt,
|
||
pub files: Files,
|
||
pub opmean: OpMean,
|
||
pub charfx: CharFx,
|
||
pub windbl: WindBl,
|
||
pub dfeali: DfeAli,
|
||
pub opacad: OpacAd,
|
||
pub modcon: ModCon,
|
||
pub resder: ResDer,
|
||
pub grayts: GrayTs,
|
||
pub taurss: TaurSs,
|
||
pub tconst: TConst,
|
||
pub hydadd: HydAdd,
|
||
pub eldnsp: EldNsp,
|
||
pub rrvals: RrVals,
|
||
pub abntab: AbnTab,
|
||
pub relcor: RelCor,
|
||
pub statep: StateP,
|
||
pub odfcht: OdfCht,
|
||
pub stdpar: StdPar,
|
||
pub ltegrp: LteGrp,
|
||
pub comptf: CompTf,
|
||
pub comgfs: ComGfs,
|
||
pub vispar: VisPar,
|
||
pub tablop: TabLop,
|
||
pub numbopac: NumbOpac,
|
||
pub vectors: Vectors,
|
||
pub opacities: Opacities,
|
||
pub raytbl: RayTbl,
|
||
pub binopa: BinOpa,
|
||
pub tabhyg: TabHyg,
|
||
pub tabloh: TabLoh,
|
||
pub numgopac: NumGOpac,
|
||
pub vectorg: VectorG,
|
||
pub opacitieg: OpacitieG,
|
||
pub curtri: CurTri,
|
||
pub auxrte: AuxRte,
|
||
pub auxcbc: AuxCbc,
|
||
pub optdpt: OptDpt,
|
||
pub topb: TopB,
|
||
pub quasun: Quasun,
|
||
pub callarda: CallardA,
|
||
pub callardb: CallardB,
|
||
pub callardg: CallardG,
|
||
pub callardc: CallardC,
|
||
pub calphatd: CalphatD,
|
||
pub hediff: Hediff,
|
||
}
|
||
|
||
|
||
// ============================================================================
|
||
// HEQAUX - He 丰度辅助参数
|
||
// ============================================================================
|
||
|
||
/// He 丰度辅助参数。
|
||
/// 对应 COMMON /HEQAUX/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct HeqAux {
|
||
pub prd0: f64,
|
||
pub ihecor: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// PRSAUX - 辅助压力参数
|
||
// ============================================================================
|
||
|
||
/// 辅助压力参数。
|
||
/// 对应 COMMON /PRSAUX/
|
||
#[derive(Debug, Clone)]
|
||
pub struct PrsAux {
|
||
/// 声速平方 [MDEPTH]
|
||
pub vsnd2: Vec<f64>,
|
||
pub hg1: f64,
|
||
pub hr1: f64,
|
||
pub rr1: f64,
|
||
}
|
||
|
||
impl Default for PrsAux {
|
||
fn default() -> Self {
|
||
Self {
|
||
vsnd2: vec![0.0; MDEPTH],
|
||
hg1: 0.0,
|
||
hr1: 0.0,
|
||
rr1: 0.0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// CURTRI - 辅助辐射场数据
|
||
// ============================================================================
|
||
|
||
/// 辅助辐射场数据。
|
||
/// 对应 COMMON /CURTRI/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CurTri {
|
||
pub alim1: Vec<f64>,
|
||
pub alip1: Vec<f64>,
|
||
}
|
||
|
||
impl Default for CurTri {
|
||
fn default() -> Self {
|
||
Self {
|
||
alim1: vec![0.0; MDEPTH],
|
||
alip1: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// GRDPRA - 压力梯度参数
|
||
// ============================================================================
|
||
|
||
/// 压力梯度参数。
|
||
/// 对应 COMMON /GRDPRA/
|
||
#[derive(Debug, Clone)]
|
||
pub struct GrdPra {
|
||
/// 压力梯度 [MDEPTH]
|
||
pub grd: Vec<f64>,
|
||
/// 辅助压力 [MDEPTH]
|
||
pub pra: Vec<f64>,
|
||
/// 初始气体压 [MDEPTH]
|
||
pub pgs0: Vec<f64>,
|
||
/// 压力系数 [MDEPTH]
|
||
pub antp: Vec<f64>,
|
||
}
|
||
|
||
impl Default for GrdPra {
|
||
fn default() -> Self {
|
||
Self {
|
||
grd: vec![0.0; MDEPTH],
|
||
pra: vec![0.0; MDEPTH],
|
||
pgs0: vec![0.0; MDEPTH],
|
||
antp: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// IFPZPA - PZ 控制标志
|
||
// ============================================================================
|
||
|
||
/// PZ 控制标志。
|
||
/// 对应 COMMON /IFPZPA/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct IfPzPa {
|
||
pub ifpzev: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// CRSWPS - 截面权重参数
|
||
// ============================================================================
|
||
|
||
/// 截面权重参数。
|
||
/// 对应 COMMON /CRSWPS/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CrswPs {
|
||
pub crsw: Vec<f64>,
|
||
pub swpfac: f64,
|
||
pub swplim: f64,
|
||
pub swpinc: f64,
|
||
pub icrsw: i32,
|
||
}
|
||
|
||
impl Default for CrswPs {
|
||
fn default() -> Self {
|
||
Self {
|
||
crsw: vec![0.0; MDEPTH],
|
||
swpfac: 0.0,
|
||
swplim: 0.0,
|
||
swpinc: 0.0,
|
||
icrsw: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
// ============================================================================
|
||
// FILES - 临时文件数据
|
||
// ============================================================================
|
||
|
||
/// 临时文件存储数据。
|
||
/// 对应 COMMON /FILES/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Files {
|
||
pub psy0: Vec<Vec<f64>>,
|
||
pub psy1: Vec<Vec<f64>>,
|
||
pub psy2: Vec<Vec<f64>>,
|
||
pub psy3: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for Files {
|
||
fn default() -> Self {
|
||
Self {
|
||
psy0: vec![vec![0.0; MDEPTH]; MTOT],
|
||
psy1: vec![vec![0.0; MDEPTH]; MTOT],
|
||
psy2: vec![vec![0.0; MDEPTH]; MTOT],
|
||
psy3: vec![vec![0.0; MDEPTH]; MTOT],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// LEVFIX - 固定能级参数
|
||
// ============================================================================
|
||
|
||
/// 固定能级参数。
|
||
/// 对应 COMMON /LEVFIX/
|
||
#[derive(Debug, Clone)]
|
||
pub struct LevFix {
|
||
pub pt: Vec<Vec<f64>>,
|
||
pub pn: Vec<Vec<f64>>,
|
||
pub pp: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for LevFix {
|
||
fn default() -> Self {
|
||
Self {
|
||
pt: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
pn: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
pp: vec![vec![0.0; MDEPTH]; MLEVEL],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// MRGPAR - 合并能级参数
|
||
// ============================================================================
|
||
|
||
/// 合并能级参数。
|
||
/// 对应 COMMON /MRGPAR/
|
||
|
||
// ============================================================================
|
||
// UPSUMS - 上能级求和额外项
|
||
// ============================================================================
|
||
|
||
/// 上能级求和额外项。
|
||
/// 对应 COMMON /UPSUMS/
|
||
#[derive(Debug, Clone)]
|
||
pub struct UpSums {
|
||
pub dusumt: Vec<f64>,
|
||
pub dusumn: Vec<f64>,
|
||
}
|
||
|
||
impl Default for UpSums {
|
||
fn default() -> Self {
|
||
Self {
|
||
dusumt: vec![0.0; MION],
|
||
dusumn: vec![0.0; MION],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// OFFPAR - 不透明度拟合参数
|
||
// ============================================================================
|
||
|
||
/// 不透明度拟合参数。
|
||
/// 对应 COMMON /OFFPAR/
|
||
#[derive(Debug, Clone)]
|
||
pub struct OffPar {
|
||
pub sff3: Vec<Vec<f64>>,
|
||
pub sff2: Vec<Vec<f64>>,
|
||
pub dsff: Vec<Vec<f64>>,
|
||
pub cffn: Vec<f64>,
|
||
pub cfft: Vec<f64>,
|
||
}
|
||
|
||
impl Default for OffPar {
|
||
fn default() -> Self {
|
||
Self {
|
||
sff3: vec![vec![0.0; MDEPTH]; MION],
|
||
sff2: vec![vec![0.0; MDEPTH]; MION],
|
||
dsff: vec![vec![0.0; MDEPTH]; MION],
|
||
cffn: vec![0.0; MDEPTH],
|
||
cfft: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// OTRPAR - 其他跃迁参数
|
||
// ============================================================================
|
||
|
||
/// 其他跃迁参数。
|
||
/// 对应 COMMON /OTRPAR/
|
||
#[derive(Debug, Clone)]
|
||
pub struct OtrPar {
|
||
pub abtra: Vec<Vec<f64>>,
|
||
pub emtra: Vec<Vec<f64>>,
|
||
pub demlt: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for OtrPar {
|
||
fn default() -> Self {
|
||
Self {
|
||
abtra: vec![vec![0.0; MDEPTH]; MTRANS],
|
||
emtra: vec![vec![0.0; MDEPTH]; MTRANS],
|
||
demlt: vec![vec![0.0; MDEPTH]; MTRANS],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// RRATES - 复合速率
|
||
// ============================================================================
|
||
|
||
/// 复合速率。
|
||
/// 对应 COMMON /RRATES/ 和 /RRTOFF/
|
||
#[derive(Debug, Clone)]
|
||
pub struct RrRates {
|
||
pub rru: Vec<Vec<f64>>,
|
||
pub rrd: Vec<Vec<f64>>,
|
||
pub drdt: Vec<Vec<f64>>,
|
||
pub rddp: Vec<Vec<f64>>,
|
||
pub rddm: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for RrRates {
|
||
fn default() -> Self {
|
||
Self {
|
||
rru: vec![vec![0.0; MDEPTH]; MTRANS],
|
||
rrd: vec![vec![0.0; MDEPTH]; MTRANS],
|
||
drdt: vec![vec![0.0; MDEPTH]; MTRANS],
|
||
rddp: vec![vec![0.0; MDEPTH]; MTRAN3],
|
||
rddm: vec![vec![0.0; MDEPTH]; MTRAN3],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// CRATES - 碰撞速率
|
||
// ============================================================================
|
||
|
||
/// 碰撞速率。
|
||
/// 对应 COMMON /CRATES/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CraTes {
|
||
pub colrat: Vec<Vec<f64>>,
|
||
pub coltar: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for CraTes {
|
||
fn default() -> Self {
|
||
Self {
|
||
colrat: vec![vec![0.0; MDEPTH]; MTRANS],
|
||
coltar: vec![vec![0.0; MDEPTH]; MTRANS],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// FRQINT - 频率积分控制
|
||
// ============================================================================
|
||
|
||
/// 频率积分控制参数。
|
||
/// 对应 COMMON /FRQINT/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct FrqInt {
|
||
pub frcmax: f64,
|
||
pub frcmin: f64,
|
||
pub frlmax: f64,
|
||
pub frlmin: f64,
|
||
pub cfrmax: f64,
|
||
pub dftail: f64,
|
||
pub tsnu: f64,
|
||
pub vtnu: f64,
|
||
pub ddnu: f64,
|
||
pub cnu1: f64,
|
||
pub cnu2: f64,
|
||
pub ielnu: i32,
|
||
pub nftail: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// OPMEAN - 平均不透明度
|
||
// ============================================================================
|
||
|
||
/// 平均不透明度参数。
|
||
/// 对应 COMMON /OPMEAN/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct OpMean {
|
||
pub abrosd: Vec<f64>,
|
||
pub sumdpl: Vec<f64>,
|
||
pub abplad: Vec<f64>,
|
||
pub abpmin: f64,
|
||
}
|
||
|
||
impl OpMean {
|
||
pub fn new() -> Self {
|
||
Self {
|
||
abrosd: vec![0.0; MDEPTH],
|
||
sumdpl: vec![0.0; MDEPTH],
|
||
abplad: vec![0.0; MDEPTH],
|
||
abpmin: 0.0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// CHARFX - 固定电荷
|
||
// ============================================================================
|
||
|
||
/// 固定电荷。
|
||
/// 对应 COMMON /CHARFX/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CharFx {
|
||
pub qfix: Vec<f64>,
|
||
}
|
||
|
||
impl Default for CharFx {
|
||
fn default() -> Self {
|
||
Self {
|
||
qfix: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// WINDBL - 风展宽
|
||
// ============================================================================
|
||
|
||
/// 风展宽参数。
|
||
/// 对应 COMMON /WINDBL/
|
||
#[derive(Debug, Clone)]
|
||
pub struct WindBl {
|
||
pub albe: Vec<f64>,
|
||
pub iwinbl: i32,
|
||
}
|
||
|
||
impl Default for WindBl {
|
||
fn default() -> Self {
|
||
Self {
|
||
albe: vec![0.0; MFREQ],
|
||
iwinbl: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// DFEALI - ALI 导数
|
||
// ============================================================================
|
||
|
||
/// ALI 导数参数。
|
||
/// 对应 COMMON /DFEALI/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct DfeAli {
|
||
pub djmax: f64,
|
||
pub ntrali: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// OPACAD - 额外不透明度
|
||
// ============================================================================
|
||
|
||
/// 额外不透明度参数。
|
||
/// 对应 COMMON /OPACAD/
|
||
#[derive(Debug, Clone)]
|
||
pub struct OpacAd {
|
||
pub abad: f64,
|
||
pub emad: f64,
|
||
pub scad: f64,
|
||
pub dat: f64,
|
||
pub dan: f64,
|
||
pub det: f64,
|
||
pub den: f64,
|
||
pub dst: f64,
|
||
pub dsn: f64,
|
||
pub ddn: Vec<f64>,
|
||
}
|
||
|
||
impl Default for OpacAd {
|
||
fn default() -> Self {
|
||
Self {
|
||
abad: 0.0, emad: 0.0, scad: 0.0,
|
||
dat: 0.0, dan: 0.0, det: 0.0, den: 0.0,
|
||
dst: 0.0, dsn: 0.0,
|
||
ddn: vec![0.0; MLEVEL],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// MODCON - 模型修正
|
||
// ============================================================================
|
||
|
||
/// 模型修正参数。
|
||
/// 对应 COMMON /MODCON/
|
||
#[derive(Debug, Clone)]
|
||
pub struct ModCon {
|
||
pub flxc: Vec<f64>,
|
||
pub delta: Vec<f64>,
|
||
}
|
||
|
||
impl Default for ModCon {
|
||
fn default() -> Self {
|
||
Self {
|
||
flxc: vec![0.0; MDEPTH],
|
||
delta: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// RESDER - 残差导数
|
||
// ============================================================================
|
||
|
||
/// 残差导数参数。
|
||
/// 对应 COMMON /RESDER/
|
||
#[derive(Debug, Clone)]
|
||
pub struct ResDer {
|
||
pub rsat: f64,
|
||
pub rsbt: f64,
|
||
pub rsan: f64,
|
||
pub rsbn: f64,
|
||
pub rsax: Vec<f64>,
|
||
pub rsbx: Vec<f64>,
|
||
}
|
||
|
||
impl Default for ResDer {
|
||
fn default() -> Self {
|
||
Self {
|
||
rsat: 0.0, rsbt: 0.0, rsan: 0.0, rsbn: 0.0,
|
||
rsax: vec![0.0; MLEVEL],
|
||
rsbx: vec![0.0; MLEVEL],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// GRAYTS - 灰大气温标
|
||
// ============================================================================
|
||
|
||
/// 灰大气温标参数。
|
||
/// 对应 COMMON /GRAYTS/ 和 /TAURSS/
|
||
#[derive(Debug, Clone)]
|
||
pub struct GrayTs {
|
||
pub tauros: Vec<f64>,
|
||
pub tauflx: Vec<f64>,
|
||
pub tauthe: Vec<f64>,
|
||
pub theta: Vec<f64>,
|
||
pub tross: Vec<f64>,
|
||
}
|
||
|
||
impl Default for GrayTs {
|
||
fn default() -> Self {
|
||
Self {
|
||
tauros: vec![0.0; MDEPTH],
|
||
tauflx: vec![0.0; MDEPTH],
|
||
tauthe: vec![0.0; MDEPTH],
|
||
theta: vec![0.0; MDEPTH],
|
||
tross: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// TAURSS - 罗斯兰平均光学深度
|
||
// ============================================================================
|
||
|
||
#[derive(Debug, Clone)]
|
||
pub struct TaurSs {
|
||
pub tross: Vec<f64>,
|
||
}
|
||
|
||
impl Default for TaurSs {
|
||
fn default() -> Self {
|
||
Self {
|
||
tross: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// TCONST - 恒温控制
|
||
// ============================================================================
|
||
|
||
/// 恒温控制参数。
|
||
/// 对应 COMMON /TCONST/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct TConst {
|
||
pub tdisk: f64,
|
||
pub itcons: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// HYDADD - 氢额外项
|
||
// ============================================================================
|
||
|
||
/// 氢额外项参数。
|
||
/// 对应 COMMON /HYDADD/
|
||
#[derive(Debug, Clone)]
|
||
pub struct HydAdd {
|
||
pub phmol: Vec<f64>,
|
||
pub anerel: f64,
|
||
pub ihm: i32,
|
||
pub ih2: i32,
|
||
pub ih2p: i32,
|
||
}
|
||
|
||
impl Default for HydAdd {
|
||
fn default() -> Self {
|
||
Self {
|
||
phmol: vec![0.0; MDEPTH],
|
||
anerel: 0.0,
|
||
ihm: 0, ih2: 0, ih2p: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// ELDNSP - 电子密度额外项
|
||
// ============================================================================
|
||
|
||
/// 电子密度额外项参数。
|
||
/// 对应 COMMON /ELDNSP/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct EldNsp {
|
||
pub anp: f64,
|
||
pub ahtot: f64,
|
||
pub ahmol: f64,
|
||
}
|
||
|
||
// ============================================================================
|
||
// RRVALS - 速率值
|
||
// ============================================================================
|
||
|
||
/// 速率值参数。
|
||
/// 对应 COMMON /RRVALS/
|
||
#[derive(Debug, Clone)]
|
||
pub struct RrVals {
|
||
pub rr: [[f64; 99]; 99],
|
||
pub abndd: Vec<Vec<f64>>,
|
||
pub enev: [[f64; 30]; 99],
|
||
pub ioniz: Vec<f64>,
|
||
pub iref: i32,
|
||
pub irefa: i32,
|
||
pub lgr: Vec<i32>,
|
||
pub lrm: Vec<i32>,
|
||
}
|
||
|
||
impl Default for RrVals {
|
||
fn default() -> Self {
|
||
Self {
|
||
rr: [[0.0; 99]; 99],
|
||
abndd: vec![vec![0.0; MDEPTH]; 99],
|
||
enev: [[0.0; 30]; 99],
|
||
ioniz: vec![0.0; 99],
|
||
iref: 0, irefa: 0,
|
||
lgr: vec![0; 99],
|
||
lrm: vec![0; 99],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// ABNTAB - 不透明度表丰度
|
||
// ============================================================================
|
||
|
||
/// 不透明度表中的丰度数据。
|
||
/// 对应 COMMON /ABNTAB/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct AbnTab {
|
||
/// 表中的丰度值
|
||
pub abunt: Vec<f64>,
|
||
/// 表中的丰度原始值
|
||
pub abuno: Vec<f64>,
|
||
/// 表中的分子温度限
|
||
pub tmolit: f64,
|
||
/// H- 不透明度标志(表)
|
||
pub iophmt: i32,
|
||
/// H2+ 不透明度标志(表)
|
||
pub ioph2t: i32,
|
||
/// He- 不透明度标志(表)
|
||
pub iophet: i32,
|
||
/// CH 不透明度标志(表)
|
||
pub iopcht: i32,
|
||
/// OH 不透明度标志(表)
|
||
pub iopoht: i32,
|
||
/// H2- 不透明度标志(表)
|
||
pub ioh2mt: i32,
|
||
/// H2-H2 CIA 标志(表)
|
||
pub ih2h2t: i32,
|
||
/// H2-He CIA 标志(表)
|
||
pub ih2het: i32,
|
||
/// H2-H CIA 标志(表)
|
||
pub ioh2ht: i32,
|
||
/// H-He CIA 标志(表)
|
||
pub iohhet: i32,
|
||
/// 分子处理标志(表)
|
||
pub ifmolt: i32,
|
||
}
|
||
|
||
impl AbnTab {
|
||
pub fn new() -> Self {
|
||
Self {
|
||
abunt: vec![0.0; 99],
|
||
abuno: vec![0.0; 99],
|
||
..Default::default()
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// STATEP - 状态方程参数
|
||
// ============================================================================
|
||
|
||
/// 状态方程参数。
|
||
/// 对应 COMMON /STATEP/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct StateP {
|
||
pub q: f64,
|
||
pub qm: f64,
|
||
pub dqt: f64,
|
||
pub dqn: f64,
|
||
pub dqm: f64,
|
||
pub ener: f64,
|
||
pub entr: f64,
|
||
pub qref: f64,
|
||
pub dqtr: f64,
|
||
pub dqnr: f64,
|
||
pub pfhyd: f64,
|
||
}
|
||
|
||
// ============================================================================
|
||
// ODFCHT - ODF 修正项
|
||
// ============================================================================
|
||
|
||
/// ODF 修正项参数。
|
||
/// 对应 COMMON /ODFCHT/
|
||
#[derive(Debug, Clone)]
|
||
pub struct OdfCht {
|
||
pub chant: Vec<f64>,
|
||
}
|
||
|
||
impl Default for OdfCht {
|
||
fn default() -> Self {
|
||
Self {
|
||
chant: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// STDPAR - 标准模型参数
|
||
// ============================================================================
|
||
|
||
/// 标准模型参数。
|
||
/// 对应 COMMON /STDPAR/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct StdPar {
|
||
pub elstd: f64,
|
||
pub idstd: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// LTEGRP - LTE 组参数
|
||
// ============================================================================
|
||
|
||
/// LTE 组参数。
|
||
/// 对应 COMMON /LTEGRP/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct LteGrp {
|
||
pub taufir: f64,
|
||
pub taulas: f64,
|
||
pub abros0: f64,
|
||
pub tsurf: f64,
|
||
pub albave: f64,
|
||
pub dion0: f64,
|
||
pub dm1: f64,
|
||
pub abpla0: f64,
|
||
pub nnewd: i32,
|
||
pub ndgrey: i32,
|
||
pub idgrey: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// COMPTF - Compton 场修正
|
||
// ============================================================================
|
||
|
||
/// Compton 场修正参数。
|
||
/// 对应 COMMON /COMPTF/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CompTf {
|
||
pub dlnfr: Vec<f64>,
|
||
pub bnus: Vec<f64>,
|
||
pub cder10: Vec<f64>,
|
||
pub cder1p: Vec<f64>,
|
||
pub cder1m: Vec<f64>,
|
||
pub cder20: Vec<f64>,
|
||
pub cder2p: Vec<f64>,
|
||
pub cder2m: Vec<f64>,
|
||
pub delj: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for CompTf {
|
||
fn default() -> Self {
|
||
Self {
|
||
dlnfr: vec![0.0; MFREQ],
|
||
bnus: vec![0.0; MFREQ],
|
||
cder10: vec![0.0; MFREQ],
|
||
cder1p: vec![0.0; MFREQ],
|
||
cder1m: vec![0.0; MFREQ],
|
||
cder20: vec![0.0; MFREQ],
|
||
cder2p: vec![0.0; MFREQ],
|
||
cder2m: vec![0.0; MFREQ],
|
||
delj: vec![vec![0.0; MDEPTH]; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// COMGFS - Compton 散射频率导数辅助数组
|
||
// ============================================================================
|
||
|
||
/// Compton 散射频率导数辅助数组。
|
||
/// 对应 COMMON /COMGFS/
|
||
#[derive(Debug, Clone)]
|
||
pub struct ComGfs {
|
||
/// GFM - 频率导数系数 (前向)
|
||
pub gfm: Vec<Vec<f64>>,
|
||
/// GFP - 频率导数系数 (后向)
|
||
pub gfp: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for ComGfs {
|
||
fn default() -> Self {
|
||
Self {
|
||
gfm: vec![vec![0.0; MDEPTH]; MFREQ],
|
||
gfp: vec![vec![0.0; MDEPTH]; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// VISPAR - 粘性参数
|
||
// ============================================================================
|
||
|
||
/// 粘性物理参数。
|
||
/// 对应 COMMON /VISPAR/
|
||
#[derive(Debug, Clone)]
|
||
pub struct VisPar {
|
||
pub tvisc: Vec<f64>,
|
||
pub dtvist: Vec<f64>,
|
||
pub dtvisn: Vec<f64>,
|
||
pub dtvisr: Vec<f64>,
|
||
}
|
||
|
||
impl Default for VisPar {
|
||
fn default() -> Self {
|
||
Self {
|
||
tvisc: vec![0.0; MDEPTH],
|
||
dtvist: vec![0.0; MDEPTH],
|
||
dtvisn: vec![0.0; MDEPTH],
|
||
dtvisr: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// TABLOP - 不透明度表参数
|
||
// ============================================================================
|
||
|
||
/// 不透明度表参数。
|
||
/// 对应 COMMON /TABLOP/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct TabLop {
|
||
pub frtb1: f64,
|
||
pub frtb2: f64,
|
||
pub rtab1: f64,
|
||
pub rtab2: f64,
|
||
pub ttab1: f64,
|
||
pub ttab2: f64,
|
||
}
|
||
|
||
// ============================================================================
|
||
// NUMBOPAC - 不透明度表计数
|
||
// ============================================================================
|
||
|
||
/// 不透明度表计数。
|
||
/// 对应 COMMON /NUMBOPAC/
|
||
#[derive(Debug, Clone)]
|
||
pub struct NumbOpac {
|
||
pub numfreq: i32,
|
||
pub numrho: i32,
|
||
pub numtemp: i32,
|
||
pub numrh: Vec<i32>,
|
||
}
|
||
|
||
impl Default for NumbOpac {
|
||
fn default() -> Self {
|
||
Self {
|
||
numfreq: 0,
|
||
numrho: 0,
|
||
numtemp: 0,
|
||
numrh: vec![0; MTABT],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// VECTORS - 选表向量
|
||
// ============================================================================
|
||
|
||
/// 选表向量参数。
|
||
/// 对应 COMMON /VECTORS/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Vectors {
|
||
pub tempvec: Vec<f64>,
|
||
pub rhovec: Vec<f64>,
|
||
pub rhomat: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for Vectors {
|
||
fn default() -> Self {
|
||
Self {
|
||
tempvec: vec![0.0; MTABT],
|
||
rhovec: vec![0.0; MTABR],
|
||
rhomat: vec![vec![0.0; MTABR]; MTABT],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// OPACITIES - 不透明度矩阵
|
||
// ============================================================================
|
||
|
||
/// 不透明度矩阵。
|
||
/// 对应 COMMON /OPACITIES/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Opacities {
|
||
pub frtab: Vec<f64>,
|
||
pub frtlim: f64,
|
||
pub absopac: Vec<Vec<Vec<f64>>>,
|
||
}
|
||
|
||
impl Default for Opacities {
|
||
fn default() -> Self {
|
||
Self {
|
||
frtab: vec![0.0; MFRTAB],
|
||
frtlim: 0.0,
|
||
absopac: vec![vec![vec![0.0; MFRTAB]; MTABR]; MTABT],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// RAYTBL - 瑞利散射表
|
||
// ============================================================================
|
||
|
||
/// 瑞利散射表。
|
||
/// 对应 COMMON /RAYTBL/
|
||
#[derive(Debug, Clone)]
|
||
pub struct RayTbl {
|
||
pub raytab: Vec<Vec<f64>>,
|
||
pub raysc: Vec<f64>,
|
||
}
|
||
|
||
impl Default for RayTbl {
|
||
fn default() -> Self {
|
||
Self {
|
||
raytab: vec![vec![0.0; MTABR]; MTABT],
|
||
raysc: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// BINOPA - 二进制不透明度标志
|
||
// ============================================================================
|
||
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct BinOpa {
|
||
pub ibinop: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// TABHYG - 氢不透明度表控制
|
||
// ============================================================================
|
||
|
||
/// 氢不透明度表控制。
|
||
/// 对应 COMMON /TABHYG/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct TabHyg {
|
||
pub hglim: f64,
|
||
pub ihgom: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// TABLOH - 氢不透明度表参数
|
||
// ============================================================================
|
||
|
||
/// 氢不透明度表参数。
|
||
/// 对应 COMMON /TABLOH/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct TabLoh {
|
||
pub frgtb1: f64,
|
||
pub frgtb2: f64,
|
||
pub egtab1: f64,
|
||
pub egtab2: f64,
|
||
pub tgtab1: f64,
|
||
pub tgtab2: f64,
|
||
}
|
||
|
||
// ============================================================================
|
||
// NUMGOPAC - 氢不透明度计数
|
||
// ============================================================================
|
||
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct NumGOpac {
|
||
pub nugfreq: i32,
|
||
pub nugele: i32,
|
||
pub nugtemp: i32,
|
||
}
|
||
|
||
// ============================================================================
|
||
// VECTORG - 氢选表向量
|
||
// ============================================================================
|
||
|
||
/// 氢选表向量。
|
||
/// 对应 COMMON /VECTORG/
|
||
#[derive(Debug, Clone)]
|
||
pub struct VectorG {
|
||
pub temvec: Vec<f64>,
|
||
pub elevec: Vec<f64>,
|
||
}
|
||
|
||
impl Default for VectorG {
|
||
fn default() -> Self {
|
||
Self {
|
||
temvec: vec![0.0; MTABTH],
|
||
elevec: vec![0.0; MTABEH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// OPACITIEG - 氢不透明度矩阵
|
||
// ============================================================================
|
||
|
||
/// 氢不透明度矩阵。
|
||
/// 对应 COMMON /OPACITIEG/
|
||
#[derive(Debug, Clone)]
|
||
pub struct OpacitieG {
|
||
pub frgtab: Vec<f64>,
|
||
pub hydcrs: Vec<Vec<Vec<f64>>>,
|
||
}
|
||
|
||
impl Default for OpacitieG {
|
||
fn default() -> Self {
|
||
Self {
|
||
frgtab: vec![0.0; MFHTAB],
|
||
hydcrs: vec![vec![vec![0.0; MFHTAB]; MTABEH]; MTABTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// EXPRAF - 扩展辐射场
|
||
// ============================================================================
|
||
|
||
/// 扩展辐射场量。
|
||
/// 对应 COMMON /EXPRAF/
|
||
#[derive(Debug, Clone)]
|
||
pub struct ExpRaf {
|
||
/// 扩展平均强度 [MFREX × MDEPTH]
|
||
pub radex: Vec<Vec<f64>>,
|
||
/// 扩展 Eddington 因子 [MFREX × MDEPTH]
|
||
pub fakex: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for ExpRaf {
|
||
fn default() -> Self {
|
||
Self {
|
||
radex: vec![vec![0.0; MDEPTH]; MFREX],
|
||
fakex: vec![vec![0.0; MDEPTH]; MFREX],
|
||
}
|
||
}
|
||
}
|
||
|
||
impl ModelState {
|
||
pub fn new() -> Self {
|
||
Self {
|
||
gffpar: GffPar::new(),
|
||
currad: CurRad::new(),
|
||
totprf: TotPrf::new(),
|
||
phoexp: PhoExp::new(),
|
||
obfpar: ObfPar::new(),
|
||
levadd: LevAdd::new(),
|
||
..Default::default()
|
||
}
|
||
}
|
||
|
||
/// 获取指定深度的温度
|
||
pub fn temperature(&self, depth: usize) -> f64 {
|
||
if depth < MDEPTH {
|
||
self.modpar.temp[depth]
|
||
} else {
|
||
0.0
|
||
}
|
||
}
|
||
|
||
/// 获取指定深度的电子密度
|
||
pub fn electron_density(&self, depth: usize) -> f64 {
|
||
if depth < MDEPTH {
|
||
self.modpar.elec[depth]
|
||
} else {
|
||
0.0
|
||
}
|
||
}
|
||
|
||
/// 获取指定深度的总粒子密度
|
||
pub fn total_density(&self, depth: usize) -> f64 {
|
||
if depth < MDEPTH {
|
||
self.modpar.dens[depth]
|
||
} else {
|
||
0.0
|
||
}
|
||
}
|
||
|
||
/// 获取指定能级在指定深度的占据数
|
||
pub fn population(&self, level: usize, depth: usize) -> f64 {
|
||
if level < MLEVEL && depth < MDEPTH {
|
||
self.levpop.popul[level][depth]
|
||
} else {
|
||
0.0
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// AUXRTE - 辅助辐射场计算
|
||
// ============================================================================
|
||
|
||
/// 辅助辐射场计算。
|
||
/// 对应 COMMON /AUXRTE/
|
||
#[derive(Debug, Clone)]
|
||
pub struct AuxRte {
|
||
pub coma: Vec<f64>,
|
||
pub comb: Vec<f64>,
|
||
pub comc: Vec<f64>,
|
||
pub vl: Vec<f64>,
|
||
pub come: Vec<f64>,
|
||
pub u: Vec<f64>,
|
||
pub v: Vec<f64>,
|
||
pub bs: Vec<f64>,
|
||
pub al: Vec<f64>,
|
||
pub be: Vec<f64>,
|
||
pub ga: Vec<f64>,
|
||
}
|
||
|
||
impl Default for AuxRte {
|
||
fn default() -> Self {
|
||
Self {
|
||
coma: vec![0.0; MDEPTH],
|
||
comb: vec![0.0; MDEPTH],
|
||
comc: vec![0.0; MDEPTH],
|
||
vl: vec![0.0; MDEPTH],
|
||
come: vec![0.0; MDEPTH],
|
||
u: vec![0.0; MDEPTH],
|
||
v: vec![0.0; MDEPTH],
|
||
bs: vec![0.0; MDEPTH],
|
||
al: vec![0.0; MDEPTH],
|
||
be: vec![0.0; MDEPTH],
|
||
ga: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// AUXCBC - 辅助康普顿散射计算
|
||
// ============================================================================
|
||
|
||
/// 辅助康普顿散射计算。
|
||
/// 对应 COMMON /AUXCBC/
|
||
#[derive(Debug, Clone)]
|
||
pub struct AuxCbc {
|
||
pub cden1m: Vec<f64>,
|
||
pub cden10: Vec<f64>,
|
||
pub cden2m: Vec<f64>,
|
||
pub cden20: Vec<f64>,
|
||
}
|
||
|
||
impl Default for AuxCbc {
|
||
fn default() -> Self {
|
||
Self {
|
||
cden1m: vec![0.0; MDEPTH],
|
||
cden10: vec![0.0; MDEPTH],
|
||
cden2m: vec![0.0; MDEPTH],
|
||
cden20: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// OPTDPT - 光学深度相关
|
||
// ============================================================================
|
||
|
||
/// 光学深度相关。
|
||
/// 对应 COMMON /OPTDPT/
|
||
#[derive(Debug, Clone)]
|
||
pub struct OptDpt {
|
||
pub dt: Vec<f64>,
|
||
}
|
||
|
||
impl Default for OptDpt {
|
||
fn default() -> Self {
|
||
Self {
|
||
dt: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// RHODER - 密度对温度的导数
|
||
// ============================================================================
|
||
|
||
/// 密度对温度的导数。
|
||
/// 对应 COMMON /RHODER/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Rhoder {
|
||
pub drhodt: Vec<f64>,
|
||
}
|
||
|
||
impl Default for Rhoder {
|
||
fn default() -> Self {
|
||
Self {
|
||
drhodt: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// INTCFF - 频率插值系数
|
||
// ============================================================================
|
||
|
||
/// 频率插值系数。
|
||
/// 对应 COMMON /intcff/
|
||
#[derive(Debug, Clone)]
|
||
pub struct IntCff {
|
||
/// 插值系数
|
||
pub yint: Vec<f64>,
|
||
/// 插值索引
|
||
pub jint: Vec<i32>,
|
||
}
|
||
|
||
impl Default for IntCff {
|
||
fn default() -> Self {
|
||
Self {
|
||
yint: vec![0.0; MFREQ],
|
||
jint: vec![0; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// RYBMTX - Rybicki 矩阵元素
|
||
// ============================================================================
|
||
|
||
/// Rybicki 形式完全线性化矩阵元素。
|
||
/// 对应 COMMON /RYBMTX/
|
||
#[derive(Debug, Clone)]
|
||
pub struct RybMtx {
|
||
/// 三对角矩阵下对角线 (辐射转移)
|
||
pub ra: Vec<f64>,
|
||
/// 三对角矩阵对角线 (辐射转移)
|
||
pub rb: Vec<f64>,
|
||
/// 三对角矩阵上对角线 (辐射转移)
|
||
pub rc: Vec<f64>,
|
||
/// 辐射转移右端项
|
||
pub vr: Vec<f64>,
|
||
|
||
/// 三对角矩阵下对角线 (温度导数)
|
||
pub ua: Vec<f64>,
|
||
/// 三对角矩阵对角线 (温度导数)
|
||
pub ub: Vec<f64>,
|
||
/// 三对角矩阵上对角线 (温度导数)
|
||
pub uc: Vec<f64>,
|
||
|
||
/// 三对角矩阵下对角线 (辐射平衡)
|
||
pub va: Vec<f64>,
|
||
/// 三对角矩阵对角线 (辐射平衡)
|
||
pub vb: Vec<f64>,
|
||
/// 三对角矩阵上对角线 (辐射平衡)
|
||
pub vc: Vec<f64>,
|
||
/// 辐射平衡右端项
|
||
pub wr: Vec<f64>,
|
||
|
||
/// 完整矩阵 (辐射平衡)
|
||
pub wm: Vec<Vec<f64>>,
|
||
}
|
||
|
||
impl Default for RybMtx {
|
||
fn default() -> Self {
|
||
Self {
|
||
ra: vec![0.0; MDEPTH],
|
||
rb: vec![0.0; MDEPTH],
|
||
rc: vec![0.0; MDEPTH],
|
||
vr: vec![0.0; MDEPTH],
|
||
ua: vec![0.0; MDEPTH],
|
||
ub: vec![0.0; MDEPTH],
|
||
uc: vec![0.0; MDEPTH],
|
||
va: vec![0.0; MDEPTH],
|
||
vb: vec![0.0; MDEPTH],
|
||
vc: vec![0.0; MDEPTH],
|
||
wr: vec![0.0; MDEPTH],
|
||
wm: vec![vec![0.0; MDEPTH]; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// RELCOR - 相对论修正参数
|
||
// ============================================================================
|
||
|
||
/// 相对论修正参数。
|
||
/// 对应 COMMON /relcor/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct RelCor {
|
||
/// 相对论修正系数 A
|
||
pub arh: f64,
|
||
/// 相对论修正系数 B
|
||
pub brh: f64,
|
||
/// 相对论修正系数 C
|
||
pub crh: f64,
|
||
/// 相对论修正系数 D
|
||
pub drh: f64,
|
||
}
|
||
|
||
// ============================================================================
|
||
// TOPB - Opacity Project 光致电离数据
|
||
// ============================================================================
|
||
|
||
/// Opacity Project 光致电离截面数据。
|
||
/// 对应 COMMON /TOPB/
|
||
#[derive(Debug, Clone)]
|
||
pub struct TopB {
|
||
/// sigma = log10(sigma/10^-18) 拟合点
|
||
pub sop: Vec<Vec<f64>>,
|
||
/// x = log10(nu/nu0) 拟合点
|
||
pub xop: Vec<Vec<f64>>,
|
||
/// 当前能级的拟合点数
|
||
pub nop: Vec<i32>,
|
||
/// Opacity Project 数据中的总能级数
|
||
pub ntotop: i32,
|
||
/// 能级标识符
|
||
pub idlvop: Vec<String>,
|
||
/// 数据是否已读入
|
||
pub loprea: bool,
|
||
}
|
||
|
||
// 常量
|
||
const MMAXOP: usize = 200; // OP 数据中最大能级数
|
||
const MOP: usize = 15; // 每个能级最大拟合点数
|
||
|
||
impl Default for TopB {
|
||
fn default() -> Self {
|
||
Self {
|
||
sop: vec![vec![0.0; MMAXOP]; MOP],
|
||
xop: vec![vec![0.0; MMAXOP]; MOP],
|
||
nop: vec![0; MMAXOP],
|
||
ntotop: 0,
|
||
idlvop: vec![String::new(); MMAXOP],
|
||
loprea: false,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// QUASUN - 准分子卫星参数
|
||
// ============================================================================
|
||
|
||
/// 准分子卫星参数。
|
||
/// 对应 COMMON /quasun/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct Quasun {
|
||
/// 温度相关轮廓标志
|
||
pub tqmprf: f64,
|
||
/// 准分子处理标志
|
||
pub iquasi: i32,
|
||
/// Lyman alpha 单元号
|
||
pub nunalp: i32,
|
||
/// Lyman beta 单元号
|
||
pub nunbet: i32,
|
||
/// Lyman gamma 单元号
|
||
pub nungam: i32,
|
||
/// Balmer alpha 单元号
|
||
pub nunbal: i32,
|
||
}
|
||
|
||
// 常量
|
||
const NXMAX: usize = 1400;
|
||
const NNMAX: usize = 5;
|
||
const NTAMAX: usize = 6;
|
||
|
||
// ============================================================================
|
||
// CALLARDA - Lyman alpha 轮廓
|
||
// ============================================================================
|
||
|
||
/// Lyman alpha 准分子轮廓。
|
||
/// 对应 COMMON /callarda/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CallardA {
|
||
/// 波长网格
|
||
pub xlalp: Vec<f64>,
|
||
/// 轮廓函数 (波长 × 密度阶)
|
||
pub plalp: Vec<Vec<f64>>,
|
||
/// 中性密度标准化
|
||
pub stnnea: f64,
|
||
/// 电荷密度标准化
|
||
pub stncha: f64,
|
||
/// 中性密度幂指数
|
||
pub vneua: f64,
|
||
/// 电荷密度幂指数
|
||
pub vchaa: f64,
|
||
/// 数据点数
|
||
pub nxalp: i32,
|
||
/// 警告标志
|
||
pub iwarna: i32,
|
||
}
|
||
|
||
impl Default for CallardA {
|
||
fn default() -> Self {
|
||
Self {
|
||
xlalp: vec![0.0; NXMAX],
|
||
plalp: vec![vec![0.0; NNMAX]; NXMAX],
|
||
stnnea: 0.0,
|
||
stncha: 0.0,
|
||
vneua: 0.0,
|
||
vchaa: 0.0,
|
||
nxalp: 0,
|
||
iwarna: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// CALLARDB - Lyman beta 轮廓
|
||
// ============================================================================
|
||
|
||
/// Lyman beta 准分子轮廓。
|
||
/// 对应 COMMON /callardb/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CallardB {
|
||
/// 波长网格
|
||
pub xlbet: Vec<f64>,
|
||
/// 轮廓函数 (波长 × 密度阶)
|
||
pub plbet: Vec<Vec<f64>>,
|
||
/// 中性密度标准化
|
||
pub stnneb: f64,
|
||
/// 电荷密度标准化
|
||
pub stnchb: f64,
|
||
/// 中性密度幂指数
|
||
pub vneub: f64,
|
||
/// 电荷密度幂指数
|
||
pub vchab: f64,
|
||
/// 数据点数
|
||
pub nxbet: i32,
|
||
/// 警告标志
|
||
pub iwarnb: i32,
|
||
}
|
||
|
||
impl Default for CallardB {
|
||
fn default() -> Self {
|
||
Self {
|
||
xlbet: vec![0.0; NXMAX],
|
||
plbet: vec![vec![0.0; NNMAX]; NXMAX],
|
||
stnneb: 0.0,
|
||
stnchb: 0.0,
|
||
vneub: 0.0,
|
||
vchab: 0.0,
|
||
nxbet: 0,
|
||
iwarnb: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// CALLARDG - Lyman gamma 轮廓
|
||
// ============================================================================
|
||
|
||
/// Lyman gamma 准分子轮廓。
|
||
/// 对应 COMMON /callardg/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CallardG {
|
||
/// 波长网格
|
||
pub xlgam: Vec<f64>,
|
||
/// 轮廓函数 (波长 × 密度阶)
|
||
pub plgam: Vec<Vec<f64>>,
|
||
/// 中性密度标准化
|
||
pub stnneg: f64,
|
||
/// 电荷密度标准化
|
||
pub stnchg: f64,
|
||
/// 中性密度幂指数
|
||
pub vneug: f64,
|
||
/// 电荷密度幂指数
|
||
pub vchag: f64,
|
||
/// 数据点数
|
||
pub nxgam: i32,
|
||
/// 警告标志
|
||
pub iwarng: i32,
|
||
}
|
||
|
||
impl Default for CallardG {
|
||
fn default() -> Self {
|
||
Self {
|
||
xlgam: vec![0.0; NXMAX],
|
||
plgam: vec![vec![0.0; NNMAX]; NXMAX],
|
||
stnneg: 0.0,
|
||
stnchg: 0.0,
|
||
vneug: 0.0,
|
||
vchag: 0.0,
|
||
nxgam: 0,
|
||
iwarng: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// CALLARDC - Balmer alpha 轮廓
|
||
// ============================================================================
|
||
|
||
/// Balmer alpha 准分子轮廓。
|
||
/// 对应 COMMON /callardc/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CallardC {
|
||
/// 波长网格
|
||
pub xlbal: Vec<f64>,
|
||
/// 轮廓函数 (波长 × 密度阶)
|
||
pub plbal: Vec<Vec<f64>>,
|
||
/// 中性密度标准化
|
||
pub stnnec: f64,
|
||
/// 电荷密度标准化
|
||
pub stnchc: f64,
|
||
/// 中性密度幂指数
|
||
pub vneuc: f64,
|
||
/// 电荷密度幂指数
|
||
pub vchac: f64,
|
||
/// 数据点数
|
||
pub nxbal: i32,
|
||
/// 警告标志
|
||
pub iwarnc: i32,
|
||
}
|
||
|
||
impl Default for CallardC {
|
||
fn default() -> Self {
|
||
Self {
|
||
xlbal: vec![0.0; NXMAX],
|
||
plbal: vec![vec![0.0; NNMAX]; NXMAX],
|
||
stnnec: 0.0,
|
||
stnchc: 0.0,
|
||
vneuc: 0.0,
|
||
vchac: 0.0,
|
||
nxbal: 0,
|
||
iwarnc: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// HEDIFF - 分层氦丰度参数
|
||
// ============================================================================
|
||
|
||
/// 分层氦丰度参数。
|
||
/// 对应 COMMON /hediff/
|
||
#[derive(Debug, Clone, Default)]
|
||
pub struct Hediff {
|
||
/// 氢质量
|
||
pub hcmass: f64,
|
||
/// 恒星半径 (以太阳半径为单位)
|
||
pub radstr: f64,
|
||
}
|
||
|
||
// ============================================================================
|
||
// CALPHATD - 温度相关 Lyman alpha 轮廓
|
||
// ============================================================================
|
||
|
||
/// 温度相关 Lyman alpha 准分子轮廓。
|
||
/// 对应 COMMON /calphatd/
|
||
#[derive(Debug, Clone)]
|
||
pub struct CalphatD {
|
||
/// 波长网格 (波长 × 温度)
|
||
pub xlalpd: Vec<Vec<f64>>,
|
||
/// 轮廓函数 (波长 × 密度阶 × 温度)
|
||
pub plalpd: Vec<Vec<Vec<f64>>>,
|
||
/// 中性密度标准化 (温度)
|
||
pub stnead: Vec<f64>,
|
||
/// 电荷密度标准化 (温度)
|
||
pub stnchd: Vec<f64>,
|
||
/// 中性密度幂指数 (温度)
|
||
pub vneuad: Vec<f64>,
|
||
/// 电荷密度幂指数 (温度)
|
||
pub vchaad: Vec<f64>,
|
||
/// 温度值 (温度)
|
||
pub talpd: Vec<f64>,
|
||
/// 数据点数 (温度)
|
||
pub nxalpd: Vec<i32>,
|
||
/// 温度数
|
||
pub ntalpd: i32,
|
||
}
|
||
|
||
impl Default for CalphatD {
|
||
fn default() -> Self {
|
||
Self {
|
||
xlalpd: vec![vec![0.0; NTAMAX]; NXMAX],
|
||
plalpd: vec![vec![vec![0.0; NTAMAX]; NNMAX]; NXMAX],
|
||
stnead: vec![0.0; NTAMAX],
|
||
stnchd: vec![0.0; NTAMAX],
|
||
vneuad: vec![0.0; NTAMAX],
|
||
vchaad: vec![0.0; NTAMAX],
|
||
talpd: vec![0.0; NTAMAX],
|
||
nxalpd: vec![0; NTAMAX],
|
||
ntalpd: 0,
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// DSCTVA - 散射导数
|
||
// ============================================================================
|
||
|
||
/// 散射相关导数。
|
||
/// 对应 COMMON /dsctva/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Dsctva {
|
||
/// 散射对温度的导数
|
||
pub dsct1: Vec<f64>,
|
||
/// 散射对密度的导数
|
||
pub dscn1: Vec<f64>,
|
||
}
|
||
|
||
impl Default for Dsctva {
|
||
fn default() -> Self {
|
||
Self {
|
||
dsct1: vec![0.0; MDEPTH],
|
||
dscn1: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// SURFEX - 表面辐射
|
||
// ============================================================================
|
||
|
||
/// 表面辐射强度。
|
||
/// 对应 COMMON /SURFEX/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Surfex {
|
||
/// 表面 J 强度
|
||
pub extj: Vec<f64>,
|
||
/// 表面 H 通量
|
||
pub exth: Vec<f64>,
|
||
}
|
||
|
||
impl Default for Surfex {
|
||
fn default() -> Self {
|
||
Self {
|
||
extj: vec![0.0; MFREQ],
|
||
exth: vec![0.0; MFREQ],
|
||
}
|
||
}
|
||
}
|
||
|
||
// ============================================================================
|
||
// TOTJHK - 总辐射矩
|
||
// ============================================================================
|
||
|
||
/// 频率积分辐射矩。
|
||
/// 对应 COMMON /TOTJHK/
|
||
#[derive(Debug, Clone)]
|
||
pub struct Totjhk {
|
||
/// 积分 J (平均强度)
|
||
pub totj: Vec<f64>,
|
||
/// 积分 H (Eddington 通量)
|
||
pub toth: Vec<f64>,
|
||
/// 积分 K (辐射压)
|
||
pub totk: Vec<f64>,
|
||
/// Rosseland 平均不透明度 × 密度
|
||
pub rdopac: Vec<f64>,
|
||
/// 通量平均不透明度
|
||
pub flopac: Vec<f64>,
|
||
}
|
||
|
||
impl Default for Totjhk {
|
||
fn default() -> Self {
|
||
Self {
|
||
totj: vec![0.0; MDEPTH],
|
||
toth: vec![0.0; MDEPTH],
|
||
totk: vec![0.0; MDEPTH],
|
||
rdopac: vec![0.0; MDEPTH],
|
||
flopac: vec![0.0; MDEPTH],
|
||
}
|
||
}
|
||
}
|
||
|
||
#[cfg(test)]
|
||
mod tests {
|
||
use super::*;
|
||
|
||
#[test]
|
||
fn test_model_state_creation() {
|
||
let state = ModelState::new();
|
||
assert_eq!(state.modpar.temp.len(), MDEPTH);
|
||
assert_eq!(state.levpop.popul.len(), MLEVEL);
|
||
}
|
||
|
||
#[test]
|
||
fn test_temperature_accessor() {
|
||
let mut state = ModelState::new();
|
||
state.modpar.temp[0] = 10000.0;
|
||
assert!((state.temperature(0) - 10000.0).abs() < 1e-10);
|
||
assert_eq!(state.temperature(MDEPTH), 0.0); // 越界
|
||
}
|
||
|
||
#[test]
|
||
fn test_population_accessor() {
|
||
let mut state = ModelState::new();
|
||
state.levpop.popul[0][0] = 1e10;
|
||
assert!((state.population(0, 0) - 1e10).abs() < 1e-5);
|
||
}
|
||
}
|