//! 大气模型状态。 //! //! 重构自 TLUSTY `MODELQ.FOR` 中的 COMMON 块。 //! 包含温度、密度、电子密度、占据数等物理状态。 use super::constants::*; // ============================================================================ // MODPAR - 模型参数 // ============================================================================ /// 模型基本参数。 /// 对应 COMMON /MODPAR/ #[derive(Debug, Clone)] pub struct ModPar { /// 深度 (柱质量密度, g/cm²) pub dm: Vec, /// 温度 (K) pub temp: Vec, /// 电子密度 (cm⁻³) pub elec: Vec, /// 总粒子密度 (cm⁻³) pub dens: Vec, /// 总粒子数 pub totn: Vec, /// 总原子密度 pub anto: Vec, /// 金属原子密度 pub anma: Vec, /// 中性氢密度 pub anh1: Vec, /// 深度变量 pub zd: Vec, // 辅助温度量 /// h/kT pub hkt1: Vec, /// 1/T pub tk1: Vec, /// h/(kT)² pub hkt21: Vec, /// sqrt(T) pub sqt1: Vec, // 迭代中间量 pub temp1: Vec, pub elec1: Vec, pub dens1: Vec, pub densi: Vec, pub densim: Vec, // 散射相关 /// 电子散射不透明度 pub elscat: Vec, /// 线性化辐射参数 pub alab: Vec, // 深度差分 pub deldm: Vec, pub dedm1: f64, pub deldmz: Vec, // 速度场 pub thetav: Vec, pub viscd: Vec, 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>, /// Boltzmann 因子 pub bfac: Vec>, /// 逆占据数 pub popinv: Vec>, /// 当前深度占据数 pub popgrp: Vec, pub pop: Vec, /// 束缚-自由源函数 pub sbf: Vec, pub dsbf: Vec, /// 离子配分函数 pub usum: Vec, } 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>, /// 历史占据数 2 (能级 × 深度) pub popul2: Vec>, /// 历史占据数 3 (能级 × 深度) pub popul3: Vec>, } 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, pub gf1: Vec, pub gf2: Vec, pub gf3: Vec, pub gf4: Vec, pub gf5: Vec, pub gf6: Vec, /// Gaunt 因子导数 pub gf0d: Vec, pub gf1d: Vec, pub gf2d: Vec, pub gf3d: Vec, pub gf4d: Vec, pub gf5d: Vec, pub gf6d: Vec, /// 温度步长 pub deltt: Vec, } 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>, /// 频率相关深度 pub fhd: Vec, /// 吸收系数 × 辐射 pub fak: Vec>, pub radk: Vec>, /// 外辐射 pub extrad: Vec, /// 外辐射强度 (频率 × 角度) pub extint: Vec>, /// 氦外辐射 pub hextrd: Vec, /// 外部辐照角度参数 (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, pub ali1: Vec, pub fak1: Vec, pub radcm: Vec>, pub radl: Vec>, pub absali: Vec>, pub alih1: Vec, } 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, /// 频率权重 pub w: Vec, /// 谱线轮廓 pub prof: Vec, /// 谱线权重 pub wch: Vec, // 索引数组 pub jik: Vec, pub ijx: Vec, pub ijbf: Vec, pub ifs0: i32, pub kij: Vec, pub lskip: Vec>, } 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>, } 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, /// 束缚-自由截面 (MCROSS × MFREQC) pub bfcs: Vec>, /// 频率索引 pub ifreqb: Vec, } 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, } impl ObfPar { pub fn new() -> Self { Self { itrbf: vec![0; MBF], } } } // ============================================================================ // LEVADD - 能级附加数组 // ============================================================================ /// 能级附加数组。 /// 对应 COMMON /LEVADD/ #[derive(Debug, Clone, Default)] pub struct LevAdd { /// 离子配分函数和 (离子 × 深度) pub usums: Vec>, /// 配分函数温度导数 pub dusmt: Vec>, /// 配分函数密度导数 pub dusmn: Vec>, /// 双电子复合截面 (离子 × 深度) pub diesig: Vec>, } 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>, /// He II 能级占据概率 (NLMX × 深度) pub wnheii: Vec>, /// 能级权重 (能级 × 深度) pub wop: Vec>, /// 能级权重标志 (负值表示合并能级) pub ifwop: Vec, } 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, /// 频率参考 FRCH (MMER) pub frch: Vec, /// 截面扩展 (MMER × 深度) pub sgext1: Vec>, /// Gaunt 因子 (MMER × 深度) pub gmer: Vec>, /// 截面求和 (NLMX × MMER × 深度) - 3D 数组 pub sgmsum: Vec>>, /// 截面求和导数 (NLMX × MMER × 深度) - 3D 数组 pub sgmsud: Vec>>, /// Gaunt 因子 (MMER × 深度) pub sgmg: Vec>, /// 能级到合并能级的映射 (MLEVEL) pub imrg: Vec, /// 合并能级到能级的映射 (MMER) pub iimer: Vec, } 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, /// Planck 函数系数 BNUE = 2h*nu³/c² pub bnue: Vec, /// 连续谱权重 pub wc: Vec, /// 跃迁到连续谱的索引 pub ijtc: Vec, /// ALI 频率索引 pub ijali: Vec, /// 显式频率索引 pub ijex: Vec, /// 频率索引 pub ijfr: Vec, } 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, /// 辐射扩散因子 pub redif: Vec, /// τ 分割点 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, /// 湍流速度平方 VTURBS(MDEPTH) pub vturbs: Vec, /// 湍流速度参数 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, /// 当前谱线展宽 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, /// 气体压力 pub pgs: Vec, /// 辐射压力 (总) pub pradt: Vec, /// 辐射压力 (吸收) pub prada: Vec, } 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, /// 修正因子 pub acor: Vec, /// Z³ (Z = 1..MZZ) pub z3: Vec, /// 溶解分数参数 1 pub dwc1: Vec>, /// 溶解分数参数 2 pub dwc2: Vec, /// 溶解分数 (MMCDW × MDEPTH) pub dwf1: Vec>, /// 跃迁到溶解分数的映射 (MTRANS) pub mcdw: Vec, /// 溶解分数到跃迁的映射 (MMCDW) pub itrcdw: Vec, /// 溶解分数计数 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, /// 每个频率点的跃迁索引 pub ijlin: Vec, /// 谱线跃迁索引 (MITJ × MFREQ) pub itrlin: Vec>, } 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, } 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, } impl Default for CompIf { fn default() -> Self { Self { linexp: vec![false; MTRANS], } } } // ============================================================================ // CUROPA - 当前不透明度 // ============================================================================ /// 当前不透明度参数。 /// 对应 COMMON /CUROPA/ #[derive(Debug, Clone)] pub struct CurOpa { /// 吸收系数 pub abso1: Vec, /// 发射系数 pub emis1: Vec, /// 散射系数 pub scat1: Vec, /// 总吸收 pub absot: Vec, /// 显式频率吸收 pub absoe1: Vec, /// 电子发射 pub emel1: Vec, /// 谱线吸收 pub abso1l: Vec, /// 谱线发射 pub emis1l: Vec, /// 不透明度导数 (压力) pub absopr: Vec, /// 发射导数 (压力) pub emispr: Vec, } 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, /// 氢线波长 WLHYD(MLINH,MHWL) pub wlhyd: Vec, /// 波长网格 WLH(MHWL,MLINH) pub wlh: Vec, /// 温度网格 XTLEM(MHT,MLINH) pub xtlem: Vec, /// 电子密度网格 XNELEM(MHE,MLINH) pub xnelem: Vec, /// 每条线的波长点数 NWLHYD(MLINH) pub nwlhyd: Vec, /// 波长点数 NWLH(MLINH) pub nwlh: Vec, /// 温度点数 NTH(MLINH) pub nth: Vec, /// 电子密度点数 NEH(MLINH) pub neh: Vec, /// 线索引 ILINH(4,22) pub ilinh: Vec, /// 氢线表格读取标志 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, /// 轮廓表 PRFXR(MLINH,MHWL,MHT,MHE) - 红翼 pub prfxr: Vec, /// 波长表 ALXEN(MLINH,MHWL) pub alxen: Vec, /// 温度网格 XTXEN(MHT,MLINH) pub xtxen: Vec, /// 电子密度网格 XNEXEN(MHE,MLINH) pub xnexen: Vec, /// 电子密度最小值 pub xnemin: f64, /// 每条线的波长点数 NWLXEN(MLINH) pub nwlxen: Vec, /// 每条线的温度点数 NTHXEN(MLINH) pub nthxen: Vec, /// 每条线的电子密度点数 NEHXEN(MLINH) pub nehxen: Vec, /// 线索引 ILXEN(4,22) pub ilxen: Vec, /// 氢线标志 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, /// 氦 Rayleigh 散射截面 (MFREQ) pub rche: Vec, /// H2 Rayleigh 散射截面 (MFREQ) pub rch2: Vec, } 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>, /// 原子粒子数密度 (100 × MDEPTH) pub anato: Vec>, /// 离子粒子数密度 (100 × MDEPTH) pub anion: Vec>, } 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, /// 频率相关权重因子 (MFREQ) pub fh: Vec, /// 表面辐射强度 Q0 (MFREQ) pub q0: Vec, /// 表面辐射强度 UU0 (MFREQ) pub uu0: Vec, } 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, /// 1 - XKF (MDEPTH) pub xkf1: Vec, /// 普朗克函数 × XKF (MDEPTH) pub xkfb: Vec, } 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, /// 固定辐射通量 (MDEPTH) pub flfix: Vec, /// 显式频率辐射通量 (MDEPTH) pub flexp: Vec, /// 冷却率 (MDEPTH) pub fcool: Vec, /// 冷却率积分 (MDEPTH) pub fcooli: Vec, /// 辐射通量红翼 (MDEPTH) pub flrd: Vec, /// 辐射压力 (MDEPTH) pub fprad: Vec, /// 辐射梯度 (MDEPTH) pub grad: Vec, /// 辐射压力导数 (MDEPTH) pub fprd: Vec, /// 频率相关辐射梯度 (MFREQ × MDEPTH) pub gradf: Vec>, } 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>, /// 零占据数标志 [MLEVEL × MDEPTH] pub ipzero: Vec>, /// 能级组零占据标志 [MLVEXP × MDEPTH] pub igzero: Vec>, } 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>, /// 线性化相对占据数 [MLEVEL × MDEPTH] pub sblpsi: Vec>, /// 相对占据数温度导数 [MLEVEL × MDEPTH] pub dsbpst: Vec>, /// 相对占据数电子密度导数 [MLEVEL × MDEPTH] pub dsbpsn: Vec>, /// LTE 参考标志 [MLEVEL × MDEPTH] pub iltref: Vec>, /// 真实 LTE 参考标志 [MLEVEL × MDEPTH] pub ilterf: Vec>, /// 引导能级索引 [MLEVEL] pub iguide: Vec, } 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, /// 电子密度向量 (ln) [MTABEH] pub elevec: Vec, /// 频率表 [MFHTAB] pub frgtab: Vec, /// 氢截面表 (温度 × 电子密度 × 频率) [MTABTH × MTABEH × MFHTAB] pub hydcrs: Vec>>, } 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, /// 频率插值索引 [MFREQ] pub jgint: Vec, } 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, 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, pub alip1: Vec, } 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, /// 辅助压力 [MDEPTH] pub pra: Vec, /// 初始气体压 [MDEPTH] pub pgs0: Vec, /// 压力系数 [MDEPTH] pub antp: Vec, } 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, 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>, pub psy1: Vec>, pub psy2: Vec>, pub psy3: Vec>, } 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>, pub pn: Vec>, pub pp: Vec>, } 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, pub dusumn: Vec, } 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>, pub sff2: Vec>, pub dsff: Vec>, pub cffn: Vec, pub cfft: Vec, } 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>, pub emtra: Vec>, pub demlt: Vec>, } 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>, pub rrd: Vec>, pub drdt: Vec>, pub rddp: Vec>, pub rddm: Vec>, } 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>, pub coltar: Vec>, } 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, pub sumdpl: Vec, pub abplad: Vec, 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, } 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, 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, } 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, pub delta: Vec, } 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, pub rsbx: Vec, } 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, pub tauflx: Vec, pub tauthe: Vec, pub theta: Vec, pub tross: Vec, } 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, } 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, 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>, pub enev: [[f64; 30]; 99], pub ioniz: Vec, pub iref: i32, pub irefa: i32, pub lgr: Vec, pub lrm: Vec, } 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, /// 表中的丰度原始值 pub abuno: Vec, /// 表中的分子温度限 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, } 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, pub bnus: Vec, pub cder10: Vec, pub cder1p: Vec, pub cder1m: Vec, pub cder20: Vec, pub cder2p: Vec, pub cder2m: Vec, pub delj: Vec>, } 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>, /// GFP - 频率导数系数 (后向) pub gfp: Vec>, } 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, pub dtvist: Vec, pub dtvisn: Vec, pub dtvisr: Vec, } 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, } 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, pub rhovec: Vec, pub rhomat: Vec>, } 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, pub frtlim: f64, pub absopac: Vec>>, } 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>, pub raysc: Vec, } 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, pub elevec: Vec, } 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, pub hydcrs: Vec>>, } 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>, /// 扩展 Eddington 因子 [MFREX × MDEPTH] pub fakex: Vec>, } 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, pub comb: Vec, pub comc: Vec, pub vl: Vec, pub come: Vec, pub u: Vec, pub v: Vec, pub bs: Vec, pub al: Vec, pub be: Vec, pub ga: Vec, } 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, pub cden10: Vec, pub cden2m: Vec, pub cden20: Vec, } 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, } 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, } 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, /// 插值索引 pub jint: Vec, } 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, /// 三对角矩阵对角线 (辐射转移) pub rb: Vec, /// 三对角矩阵上对角线 (辐射转移) pub rc: Vec, /// 辐射转移右端项 pub vr: Vec, /// 三对角矩阵下对角线 (温度导数) pub ua: Vec, /// 三对角矩阵对角线 (温度导数) pub ub: Vec, /// 三对角矩阵上对角线 (温度导数) pub uc: Vec, /// 三对角矩阵下对角线 (辐射平衡) pub va: Vec, /// 三对角矩阵对角线 (辐射平衡) pub vb: Vec, /// 三对角矩阵上对角线 (辐射平衡) pub vc: Vec, /// 辐射平衡右端项 pub wr: Vec, /// 完整矩阵 (辐射平衡) pub wm: Vec>, } 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>, /// x = log10(nu/nu0) 拟合点 pub xop: Vec>, /// 当前能级的拟合点数 pub nop: Vec, /// Opacity Project 数据中的总能级数 pub ntotop: i32, /// 能级标识符 pub idlvop: Vec, /// 数据是否已读入 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, /// 轮廓函数 (波长 × 密度阶) pub plalp: Vec>, /// 中性密度标准化 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, /// 轮廓函数 (波长 × 密度阶) pub plbet: Vec>, /// 中性密度标准化 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, /// 轮廓函数 (波长 × 密度阶) pub plgam: Vec>, /// 中性密度标准化 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, /// 轮廓函数 (波长 × 密度阶) pub plbal: Vec>, /// 中性密度标准化 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>, /// 轮廓函数 (波长 × 密度阶 × 温度) pub plalpd: Vec>>, /// 中性密度标准化 (温度) pub stnead: Vec, /// 电荷密度标准化 (温度) pub stnchd: Vec, /// 中性密度幂指数 (温度) pub vneuad: Vec, /// 电荷密度幂指数 (温度) pub vchaad: Vec, /// 温度值 (温度) pub talpd: Vec, /// 数据点数 (温度) pub nxalpd: Vec, /// 温度数 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, /// 散射对密度的导数 pub dscn1: Vec, } 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, /// 表面 H 通量 pub exth: Vec, } 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, /// 积分 H (Eddington 通量) pub toth: Vec, /// 积分 K (辐射压) pub totk: Vec, /// Rosseland 平均不透明度 × 密度 pub rdopac: Vec, /// 通量平均不透明度 pub flopac: Vec, } 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); } }