SpectraRust/src/math/raph.rs
2026-03-19 14:05:33 +08:00

73 lines
1.7 KiB
Rust

//! 辅助函数。
//!
//! 重构自 TLUSTY `raph.f`
/// hedif 子程序的辅助函数。
///
/// 计算用于氢氦扩散的辅助量。
///
/// # 参数
///
/// * `gam` - gamma 参数
/// * `z1` - z1 参数
/// * `z2` - z2 参数
/// * `a1` - a1 参数
/// * `a2` - a2 参数
///
/// # 返回值
///
/// dgam 值。
pub fn raph(gam: f64, z1: f64, z2: f64, a1: f64, a2: f64) -> f64 {
let b = 1.0 + gam;
let c = z1 + z2 * gam;
let d = a1 + a2 * gam;
let e = (1.0 + z1) + gam * (1.0 + z2);
let den = (c * d / (gam * b)) + (d * (z1 - z2) * (z1 - z2) / (b * e));
let dnum = e * (a2 * z1 - a1 * z2) + d * (z2 - z1);
dnum / den
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_raph_basic() {
// 基本测试
let result = raph(1.0, 0.5, 0.3, 1.0, 2.0);
assert!(result.is_finite());
}
#[test]
fn test_raph_symmetry() {
// 测试一些边界情况
let result1 = raph(0.5, 1.0, 1.0, 1.0, 1.0);
// 当 z1 = z2 且 a1 = a2 时
let result2 = raph(0.5, 1.0, 1.0, 1.0, 1.0);
assert!((result1 - result2).abs() < 1e-15);
}
#[test]
fn test_raph_values() {
// 验证计算
let gam = 2.0;
let z1 = 1.0;
let z2 = 2.0;
let a1 = 0.5;
let a2 = 1.5;
let b = 1.0 + gam;
let c = z1 + z2 * gam;
let d = a1 + a2 * gam;
let e = (1.0 + z1) + gam * (1.0 + z2);
let den = (c * d / (gam * b)) + (d * (z1 - z2) * (z1 - z2) / (b * e));
let dnum = e * (a2 * z1 - a1 * z2) + d * (z2 - z1);
let expected = dnum / den;
let result = raph(gam, z1, z2, a1, a2);
assert!((result - expected).abs() < 1e-15);
}
}