use crate::config::parameters::{
AU, K_B, PI, SOLAR_LUMINOSITY, STEFAN_BOLTZMANN, WATER_MOLECULE_MASS,
};
pub fn coma_radius(gas_production_q: f64, r_au: f64, albedo: f64) -> f64 {
let v_gas = gas_thermal_velocity(r_au, albedo);
let tau_photo_1au = 8.2e4;
let tau_photo = tau_photo_1au * r_au * r_au;
let radius = v_gas * tau_photo;
let _ = gas_production_q;
radius.max(0.0)
}
pub fn dust_tail_length(beta: f64, r_au: f64, orbital_velocity_ms: f64) -> f64 {
let r = r_au * AU;
if r < 1.0 || orbital_velocity_ms < 1.0 {
return 0.0;
}
let a_rad = beta * 5.93e-3 / (r_au * r_au);
let time = r / orbital_velocity_ms;
0.5 * a_rad * time * time
}
pub fn ion_tail_length(gas_production_q: f64, r_au: f64) -> f64 {
let q_ref = 1.0e28;
let l_ref = AU;
l_ref * (gas_production_q / q_ref).sqrt() / r_au.max(0.01)
}
pub fn afrho(dust_production_rate: f64, r_au: f64) -> f64 {
if r_au < 0.01 {
return 0.0;
}
dust_production_rate / (r_au * r_au)
}
fn gas_thermal_velocity(r_au: f64, albedo: f64) -> f64 {
let r = r_au * AU;
if r < 1.0 {
return 0.0;
}
let t_eq =
(SOLAR_LUMINOSITY * (1.0 - albedo) / (16.0 * PI * STEFAN_BOLTZMANN * r * r)).powf(0.25);
(8.0 * K_B * t_eq / (PI * WATER_MOLECULE_MASS)).sqrt()
}
pub fn coma_optical_depth(gas_production_q: f64, distance_m: f64, r_au: f64, albedo: f64) -> f64 {
let v = gas_thermal_velocity(r_au, albedo);
if v < 1.0 || distance_m < 1.0 {
return 0.0;
}
let sigma = 1.0e-20;
gas_production_q * sigma / (4.0 * PI * v * distance_m)
}
pub fn lyman_alpha_production(gas_production_q: f64) -> f64 {
gas_production_q * 0.85
}