use crate::config::parameters;
pub fn collisional_lifetime_years(radius: f64, semi_major_au: f64) -> f64 {
let cross_section = parameters::PI * radius * radius;
if cross_section < 1.0 {
return 0.0;
}
let n_density = 1.0e-25 * (40.0 / semi_major_au).powf(2.5);
let v_rel = 1.0e3; let rate = n_density * cross_section * v_rel;
if rate < 1.0e-30 {
return f64::INFINITY;
}
(1.0 / rate) / parameters::YEAR
}
pub fn weathering_timescale_years(semi_major_au: f64) -> f64 {
let base: f64 = 1.0e8; base * (semi_major_au / 40.0).sqrt()
}
pub fn sublimation_mass_loss(radius: f64, albedo: f64, r_au: f64, ice_fraction: f64) -> f64 {
let temp = parameters::equilibrium_temperature(r_au * parameters::AU, albedo);
let sub_rate = crate::physics::thermal::n2_sublimation_rate(temp);
let area = 4.0 * parameters::PI * radius * radius;
area * sub_rate * ice_fraction.clamp(0.0, 1.0)
}
pub fn volatile_depletion_time_years(
radius: f64,
density: f64,
albedo: f64,
r_au: f64,
ice_fraction: f64,
) -> f64 {
let mass_loss = sublimation_mass_loss(radius, albedo, r_au, ice_fraction);
if mass_loss < 1.0e-30 {
return f64::INFINITY;
}
let ice_mass = parameters::sphere_mass(radius, density) * ice_fraction;
(ice_mass / mass_loss) / parameters::YEAR
}
pub fn surface_refreshed_fraction(age_years: f64, semi_major_au: f64) -> f64 {
let coll_time = collisional_lifetime_years(5.0e5, semi_major_au);
if coll_time <= 0.0 || coll_time.is_infinite() {
return 0.0;
}
(1.0 - (-age_years / coll_time).exp()).clamp(0.0, 1.0)
}