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)
}