use crate::config::parameters::G;
use sciforge::hub::prelude::astronomy::celestial;
use sciforge::hub::prelude::astronomy::stellar;
#[derive(Debug, Clone, Copy)]
pub struct GravitationalField {
pub mass: f64,
}
impl GravitationalField {
pub fn new(mass: f64) -> Self {
Self { mass }
}
pub fn newtonian_acceleration(&self, r: f64) -> f64 {
G * self.mass / (r * r)
}
pub fn escape_velocity(&self, r: f64) -> f64 {
(2.0 * G * self.mass / r).sqrt()
}
pub fn orbital_velocity(&self, r: f64) -> f64 {
(G * self.mass / r).sqrt()
}
pub fn gravitational_potential(&self, r: f64) -> f64 {
-G * self.mass / r
}
pub fn tidal_force(&self, r: f64, delta_r: f64) -> f64 {
celestial::tidal_force(self.mass, r, delta_r)
}
pub fn gravitational_time_dilation(&self, r: f64) -> f64 {
let rs = stellar::schwarzschild_radius(self.mass);
(1.0 - rs / r).sqrt()
}
pub fn gravitational_redshift(&self, r_emit: f64, r_obs: f64) -> f64 {
let rs = stellar::schwarzschild_radius(self.mass);
((1.0 - rs / r_obs) / (1.0 - rs / r_emit)).sqrt()
}
pub fn surface_gravity(&self, r: f64) -> f64 {
celestial::surface_gravity(self.mass, r)
}
}
pub fn two_body_force(m1: f64, m2: f64, r: f64) -> f64 {
celestial::gravitational_force(m1, m2, r)
}
pub fn hill_sphere(m_primary: f64, m_secondary: f64, semi_major: f64) -> f64 {
celestial::hill_sphere(semi_major, m_secondary, m_primary, 0.0)
}
pub fn roche_limit(r_primary: f64, rho_primary: f64, rho_secondary: f64) -> f64 {
r_primary * (2.0 * rho_primary / rho_secondary).powf(1.0 / 3.0)
}