starfall/astronomy/star/math/radius/
mod.rs

1use crate::astronomy::star::constants::*;
2use crate::astronomy::star::error::Error;
3
4/// Get the radius of a main-sequence star in Rsol based on its Msol.
5#[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    // Jolly ol' Sol
37    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    // M1V
42    mass = 0.40;
43    expected = 0.480;
44    actual = star_mass_to_radius(mass)?;
45    assert_approx_eq!(expected, actual, 1e-3f64);
46    // K9V
47    mass = 0.50;
48    expected = 0.574;
49    actual = star_mass_to_radius(mass)?;
50    assert_approx_eq!(expected, actual, 1e-3f64);
51    // G7V
52    mass = 0.90;
53    expected = 0.919;
54    actual = star_mass_to_radius(mass)?;
55    assert_approx_eq!(expected, actual, 1e-3f64);
56    // F6V
57    mass = 1.20;
58    expected = 1.110;
59    actual = star_mass_to_radius(mass)?;
60    assert_approx_eq!(expected, actual, 1e-3f64);
61    // A6V
62    mass = 1.70;
63    expected = 1.353;
64    actual = star_mass_to_radius(mass)?;
65    assert_approx_eq!(expected, actual, 1e-3f64);
66    // B5V
67    mass = 8.0;
68    expected = 3.272;
69    actual = star_mass_to_radius(mass)?;
70    assert_approx_eq!(expected, actual, 1f64);
71    // O8V
72    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}