use sciforge::hub::domain::meteorology::atmosphere::barometric_formula;
pub struct AtmosphericLayer {
pub name: &'static str,
pub base_altitude_m: f64,
pub top_altitude_m: f64,
pub lapse_rate_k_m: f64,
pub base_temp_k: f64,
pub base_pressure_pa: f64,
}
impl AtmosphericLayer {
pub fn temperature_at(&self, altitude_m: f64) -> f64 {
let dz = (altitude_m - self.base_altitude_m).max(0.0);
self.base_temp_k - self.lapse_rate_k_m * dz
}
pub fn pressure_at(&self, altitude_m: f64) -> f64 {
let t = self.temperature_at(altitude_m);
barometric_formula(
self.base_pressure_pa,
crate::ATMOSPHERE_MOLAR_MASS,
crate::SURFACE_GRAVITY,
altitude_m - self.base_altitude_m,
t,
)
}
}
pub fn troposphere() -> AtmosphericLayer {
AtmosphericLayer {
name: "Troposphere",
base_altitude_m: 0.0,
top_altitude_m: 65_000.0,
lapse_rate_k_m: 0.008,
base_temp_k: 737.0,
base_pressure_pa: crate::SURFACE_PRESSURE_PA,
}
}
pub fn mesosphere() -> AtmosphericLayer {
AtmosphericLayer {
name: "Mesosphere",
base_altitude_m: 65_000.0,
top_altitude_m: 100_000.0,
lapse_rate_k_m: -0.002,
base_temp_k: 220.0,
base_pressure_pa: 10_000.0,
}
}
pub fn thermosphere() -> AtmosphericLayer {
AtmosphericLayer {
name: "Thermosphere",
base_altitude_m: 100_000.0,
top_altitude_m: 250_000.0,
lapse_rate_k_m: -0.001,
base_temp_k: 300.0,
base_pressure_pa: 1.0,
}
}
pub fn barometric_pressure(altitude_m: f64) -> f64 {
let h = crate::SCALE_HEIGHT_M;
crate::SURFACE_PRESSURE_PA * (-altitude_m / h).exp()
}
pub fn scale_height() -> f64 {
crate::SCALE_HEIGHT_M
}
pub fn mean_solar_irradiance() -> f64 {
sciforge::hub::domain::meteorology::radiation::solar_constant()
/ (crate::SEMI_MAJOR_AXIS_AU * crate::SEMI_MAJOR_AXIS_AU)
}