venuss 0.0.2

Venus celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
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)
}