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 sciforge::hub::domain::common::constants::EARTH_RADIUS;
use sciforge::hub::domain::geology::tectonics::{
    airy_root, euler_pole_velocity, flexural_rigidity, geothermal_gradient, heat_flow,
    isostatic_equilibrium,
};
pub const MANTLE_DENSITY: f64 = 3300.0;
pub const CRUST_DENSITY: f64 = 2700.0;
pub const LITHOSPHERE_THICKNESS: f64 = 100_000.0;
pub const ASTHENOSPHERE_VISCOSITY: f64 = 1e21;
pub struct TectonicPlate {
    pub name: &'static str,
    pub euler_pole_lat_deg: f64,
    pub euler_pole_lon_deg: f64,
    pub angular_velocity_deg_myr: f64,
    pub area_km2: f64,
}
impl TectonicPlate {
    pub fn velocity_at_point(&self, lat_deg: f64, lon_deg: f64) -> f64 {
        let lat1 = self.euler_pole_lat_deg.to_radians();
        let lon1 = self.euler_pole_lon_deg.to_radians();
        let lat2 = lat_deg.to_radians();
        let lon2 = lon_deg.to_radians();
        let angular_distance =
            (lat1.sin() * lat2.sin() + lat1.cos() * lat2.cos() * (lon2 - lon1).cos()).acos();
        euler_pole_velocity(
            self.angular_velocity_deg_myr.to_radians() / crate::SECONDS_PER_YEAR / 1e6,
            EARTH_RADIUS,
            angular_distance,
        )
    }
    pub fn velocity_cm_per_year(&self, lat_deg: f64, lon_deg: f64) -> f64 {
        self.velocity_at_point(lat_deg, lon_deg) * crate::SECONDS_PER_YEAR * 100.0
    }
}
pub fn pacific_plate() -> TectonicPlate {
    TectonicPlate {
        name: "Pacific",
        euler_pole_lat_deg: -63.0,
        euler_pole_lon_deg: 107.3,
        angular_velocity_deg_myr: 0.967,
        area_km2: 103.3e6,
    }
}
pub fn north_american_plate() -> TectonicPlate {
    TectonicPlate {
        name: "North American",
        euler_pole_lat_deg: -2.4,
        euler_pole_lon_deg: -79.5,
        angular_velocity_deg_myr: 0.209,
        area_km2: 75.9e6,
    }
}
pub fn eurasian_plate() -> TectonicPlate {
    TectonicPlate {
        name: "Eurasian",
        euler_pole_lat_deg: 48.9,
        euler_pole_lon_deg: -106.5,
        angular_velocity_deg_myr: 0.223,
        area_km2: 67.8e6,
    }
}
pub fn crustal_root_depth(mountain_height_m: f64) -> f64 {
    airy_root(mountain_height_m, CRUST_DENSITY, MANTLE_DENSITY)
}
pub fn lithospheric_flexural_rigidity(
    thickness_m: f64,
    youngs_modulus: f64,
    poissons_ratio: f64,
) -> f64 {
    flexural_rigidity(youngs_modulus, thickness_m, poissons_ratio)
}
pub fn surface_heat_flow(conductivity: f64, temp_gradient: f64) -> f64 {
    heat_flow(conductivity, temp_gradient)
}
pub fn temperature_at_depth(surface_temp: f64, depth_m: f64, gradient_k_per_m: f64) -> f64 {
    surface_temp + geothermal_gradient(surface_temp, depth_m, gradient_k_per_m)
}
pub fn isostatic_balance(crust_thickness: f64) -> f64 {
    isostatic_equilibrium(crust_thickness, CRUST_DENSITY, MANTLE_DENSITY)
}