//! 特殊光电离截面评估。 //! //! 重构自 TLUSTY `spsigk.f` //! //! 非标准光电离截面评估,用户自定义过程。 use crate::math::{carbon, hidalg, reiman, sghe12}; /// 特殊光电离截面。 /// /// 根据能级索引 IB 选择适当的光电离截面计算方法。 /// /// # 参数 /// /// * `ib` - 能级索引 (负值表示特殊处理) /// * `fr` - 频率 (Hz) /// /// # 返回值 /// /// 光电离截面 (cm²)。 /// /// # 备注 /// /// 基本上是用户自定义过程,这里提供一些示例: /// - IB = -201: He I 基态的特殊公式 /// - IB = -202: He I 平均能级 /// - IB = -602, -603: C I 基态组态能级 2p² ¹D 和 ¹S /// - IB = -101 到 -137: Hidalgo (1968) 数据 /// - IB = -301 到 -337: Reilman & Manson (1979) 数据 pub fn spsigk(ib: i32, fr: f64) -> f64 { // He I 基态的特殊公式 if ib == -201 { return 7.3e-18 * (1.373 - 2.311e-16 * fr).exp(); } // He I 平均能级 if ib == -202 { return sghe12(fr); } // C I 基态组态能级 2p² ¹D 和 ¹S if ib == -602 || ib == -603 { return carbon(ib, fr); } // Hidalgo (Ap.J. 153, 981, 1968) 光电离数据 if ib >= -137 && ib <= -101 { return hidalg(ib, fr); } // Reilman & Manson (Ap.J. Suppl. 40, 815, 1979) 光电离数据 if ib >= -337 && ib <= -301 { return reiman(ib, fr); } // 默认返回 0 0.0 } #[cfg(test)] mod tests { use super::*; use approx::assert_relative_eq; #[test] fn test_spsigk_he_ground() { // He I 基态 let result = spsigk(-201, 1e16); assert!(result.is_finite()); assert!(result > 0.0); } #[test] fn test_spsigk_he_n2() { // He I let result = spsigk(-202, 1e16); assert!(result.is_finite()); } #[test] fn test_spsigk_carbon_d() { // C I 2p² ¹D let result = spsigk(-602, 1e16); assert!(result.is_finite()); } #[test] fn test_spsigk_carbon_s() { // C I 2p² ¹S let result = spsigk(-603, 1e16); assert!(result.is_finite()); } #[test] fn test_spsigk_hidalgo() { // Hidalgo 数据 let result = spsigk(-101, 1e16); assert!(result.is_finite()); } #[test] fn test_spsigk_reiman() { // Reilman & Manson 数据 let result = spsigk(-301, 1e16); assert!(result.is_finite()); } #[test] fn test_spsigk_unknown() { // 未知索引返回 0 let result = spsigk(-999, 1e16); assert_relative_eq!(result, 0.0, epsilon = 1e-30); } }