marss 0.0.3

Mars celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
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,
    }
}