//! SYNSPEC 氢线窗口初始化。 //! //! 重构自 SYNSPEC 54 的 HYLSEW 子程序。 /// 氢线窗口参数 #[derive(Debug, Clone)] pub struct HylsewOutput { /// 是否包含氢线 (0=否, 1=是) pub ihylw: i32, /// 线数参数 pub m20w: i32, /// 最低主量子数索引 pub ilowhw: i32, /// 线翼参数 pub m10w: i32, } /// 初始化氢线处理窗口。 /// /// 根据频率和重力加速度判断是否包含氢线,并设置相关参数。 /// /// # Arguments /// * `ij` - 频率索引 /// * `freq` - 频率值 (Hz) /// * `grav` - 重力加速度 (log g) /// /// # Returns /// 氢线窗口参数 pub fn hylsew(_ij: usize, freq: f64, grav: f64) -> HylsewOutput { let mut output = HylsewOutput { ihylw: 0, m20w: 0, ilowhw: 0, m10w: 0, }; // 检查频率是否在氢线范围内 if freq >= 3.28805e15 { return output; } let al0 = 2.997925e17 / freq; let al1 = al0; // 根据重力加速度检查波长范围 if grav < 6.0 { if al0 > 160.0 && al1 < 364.6 { return output; } if al0 > 506.0 && al1 < 630.0 { return output; } if al0 > 680.0 && al1 < 820.3 { return output; } } else { if al0 > 540.0 && al1 < 600.0 { return output; } if al0 > 720.0 && al1 < 820.3 { return output; } } // 包含氢线 output.ihylw = 1; output.m20w = 40; // 确定最低主量子数 let frion = if al1 < 364.6 { output.ilowhw = 1; 3.28805e15 } else if al1 < 820.0 { output.ilowhw = 2; 8.2225e14 } else if al1 < 1458.0 { output.ilowhw = 3; 3.6544142e14 } else if al1 < 2278.0 { output.ilowhw = 4; 2.0555837e14 } else if al1 < 3281.0 { output.ilowhw = 5; 1.315589e14 } else if al1 < 4466.0 { output.ilowhw = 6; 9.136394e13 } else { output.ilowhw = 7; 6.7120228e13 }; // 计算线翼参数 if frion > freq { output.m10w = (3.289017e15 / (frion - freq).abs()).sqrt() as i32; } output } #[cfg(test)] mod tests { use super::*; #[test] fn test_hylsew_high_freq() { // 频率太高,不包含氢线 let result = hylsew(1, 4.0e15, 4.0); assert_eq!(result.ihylw, 0); } #[test] fn test_hylsew_lyman_region() { // Lyman 系区域 let result = hylsew(1, 3.0e15, 4.0); assert_eq!(result.ihylw, 1); assert_eq!(result.ilowhw, 1); } #[test] fn test_hylsew_balmer_region() { // Balmer 系区域 (500 Å,在 Lyman 极限和 Balmer 极限之间) let freq = 2.997925e17 / 500.0; let result = hylsew(1, freq, 4.0); assert_eq!(result.ihylw, 1); assert_eq!(result.ilowhw, 2); } #[test] fn test_hylsew_high_gravity() { // 高重力情况 let freq = 2.997925e17 / 550.0; let result = hylsew(1, freq, 7.0); assert_eq!(result.ihylw, 0); } }