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
}