marss 0.0.3

Mars celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
use sciforge::hub::domain::common::constants::R_GAS;

pub struct AeolianErosion {
    pub sand_flux_kg_m_s: f64,
    pub saltation_threshold_m_s: f64,
}

impl AeolianErosion {
    pub fn typical() -> Self {
        Self {
            sand_flux_kg_m_s: 1e-5,
            saltation_threshold_m_s: 25.0,
        }
    }

    pub fn transport_rate(&self, wind_speed_m_s: f64) -> f64 {
        if wind_speed_m_s < self.saltation_threshold_m_s {
            return 0.0;
        }
        let air_density = crate::SURFACE_AIR_DENSITY;
        let c = 2.5;
        c * air_density / crate::SURFACE_GRAVITY
            * (wind_speed_m_s - self.saltation_threshold_m_s).powi(2)
            * wind_speed_m_s
    }

    pub fn saltation_threshold_m_s(particle_diameter_m: f64, particle_density: f64) -> f64 {
        let air_density = crate::SURFACE_AIR_DENSITY;
        let g = crate::SURFACE_GRAVITY;
        0.1 * ((particle_density - air_density) * g * particle_diameter_m / air_density).sqrt()
    }
}

pub fn thermal_fatigue_crack_growth_rate(temp_amplitude_k: f64, rock_toughness: f64) -> f64 {
    let alpha = 8e-6;
    let youngs = 5e10;
    let stress = alpha * youngs * temp_amplitude_k;
    if stress < rock_toughness {
        return 0.0;
    }
    1e-12 * (stress / rock_toughness).powi(4)
}

pub fn equatorial_temp_swing() -> f64 {
    crate::SUBSOLAR_MAX_TEMP_K - crate::POLAR_MIN_TEMP_K * 1.5
}

pub fn chemical_weathering_rate(temperature_k: f64, water_availability: f64) -> f64 {
    let ea = 60_000.0;
    let a = 1.0;
    a * (-ea / (R_GAS * temperature_k)).exp() * water_availability
}

pub fn regolith_gardening_depth_m_per_gyr() -> f64 {
    1.0
}

pub fn mean_regolith_depth_m() -> f64 {
    5.0
}