marss 0.0.3

Mars celestial simulation crate for the MilkyWay SolarSystem workspace
Documentation
pub const MY1_EPOCH_JD: f64 = 2_435_208.5;

pub struct MarsSolDate {
    pub mars_year: i32,
    pub sol_of_year: f64,
}

impl MarsSolDate {
    pub fn from_julian_date(jd: f64) -> Self {
        let sols_since_epoch = (jd - MY1_EPOCH_JD) / (crate::SOL_S / 86400.0);
        let mars_year = (sols_since_epoch / crate::MARS_YEAR_SOLS).floor() as i32 + 1;
        let sol_of_year = sols_since_epoch - (mars_year - 1) as f64 * crate::MARS_YEAR_SOLS;
        Self {
            mars_year,
            sol_of_year,
        }
    }

    pub fn to_julian_date(&self) -> f64 {
        let sols = (self.mars_year - 1) as f64 * crate::MARS_YEAR_SOLS + self.sol_of_year;
        MY1_EPOCH_JD + sols * (crate::SOL_S / 86400.0)
    }

    pub fn ls_deg(&self) -> f64 {
        let fraction = self.sol_of_year / crate::MARS_YEAR_SOLS;
        let mean_anom = fraction * 2.0 * std::f64::consts::PI;
        let e = crate::ECCENTRICITY;
        let eq_center = 2.0 * e * mean_anom.sin() + 1.25 * e * e * (2.0 * mean_anom).sin();
        ((mean_anom + eq_center).to_degrees() % 360.0 + 360.0) % 360.0
    }

    pub fn sol_number(&self) -> f64 {
        (self.mars_year - 1) as f64 * crate::MARS_YEAR_SOLS + self.sol_of_year
    }
}

pub const MSD_EPOCH_JD: f64 = 2_405_522.0;

pub fn mars_sol_date(jd: f64) -> f64 {
    (jd - MSD_EPOCH_JD) / (crate::SOL_S / 86400.0) + 44_796.0
}

pub fn coordinated_mars_time(jd: f64) -> f64 {
    let msd = mars_sol_date(jd);
    (msd % 1.0) * 24.0
}