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