starfall/astronomy/star/math/radius/
mod.rs1use crate::astronomy::star::constants::*;
2use crate::astronomy::star::error::Error;
3
4#[named]
6pub fn star_mass_to_radius(mass: f64) -> Result<f64, Error> {
7 trace_enter!();
8 trace_var!(mass);
9 if mass <= MINIMUM_MASS {
10 return Err(Error::MassTooLowForMainSequence);
11 }
12 if mass >= MAXIMUM_MASS {
13 return Err(Error::MassTooHighForMainSequence);
14 }
15 let result = match mass {
16 mass if mass < 1.0 => mass.powf(0.80),
17 mass if mass >= 1.0 => mass.powf(0.57),
18 _ => unreachable!(),
19 };
20 trace_var!(result);
21 trace_exit!();
22 Ok(result)
23}
24
25#[cfg(test)]
26pub mod test {
27
28 use super::*;
29 use crate::test::*;
30
31 #[named]
32 #[test]
33 pub fn test_ms_star_mass_to_radius() -> Result<(), Error> {
34 init();
35 trace_enter!();
36 let mut mass = 1.0;
38 let mut expected = 1.0;
39 let mut actual = star_mass_to_radius(mass)?;
40 assert_approx_eq!(expected, actual);
41 mass = 0.40;
43 expected = 0.480;
44 actual = star_mass_to_radius(mass)?;
45 assert_approx_eq!(expected, actual, 1e-3f64);
46 mass = 0.50;
48 expected = 0.574;
49 actual = star_mass_to_radius(mass)?;
50 assert_approx_eq!(expected, actual, 1e-3f64);
51 mass = 0.90;
53 expected = 0.919;
54 actual = star_mass_to_radius(mass)?;
55 assert_approx_eq!(expected, actual, 1e-3f64);
56 mass = 1.20;
58 expected = 1.110;
59 actual = star_mass_to_radius(mass)?;
60 assert_approx_eq!(expected, actual, 1e-3f64);
61 mass = 1.70;
63 expected = 1.353;
64 actual = star_mass_to_radius(mass)?;
65 assert_approx_eq!(expected, actual, 1e-3f64);
66 mass = 8.0;
68 expected = 3.272;
69 actual = star_mass_to_radius(mass)?;
70 assert_approx_eq!(expected, actual, 1f64);
71 mass = 25.0;
73 expected = 6.264;
74 actual = star_mass_to_radius(mass)?;
75 assert_approx_eq!(expected, actual, 1f64);
76 trace_exit!();
77 Ok(())
78 }
79}