solar_line_core/
constants.rs

1/// Gravitational parameters (μ) for solar system bodies.
2/// Source: NASA JPL DE440/DE441
3/// Units: km³/s²
4use crate::units::{Km, Mu};
5
6/// Gravitational parameter μ = GM
7pub mod mu {
8    use super::Mu;
9
10    /// Sun μ (km³/s²) — NASA JPL DE440
11    pub const SUN: Mu = Mu(1.327_124_400_41e11);
12
13    /// Mercury μ (km³/s²)
14    pub const MERCURY: Mu = Mu(2.203_2e4);
15
16    /// Venus μ (km³/s²)
17    pub const VENUS: Mu = Mu(3.248_59e5);
18
19    /// Earth μ (km³/s²) — includes Moon contribution for geocentric work;
20    /// use EARTH_ALONE for Earth-only
21    pub const EARTH: Mu = Mu(3.986_004_418e5);
22
23    /// Mars μ (km³/s²)
24    pub const MARS: Mu = Mu(4.282_837_14e4);
25
26    /// Jupiter μ (km³/s²)
27    pub const JUPITER: Mu = Mu(1.266_865_349e8);
28
29    /// Saturn μ (km³/s²)
30    pub const SATURN: Mu = Mu(3.793_120_749e7);
31
32    /// Uranus μ (km³/s²)
33    pub const URANUS: Mu = Mu(5.793_939e6);
34
35    /// Neptune μ (km³/s²)
36    pub const NEPTUNE: Mu = Mu(6.836_529e6);
37}
38
39/// Mean orbital radii (semi-major axes) for planets around the Sun.
40/// Source: NASA fact sheets
41/// Units: km
42pub mod orbit_radius {
43    use super::Km;
44
45    /// Earth mean orbital radius (~1 AU)
46    pub const EARTH: Km = Km(149_597_870.7);
47
48    /// Mars mean orbital radius (~1.524 AU)
49    pub const MARS: Km = Km(227_939_200.0);
50
51    /// Jupiter mean orbital radius (~5.203 AU)
52    pub const JUPITER: Km = Km(778_570_000.0);
53
54    /// Saturn mean orbital radius (~9.537 AU)
55    pub const SATURN: Km = Km(1_433_530_000.0);
56
57    /// Uranus mean orbital radius (~19.19 AU)
58    pub const URANUS: Km = Km(2_872_460_000.0);
59
60    /// Mercury mean orbital radius (~0.387 AU)
61    pub const MERCURY: Km = Km(57_909_050.0);
62
63    /// Venus mean orbital radius (~0.723 AU)
64    pub const VENUS: Km = Km(108_208_000.0);
65}
66
67/// Standard gravitational acceleration at Earth's surface (m/s²).
68/// Used to convert specific impulse (Isp in seconds) to exhaust velocity.
69/// Source: NIST/CODATA
70pub const G0_M_S2: f64 = 9.806_65;
71
72/// 1 Astronomical Unit in km (IAU 2012 exact definition)
73pub const AU_KM: f64 = 149_597_870.7;
74
75/// Speed of light in km/s (exact, SI definition)
76pub const C_KM_S: f64 = 299_792.458;
77
78/// Standard reference orbits.
79pub mod reference_orbits {
80    use super::Km;
81
82    /// Earth radius (mean equatorial) in km
83    pub const EARTH_RADIUS: Km = Km(6_378.137);
84
85    /// Low Earth Orbit altitude ~200 km
86    pub const LEO_RADIUS: Km = Km(6_578.0);
87
88    /// Geostationary Earth Orbit radius
89    pub const GEO_RADIUS: Km = Km(42_164.0);
90}
91
92#[cfg(test)]
93mod tests {
94    use super::*;
95
96    #[test]
97    fn test_mu_sun_order_of_magnitude() {
98        // Sun μ should be ~1.33e11 km³/s²
99        assert!(mu::SUN.value() > 1.3e11);
100        assert!(mu::SUN.value() < 1.4e11);
101    }
102
103    #[test]
104    fn test_mu_ordering() {
105        // Sun > Jupiter > Saturn > Neptune > Uranus > Earth > Venus > Mars > Mercury
106        assert!(mu::SUN.value() > mu::JUPITER.value());
107        assert!(mu::JUPITER.value() > mu::SATURN.value());
108        assert!(mu::SATURN.value() > mu::NEPTUNE.value());
109        assert!(mu::NEPTUNE.value() > mu::URANUS.value());
110        assert!(mu::URANUS.value() > mu::EARTH.value());
111        assert!(mu::EARTH.value() > mu::VENUS.value());
112        assert!(mu::VENUS.value() > mu::MARS.value());
113        assert!(mu::MARS.value() > mu::MERCURY.value());
114    }
115
116    #[test]
117    fn test_earth_orbit_is_1au() {
118        // 1 AU = 149,597,870.7 km
119        assert!((orbit_radius::EARTH.value() - 149_597_870.7).abs() < 1.0);
120    }
121
122    #[test]
123    fn test_mars_orbit_ratio() {
124        // Mars is approximately 1.524 AU from the Sun
125        let ratio = orbit_radius::MARS / orbit_radius::EARTH;
126        assert!((ratio - 1.524).abs() < 0.01);
127    }
128
129    #[test]
130    fn test_reference_orbits_ordering() {
131        assert!(reference_orbits::LEO_RADIUS.value() > reference_orbits::EARTH_RADIUS.value());
132        assert!(reference_orbits::GEO_RADIUS.value() > reference_orbits::LEO_RADIUS.value());
133    }
134
135    #[test]
136    fn test_g0_standard_value() {
137        assert!((G0_M_S2 - 9.80665).abs() < 1e-5);
138    }
139
140    #[test]
141    fn test_c_km_s_order_of_magnitude() {
142        assert!(C_KM_S > 299_000.0 && C_KM_S < 300_000.0);
143    }
144
145    #[test]
146    fn test_au_km_matches_orbit_radius_earth() {
147        assert!((AU_KM - orbit_radius::EARTH.value()).abs() < 1.0);
148    }
149}