marss 0.0.2

Mars celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
use sciforge::hub::domain::astronomy::celestial::{gravitational_force, tidal_force};
use sciforge::hub::domain::common::constants::{AU, G, SOLAR_MASS};

pub const MARS_MASS: f64 = crate::MARS_MASS;
pub const MARS_RADIUS: f64 = crate::MARS_RADIUS;
pub const SEMI_MAJOR_AXIS: f64 = crate::SEMI_MAJOR_AXIS_AU * AU;

pub struct SolarTide {
    pub distance_m: f64,
}

impl SolarTide {
    pub fn at_mean_distance() -> Self {
        Self {
            distance_m: SEMI_MAJOR_AXIS,
        }
    }

    pub fn at_perihelion() -> Self {
        let r = SEMI_MAJOR_AXIS * (1.0 - crate::ECCENTRICITY);
        Self { distance_m: r }
    }

    pub fn at_aphelion() -> Self {
        let r = SEMI_MAJOR_AXIS * (1.0 + crate::ECCENTRICITY);
        Self { distance_m: r }
    }

    pub fn at_distance(distance_m: f64) -> Self {
        Self { distance_m }
    }

    pub fn tidal_acceleration(&self) -> f64 {
        tidal_force(SOLAR_MASS, self.distance_m, MARS_RADIUS)
    }

    pub fn tidal_bulge_height(&self) -> f64 {
        let g_surface = G * MARS_MASS / (MARS_RADIUS * MARS_RADIUS);
        self.tidal_acceleration() * MARS_RADIUS / g_surface
    }

    pub fn gravitational_force(&self) -> f64 {
        gravitational_force(SOLAR_MASS, MARS_MASS, self.distance_m)
    }
}

pub struct PhobosTide {
    pub distance_m: f64,
}

impl PhobosTide {
    pub fn at_mean_distance() -> Self {
        Self {
            distance_m: crate::satellites::phobos::PHOBOS_SEMI_MAJOR_AXIS,
        }
    }

    pub fn tidal_acceleration(&self) -> f64 {
        tidal_force(
            crate::satellites::phobos::PHOBOS_MASS,
            self.distance_m,
            MARS_RADIUS,
        )
    }

    pub fn tidal_bulge_height(&self) -> f64 {
        let g_surface = G * MARS_MASS / (MARS_RADIUS * MARS_RADIUS);
        self.tidal_acceleration() * MARS_RADIUS / g_surface
    }
}

pub fn phobos_solar_tide_ratio() -> f64 {
    let phobos = PhobosTide::at_mean_distance();
    let sun = SolarTide::at_mean_distance();
    phobos.tidal_acceleration() / sun.tidal_acceleration()
}

pub fn perihelion_aphelion_tide_ratio() -> f64 {
    let peri = SolarTide::at_perihelion();
    let aph = SolarTide::at_aphelion();
    peri.tidal_acceleration() / aph.tidal_acceleration()
}