earths 0.0.1

High-fidelity Earth simulation engine — orbit, atmosphere, geology, hydrology, biosphere, terrain, lighting, rendering, satellites, and temporal systems with full scientific coupling
Documentation
use crate::temporal::calendar::SECONDS_PER_DAY;
use sciforge::hub::domain::astronomy::celestial::gravitational_force;
use sciforge::hub::domain::astronomy::orbits::{
    angular_momentum, apoapsis, escape_velocity, kepler_period, orbital_energy, periapsis, vis_viva,
};
use sciforge::hub::domain::common::constants::{AU, EARTH_MASS, G, SOLAR_MASS};
pub const SEMI_MAJOR_AXIS: f64 = 1.000001018 * AU;
pub const ECCENTRICITY: f64 = 0.0167086;
pub const INCLINATION_DEG: f64 = 0.00005;
pub const LONGITUDE_ASCENDING_NODE_DEG: f64 = -11.26064;
pub const ARGUMENT_PERIHELION_DEG: f64 = 114.20783;
const MU_SUN: f64 = G * SOLAR_MASS;
pub struct EarthOrbit {
    pub semi_major_axis_m: f64,
    pub eccentricity: f64,
    pub true_anomaly_rad: f64,
}
impl Default for EarthOrbit {
    fn default() -> Self {
        Self::new()
    }
}
impl EarthOrbit {
    pub fn new() -> Self {
        Self {
            semi_major_axis_m: SEMI_MAJOR_AXIS,
            eccentricity: ECCENTRICITY,
            true_anomaly_rad: 0.0,
        }
    }
    pub fn orbital_period_s(&self) -> f64 {
        kepler_period(self.semi_major_axis_m, MU_SUN)
    }
    pub fn orbital_period_days(&self) -> f64 {
        self.orbital_period_s() / SECONDS_PER_DAY
    }
    pub fn velocity_at_distance(&self, r: f64) -> f64 {
        vis_viva(MU_SUN, r, self.semi_major_axis_m)
    }
    pub fn perihelion_m(&self) -> f64 {
        periapsis(self.semi_major_axis_m, self.eccentricity)
    }
    pub fn aphelion_m(&self) -> f64 {
        apoapsis(self.semi_major_axis_m, self.eccentricity)
    }
    pub fn specific_orbital_energy(&self) -> f64 {
        orbital_energy(MU_SUN, self.semi_major_axis_m)
    }
    pub fn specific_angular_momentum(&self) -> f64 {
        angular_momentum(MU_SUN, self.semi_major_axis_m, self.eccentricity)
    }
    pub fn escape_velocity_at_surface() -> f64 {
        escape_velocity(G * EARTH_MASS, EARTH_RADIUS)
    }
    pub fn gravitational_force_sun(&self) -> f64 {
        let r = self.current_radius();
        gravitational_force(SOLAR_MASS, EARTH_MASS, r)
    }
    pub fn current_radius(&self) -> f64 {
        let a = self.semi_major_axis_m;
        let e = self.eccentricity;
        a * (1.0 - e * e) / (1.0 + e * self.true_anomaly_rad.cos())
    }
    pub fn mean_orbital_velocity(&self) -> f64 {
        let period = self.orbital_period_s();
        2.0 * std::f64::consts::PI * self.semi_major_axis_m / period
    }
}
use sciforge::hub::domain::common::constants::EARTH_RADIUS;