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
}