use sciforge::hub::domain::common::constants::G;
pub const DEIMOS_MASS: f64 = 1.4762e15;
pub const DEIMOS_RADIUS: f64 = 6_200.0;
pub const DEIMOS_DIMENSIONS: (f64, f64, f64) = (15_000.0, 12_200.0, 10_400.0);
pub const DEIMOS_SEMI_MAJOR_AXIS: f64 = 23_463_200.0;
pub const DEIMOS_ECCENTRICITY: f64 = 0.00033;
pub const DEIMOS_INCLINATION_DEG: f64 = 0.93;
pub const DEIMOS_ORBITAL_PERIOD_S: f64 = 109_075.0;
pub const DEIMOS_DENSITY: f64 = 1_471.0;
pub const DEIMOS_ALBEDO: f64 = 0.068;
pub const DEIMOS_SURFACE_GRAVITY: f64 = 0.003;
pub struct DeimosState {
pub mass_kg: f64,
pub semi_major_axis_m: f64,
pub eccentricity: f64,
pub inclination_rad: f64,
pub mean_anomaly_rad: f64,
}
impl Default for DeimosState {
fn default() -> Self {
Self::new()
}
}
impl DeimosState {
pub fn new() -> Self {
Self {
mass_kg: DEIMOS_MASS,
semi_major_axis_m: DEIMOS_SEMI_MAJOR_AXIS,
eccentricity: DEIMOS_ECCENTRICITY,
inclination_rad: DEIMOS_INCLINATION_DEG.to_radians(),
mean_anomaly_rad: 0.0,
}
}
pub fn orbital_period_s(&self) -> f64 {
let mu = G * crate::MARS_MASS;
2.0 * std::f64::consts::PI * (self.semi_major_axis_m.powi(3) / mu).sqrt()
}
pub fn orbital_velocity_ms(&self) -> f64 {
(G * crate::MARS_MASS / self.semi_major_axis_m).sqrt()
}
pub fn step(&mut self, dt_s: f64) {
let n = 2.0 * std::f64::consts::PI / self.orbital_period_s();
self.mean_anomaly_rad = (self.mean_anomaly_rad + n * dt_s) % (2.0 * std::f64::consts::PI);
}
fn eccentric_anomaly(&self) -> f64 {
let m = self.mean_anomaly_rad;
let e = self.eccentricity;
let mut ea = m + e * m.sin();
for _ in 0..15 {
let f = ea - e * ea.sin() - m;
let fp = 1.0 - e * ea.cos();
ea -= f / fp;
}
ea
}
fn true_anomaly(&self) -> f64 {
let ea = self.eccentric_anomaly();
let e = self.eccentricity;
2.0 * f64::atan2(
(1.0 + e).sqrt() * (ea / 2.0).sin(),
(1.0 - e).sqrt() * (ea / 2.0).cos(),
)
}
pub fn distance(&self) -> f64 {
let nu = self.true_anomaly();
let e = self.eccentricity;
self.semi_major_axis_m * (1.0 - e * e) / (1.0 + e * nu.cos())
}
pub fn escape_velocity(&self) -> f64 {
(2.0 * G * DEIMOS_MASS / DEIMOS_RADIUS).sqrt()
}
}
pub fn orbital_expansion_rate_m_per_year() -> f64 {
2.4e-3
}
pub fn apparent_angular_size_rad() -> f64 {
use sciforge::hub::domain::astronomy::celestial::apparent_angular_size;
apparent_angular_size(DEIMOS_RADIUS, DEIMOS_SEMI_MAJOR_AXIS - crate::MARS_RADIUS)
}
pub fn solar_transit_duration_s() -> f64 {
120.0
}