use crate::satellites::moon::{EARTH_MOON_DISTANCE, LUNAR_MASS};
use sciforge::hub::domain::astronomy::celestial::gravitational_force;
use sciforge::hub::domain::common::constants::{AU, EARTH_MASS, EARTH_RADIUS, G, SOLAR_MASS};
pub struct TidalForce {
pub body_mass: f64,
pub body_distance: f64,
}
impl TidalForce {
pub fn from_moon() -> Self {
Self {
body_mass: LUNAR_MASS,
body_distance: EARTH_MOON_DISTANCE,
}
}
pub fn from_sun() -> Self {
Self {
body_mass: SOLAR_MASS,
body_distance: AU,
}
}
pub fn tidal_acceleration(&self) -> f64 {
2.0 * G * self.body_mass * EARTH_RADIUS / self.body_distance.powi(3)
}
pub fn tidal_potential(&self, theta: f64) -> f64 {
let r = EARTH_RADIUS;
let d = self.body_distance;
let m = self.body_mass;
let base = -G * m * r * r / (d * d * d) * (1.5 * theta.cos().powi(2) - 0.5);
(1.0 + crate::K2_LOVE) * base
}
pub fn tidal_bulge_height(&self) -> f64 {
let g_surface = G * EARTH_MASS / (EARTH_RADIUS * EARTH_RADIUS);
crate::H2_LOVE * self.tidal_acceleration() * EARTH_RADIUS / g_surface
}
pub fn gravitational_attraction(&self) -> f64 {
gravitational_force(EARTH_MASS, self.body_mass, self.body_distance)
}
}
pub fn spring_tide_amplitude() -> f64 {
let moon = TidalForce::from_moon();
let sun = TidalForce::from_sun();
moon.tidal_bulge_height() + sun.tidal_bulge_height()
}
pub fn neap_tide_amplitude() -> f64 {
let moon = TidalForce::from_moon();
let sun = TidalForce::from_sun();
(moon.tidal_bulge_height() - sun.tidal_bulge_height()).abs()
}
pub fn lunar_to_solar_tide_ratio() -> f64 {
let moon = TidalForce::from_moon();
let sun = TidalForce::from_sun();
moon.tidal_acceleration() / sun.tidal_acceleration()
}