use sciforge::hub::domain::geology::tectonics::{
airy_root, flexural_rigidity, isostatic_equilibrium,
};
pub const CRUST_DENSITY: f64 = 2700.0;
pub const MANTLE_DENSITY: f64 = 3300.0;
pub const YOUNGS_MODULUS_LITHOSPHERE: f64 = 7e10;
pub const POISSONS_RATIO: f64 = 0.25;
pub struct Mountain {
pub name: &'static str,
pub peak_elevation_m: f64,
pub base_elevation_m: f64,
pub crust_thickness_km: f64,
}
impl Mountain {
pub fn height(&self) -> f64 {
self.peak_elevation_m - self.base_elevation_m
}
pub fn root_depth_m(&self) -> f64 {
airy_root(self.height(), CRUST_DENSITY, MANTLE_DENSITY)
}
pub fn total_crust_thickness_m(&self) -> f64 {
self.crust_thickness_km * 1000.0 + self.root_depth_m()
}
pub fn isostatic_elevation(&self) -> f64 {
isostatic_equilibrium(
self.crust_thickness_km * 1000.0,
CRUST_DENSITY,
MANTLE_DENSITY,
)
}
}
pub fn everest() -> Mountain {
Mountain {
name: "Mount Everest",
peak_elevation_m: 8848.86,
base_elevation_m: 5200.0,
crust_thickness_km: 70.0,
}
}
pub fn alps_flexural_rigidity() -> f64 {
flexural_rigidity(
YOUNGS_MODULUS_LITHOSPHERE,
crate::LITHOSPHERE_THICKNESS_ALPS,
POISSONS_RATIO,
)
}
pub fn himalaya_convergence_rate_m_per_year() -> f64 {
crate::HIMALAYA_CONVERGENCE_M_YR
}
pub fn orogeny_uplift_rate(convergence_rate_m_yr: f64, angle_deg: f64) -> f64 {
let angle_rad = angle_deg.to_radians();
convergence_rate_m_yr * angle_rad.sin()
}