115 lines
2.6 KiB
Rust
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);
|
|
}
|
|
}
|