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()
}