//! 运行时配置参数。 //! //! 重构自 TLUSTY `BASICS.FOR` 中的控制 COMMON 块。 use super::constants::*; // ============================================================================ // BASNUM - 基本数值计数器 // ============================================================================ /// 基本数值计数器。 /// 对应 COMMON /BASNUM/ #[derive(Debug, Clone)] pub struct BasNum { /// 显式原子数 pub natom: i32, /// 显式离子数 pub nion: i32, /// 显式能级数 pub nlevel: i32, /// 跃迁数 pub ntrans: i32, /// 深度点数 pub nd: i32, /// 频率点数 pub nfreq: i32, /// 连续谱频率数 pub nfreqc: i32, /// 线性化频率数 pub nfreqe: i32, // 各种选项标志 pub ioptab: i32, pub idisk: i32, pub izscal: i32, pub idmfix: i32, pub iheso6: i32, pub ifmol: i32, pub ifentr: i32, pub nfreql: i32, pub nlev0: i32, pub icolhn: i32, pub ioscor: i32, pub ilgder: i32, pub ifryb: i32, pub ifrset: i32, pub nfread: i32, pub nelsc: i32, pub ntranc: i32, pub iover: i32, pub jali: i32, pub ibc: i32, pub iubc: i32, pub intens: i32, pub irder: i32, pub ilmcor: i32, pub ifdiel: i32, pub ifalih: i32, pub iftene: i32, pub itndre: i32, pub ilpsct: i32, pub ilasct: i32, pub irte: i32, pub idlte: i32, pub ibfint: i32, pub intrpl: i32, pub ichang: i32, pub natoms: i32, pub ipslte: i32, pub ispodf: i32, pub itlucy: i32, pub nretc: i32, pub ifrayl: i32, pub ifprad: i32, } impl Default for BasNum { fn default() -> Self { Self { natom: 0, nion: 0, nlevel: 0, ntrans: 0, nd: 0, nfreq: 0, nfreqc: 0, nfreqe: 0, ioptab: 0, idisk: 0, izscal: 0, idmfix: 0, iheso6: 0, ifmol: 0, ifentr: 0, nfreql: 0, nlev0: 0, icolhn: 0, ioscor: 0, ilgder: 0, ifryb: 0, ifrset: 0, nfread: 0, nelsc: 0, ntranc: 0, iover: 0, jali: 0, ibc: 0, iubc: 0, intens: 0, irder: 0, ilmcor: 0, ifdiel: 0, ifalih: 0, iftene: 0, itndre: 0, ilpsct: 0, ilasct: 0, irte: 0, idlte: 0, ibfint: 0, intrpl: 0, ichang: 0, natoms: 0, ipslte: 0, ispodf: 0, itlucy: 0, nretc: 0, ifrayl: 0, ifprad: 0, } } } // ============================================================================ // INPPAR - 输入参数 // ============================================================================ /// 输入参数。 /// 对应 COMMON /INPPAR/ #[derive(Debug, Clone)] pub struct InpPar { /// 有效温度 (K) pub teff: f64, /// 表面重力 (cm/s²) pub grav: f64, /// 总 He 丰度 (质量分数) pub ytot: Vec, /// 平均分子量 pub wmm: Vec, /// He 质量分数 pub wmy: Vec, /// 分子温度极限 pub tmolim: f64, // 恒星风参数 pub xmstar: f64, pub xmdot: f64, pub rstar: f64, pub alpha0: f64, pub reynum: f64, // 引力相关 pub qgrav: f64, pub edisc: f64, pub dzeta: f64, pub reldst: f64, // 粘性参数 pub visc: f64, pub zeta0: f64, pub zeta1: f64, pub dmvisc: f64, pub fractv: f64, // 自转参数 pub omeg32: f64, pub wbarm: f64, pub wbar: f64, pub alphav: f64, pub pgas0: f64, // 控制参数 pub bergfc: f64, // β 引力因子 (wn.f 使用) pub cutlym: f64, pub cutbal: f64, // 选项标志 pub isplin: i32, pub irsplt: i32, pub ivisc: i32, pub ibche: i32, pub lte: bool, pub ltgrey: bool, pub lchc: bool, pub lresc: bool, } impl InpPar { pub fn new() -> Self { Self { teff: 10000.0, grav: 4.44, // log g = 4.44 (太阳) ytot: vec![0.0; MDEPTH], wmm: vec![0.0; MDEPTH], wmy: vec![0.0; MDEPTH], tmolim: 0.0, xmstar: 0.0, xmdot: 0.0, rstar: 0.0, alpha0: 0.0, reynum: 0.0, qgrav: 0.0, edisc: 0.0, dzeta: 0.0, reldst: 0.0, visc: 0.0, zeta0: 0.0, zeta1: 0.0, dmvisc: 0.0, fractv: 0.0, omeg32: 0.0, wbarm: 0.0, wbar: 0.0, alphav: 0.0, pgas0: 0.0, bergfc: 1.0, // 默认值 cutlym: 0.0, cutbal: 0.0, isplin: 0, irsplt: 0, ivisc: 0, ibche: 0, lte: false, ltgrey: false, lchc: false, lresc: false, } } } impl Default for InpPar { fn default() -> Self { Self::new() } } // ============================================================================ // MATKEY - 材料键 // ============================================================================ /// 材料键。 /// 对应 COMMON /MATKEY/ #[derive(Debug, Clone, Default)] pub struct MatKey { pub nn: i32, pub nn0: i32, pub inhe: i32, pub inre: i32, pub inpc: i32, pub inse: i32, pub inzd: i32, pub inmp: i32, pub ndre: i32, pub insel: i32, } // ============================================================================ // RUNKEY - 运行控制 // ============================================================================ /// 运行控制键。 /// 对应 COMMON /RUNKEY/ #[derive(Debug, Clone, Default)] pub struct RunKey { pub chmax: f64, pub iter: i32, pub niter: i32, pub nitzer: i32, pub init: i32, pub lac2: i32, pub lfin: i32, } // ============================================================================ // CONKEY - 收敛控制 // ============================================================================ /// 收敛控制键。 /// 对应 COMMON /CONKEY/ #[derive(Debug, Clone, Default)] pub struct ConKey { pub hmix0: f64, pub crflim: f64, pub nconit: i32, pub iconv: i32, pub indl: i32, pub ipress: i32, pub itemp: i32, pub icbeg: i32, pub itmcor: i32, pub iconre: i32, pub ideepc: i32, pub ndcgap: i32, pub idconz: i32, } // ============================================================================ // OPCPAR - 额外不透明度控制 // ============================================================================ /// 额外不透明度控制。 /// 对应 COMMON /OPCPAR/ #[derive(Debug, Clone, Default)] pub struct OpcPar { pub iophmi: i32, // H⁻ pub ioph2p: i32, // H₂⁺ pub iophem: i32, // He⁻ pub iopch: i32, // CH pub iopoh: i32, // OH pub ioph2m: i32, // H₂⁻ pub ioh2h2: i32, // H₂-H₂ CIA pub ioh2he: i32, // H₂-He CIA pub ioh2h: i32, // H₂-H CIA pub iohhe: i32, // H-He CIA pub iophli: i32, // H⁻ 自由-自由 pub irsct: i32, // 汤姆逊散射 pub irsche: i32, // He 散射 pub irsch2: i32, // H₂ 散射 pub keepop: i32, pub iopold: i32, } // ============================================================================ // PRINTS - 打印控制 // ============================================================================ /// 打印控制。 /// 对应 COMMON /PRINTS/ #[derive(Debug, Clone, Default)] pub struct Prints { pub iprint: i32, pub ipring: i32, pub iprind: i32, pub iprinp: i32, pub icoolp: i32, pub ichckp: i32, pub ipopac: i32, pub iprini: i32, } // ============================================================================ // ANGLES - 角度设置 // ============================================================================ /// 角度设置。 /// 对应 COMMON /ANGLES/ #[derive(Debug, Clone)] pub struct Angles { /// 角度余弦值 pub amu: Vec, /// 角度权重 pub wtmu: Vec, /// 角度函数 pub fmu: Vec, /// 角度点数 pub nmu: i32, } impl Default for Angles { fn default() -> Self { Self { amu: vec![0.0; MMU], wtmu: vec![0.0; MMU], fmu: vec![0.0; MMU], nmu: 0, } } } // ============================================================================ // COMPTN - Compton 散射角度参数 // ============================================================================ /// Compton 散射角度参数。 /// 对应 COMMON /COMPTN/ 和 /ANGNUM/ #[derive(Debug, Clone)] pub struct Comptn { /// 角度余弦值 pub amuc: Vec, /// 角度权重 pub wtmuc: Vec, /// amuc * wtmuc pub amuc1: Vec, /// amuc² * wtmuc pub amuc2: Vec, /// amuc³ * wtmuc pub amuc3: Vec, /// 角度相关量 pub amuj: Vec, pub amuk: Vec, pub amuh: Vec, pub amun: Vec, /// Compton 散射 α 系数 pub calph: Vec>, /// Compton 散射 β 系数 pub cbeta: Vec>, /// Compton 散射 γ 系数 pub cgamm: Vec>, /// 辐射零点 pub radzer: f64, /// Compton 频率 pub frlcom: f64, /// Compton 截面 pub sigec: Vec, /// 原始频率索引 pub ijorig: Vec, /// Compton 角度点数 pub nmuc: i32, } impl Default for Comptn { fn default() -> Self { Self { amuc: vec![0.0; MMUC], wtmuc: vec![0.0; MMUC], amuc1: vec![0.0; MMUC], amuc2: vec![0.0; MMUC], amuc3: vec![0.0; MMUC], amuj: vec![0.0; MMUC], amuk: vec![0.0; MMUC], amuh: vec![0.0; MMUC], amun: vec![0.0; MMUC], calph: vec![vec![0.0; MMUC]; MMUC], cbeta: vec![vec![0.0; MMUC]; MMUC], cgamm: vec![vec![0.0; MMUC]; MMUC], radzer: 0.0, frlcom: 0.0, sigec: vec![0.0; MFREQ], ijorig: vec![0; MFREQ], nmuc: 0, } } } // ============================================================================ // 综合配置结构 // ============================================================================ /// TLUSTY 综合配置。 /// 包含所有控制参数。 #[derive(Debug, Clone, Default)] pub struct TlustyConfig { pub basnum: BasNum, pub inppar: InpPar, pub matkey: MatKey, pub runkey: RunKey, pub conkey: ConKey, pub opcpar: OpcPar, pub prints: Prints, pub angles: Angles, pub comptn: Comptn, } impl TlustyConfig { pub fn new() -> Self { Self::default() } } #[cfg(test)] mod tests { use super::*; #[test] fn test_config_creation() { let config = TlustyConfig::new(); assert_eq!(config.basnum.natom, 0); assert_eq!(config.inppar.teff, 10000.0); } #[test] fn test_inppar_arrays() { let inppar = InpPar::new(); assert_eq!(inppar.ytot.len(), MDEPTH); } }