use sciforge::hub::domain::common::constants::G;
pub struct MarsSatellite {
pub name: &'static str,
pub periapsis_km: f64,
pub apoapsis_km: f64,
pub inclination_deg: f64,
pub eccentricity: f64,
}
impl MarsSatellite {
pub fn semi_major_axis_m(&self) -> f64 {
((self.periapsis_km + self.apoapsis_km) / 2.0) * 1000.0 + crate::MARS_RADIUS
}
pub fn orbital_period_s(&self) -> f64 {
let mu = G * crate::MARS_MASS;
let a = self.semi_major_axis_m();
2.0 * std::f64::consts::PI * (a.powi(3) / mu).sqrt()
}
pub fn periapsis_radius_m(&self) -> f64 {
self.periapsis_km * 1000.0 + crate::MARS_RADIUS
}
pub fn apoapsis_radius_m(&self) -> f64 {
self.apoapsis_km * 1000.0 + crate::MARS_RADIUS
}
pub fn velocity_at_periapsis(&self) -> f64 {
let a = self.semi_major_axis_m();
let r = self.periapsis_radius_m();
(G * crate::MARS_MASS * (2.0 / r - 1.0 / a)).sqrt()
}
pub fn velocity_at_apoapsis(&self) -> f64 {
let a = self.semi_major_axis_m();
let r = self.apoapsis_radius_m();
(G * crate::MARS_MASS * (2.0 / r - 1.0 / a)).sqrt()
}
}
pub fn mro() -> MarsSatellite {
MarsSatellite {
name: "Mars Reconnaissance Orbiter",
periapsis_km: 255.0,
apoapsis_km: 320.0,
inclination_deg: 92.66,
eccentricity: 0.0094,
}
}
pub fn maven() -> MarsSatellite {
MarsSatellite {
name: "MAVEN",
periapsis_km: 150.0,
apoapsis_km: 6_200.0,
inclination_deg: 75.0,
eccentricity: 0.47,
}
}
pub fn odyssey() -> MarsSatellite {
MarsSatellite {
name: "Mars Odyssey",
periapsis_km: 400.0,
apoapsis_km: 450.0,
inclination_deg: 93.1,
eccentricity: 0.006,
}
}
pub fn tgo() -> MarsSatellite {
MarsSatellite {
name: "ExoMars Trace Gas Orbiter",
periapsis_km: 380.0,
apoapsis_km: 420.0,
inclination_deg: 74.0,
eccentricity: 0.005,
}
}
pub fn mars_express() -> MarsSatellite {
MarsSatellite {
name: "Mars Express",
periapsis_km: 258.0,
apoapsis_km: 10_530.0,
inclination_deg: 86.9,
eccentricity: 0.57,
}
}
pub struct Lander {
pub name: &'static str,
pub latitude_deg: f64,
pub longitude_deg: f64,
pub active: bool,
}
pub fn perseverance() -> Lander {
Lander {
name: "Perseverance (Mars 2020)",
latitude_deg: 18.4447,
longitude_deg: 77.4508,
active: true,
}
}
pub fn curiosity() -> Lander {
Lander {
name: "Curiosity (MSL)",
latitude_deg: -4.5895,
longitude_deg: 137.4417,
active: true,
}
}
pub fn insight() -> Lander {
Lander {
name: "InSight",
latitude_deg: 4.5024,
longitude_deg: 135.6234,
active: false,
}
}
pub fn zhurong() -> Lander {
Lander {
name: "Zhurong (Tianwen-1)",
latitude_deg: 25.066,
longitude_deg: 109.926,
active: false,
}
}