SpectraRust/src/math/spsigk.rs
2026-03-19 22:16:23 +08:00

115 lines
2.6 KiB
Rust

//! 特殊光电离截面评估。
//!
//! 重构自 TLUSTY `spsigk.f`
//!
//! 非标准光电离截面评估,用户自定义过程。
use crate::math::{carbon, hidalg, reiman, sghe12};
/// 特殊光电离截面。
///
/// 根据能级索引 IB 选择适当的光电离截面计算方法。
///
/// # 参数
///
/// * `ib` - 能级索引 (负值表示特殊处理)
/// * `fr` - 频率 (Hz)
///
/// # 返回值
///
/// 光电离截面 (cm²)。
///
/// # 备注
///
/// 基本上是用户自定义过程,这里提供一些示例:
/// - IB = -201: He I 基态的特殊公式
/// - IB = -202: He I <n=2> 平均能级
/// - 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 <n=2> 平均能级
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 <n=2>
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);
}
}