SpectraRust/src/tlusty/state/model.rs
2026-04-01 16:35:36 +08:00

3156 lines
83 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//! 大气模型状态。
//!
//! 重构自 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);
}
}