use sciforge::hub::domain::geology::tectonics::{airy_root, heat_flow, isostatic_equilibrium};
pub struct MarsInterior {
pub core_radius_m: f64,
pub mantle_thickness_m: f64,
pub crust_thickness_m: f64,
}
impl Default for MarsInterior {
fn default() -> Self {
Self::new()
}
}
impl MarsInterior {
pub fn new() -> Self {
let core_r = crate::CORE_RADIUS_M;
let total_r = crate::MARS_RADIUS;
let crust = crate::CRUST_THICKNESS_M;
Self {
core_radius_m: core_r,
mantle_thickness_m: total_r - core_r - crust,
crust_thickness_m: crust,
}
}
pub fn core_mass_fraction(&self) -> f64 {
let r_ratio = self.core_radius_m / crate::MARS_RADIUS;
let vol_frac = r_ratio.powi(3);
vol_frac * crate::CORE_DENSITY / 3933.0
}
pub fn is_tectonically_active(&self) -> bool {
false
}
pub fn elastic_lithosphere_thickness(&self) -> f64 {
300_000.0
}
pub fn mantle_rayleigh_number(&self) -> f64 {
let rho = crate::MANTLE_DENSITY;
let g = crate::SURFACE_GRAVITY;
let alpha = 3e-5;
let dt = 1500.0;
let h = self.mantle_thickness_m;
let kappa = 1e-6;
let eta = 1e21;
rho * g * alpha * dt * h.powi(3) / (kappa * eta)
}
}
pub fn crustal_root_depth(elevation_m: f64) -> f64 {
airy_root(elevation_m, crate::CRUST_DENSITY, crate::MANTLE_DENSITY)
}
pub fn isostatic_balance(crust_thickness: f64) -> f64 {
isostatic_equilibrium(crust_thickness, crate::CRUST_DENSITY, crate::MANTLE_DENSITY)
}
pub fn surface_heat_flow_w_m2(conductivity: f64, temp_gradient: f64) -> f64 {
heat_flow(conductivity, temp_gradient)
}
pub fn mean_heat_flux_mw_m2() -> f64 {
crate::SURFACE_HEAT_FLUX_MW_M2
}
pub fn northern_crust_thickness_m() -> f64 {
32_000.0
}
pub fn southern_crust_thickness_m() -> f64 {
58_000.0
}