earths 0.0.4

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 MANTLEDENSITY: f64 = 3300.0;
pub const CRUSTDENSITY: f64 = 2700.0;
pub const LITHOSPHERETHICKNESS: f64 = 100000.0;
pub const ASTHENOSPHEREVISCOSITY: f64 = 1e21;
pub struct TectonicPlate {
    pub name: &'static str,
    pub eulerpolelatdeg: f64,
    pub eulerpolelondeg: f64,
    pub angularvelocitydegmyr: f64,
    pub areakm2: f64,
}
impl TectonicPlate {
    pub fn velocityatpoint(&self, latdeg: f64, londeg: f64) -> f64 {
        let lat1 = self.eulerpolelatdeg.to_radians();
        let lon1 = self.eulerpolelondeg.to_radians();
        let lat2 = latdeg.to_radians();
        let lon2 = londeg.to_radians();
        let angulardistance =
            (lat1.sin() * lat2.sin() + lat1.cos() * lat2.cos() * (lon2 - lon1).cos()).acos();
        euler_pole_velocity(
            self.angularvelocitydegmyr.to_radians() / crate::SECONDSPERYEAR / 1e6,
            EARTH_RADIUS,
            angulardistance,
        )
    }
    pub fn velocitycmperyear(&self, latdeg: f64, londeg: f64) -> f64 {
        self.velocityatpoint(latdeg, londeg) * crate::SECONDSPERYEAR * 100.0
    }
}
pub fn pacificplate() -> TectonicPlate {
    TectonicPlate {
        name: "Pacific",
        eulerpolelatdeg: -63.0,
        eulerpolelondeg: 107.3,
        angularvelocitydegmyr: 0.967,
        areakm2: 103.3e6,
    }
}
pub fn northamericanplate() -> TectonicPlate {
    TectonicPlate {
        name: "North American",
        eulerpolelatdeg: -2.4,
        eulerpolelondeg: -79.5,
        angularvelocitydegmyr: 0.209,
        areakm2: 75.9e6,
    }
}
pub fn eurasianplate() -> TectonicPlate {
    TectonicPlate {
        name: "Eurasian",
        eulerpolelatdeg: 48.9,
        eulerpolelondeg: -106.5,
        angularvelocitydegmyr: 0.223,
        areakm2: 67.8e6,
    }
}
pub fn crustalrootdepth(mountainheightm: f64) -> f64 {
    airy_root(mountainheightm, CRUSTDENSITY, MANTLEDENSITY)
}
pub fn lithosphericflexuralrigidity(
    thicknessm: f64,
    youngsmodulus: f64,
    poissonsratio: f64,
) -> f64 {
    flexural_rigidity(youngsmodulus, thicknessm, poissonsratio)
}
pub fn surfaceheatflow(conductivity: f64, tempgradient: f64) -> f64 {
    heat_flow(conductivity, tempgradient)
}
pub fn temperatureatdepth(surfacetemp: f64, depthm: f64, gradientkperm: f64) -> f64 {
    surfacetemp + geothermal_gradient(surfacetemp, depthm, gradientkperm)
}
pub fn isostaticbalance(crustthickness: f64) -> f64 {
    isostatic_equilibrium(CRUSTDENSITY, crustthickness, MANTLEDENSITY)
}