use crate::{Dt, Real, Scale, TSpan};
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct TaiUtcPre1972 {
pub yr: i32,
pub mo: u8,
pub day: u8,
pub jd: Real,
pub mjd_ref: Real,
pub offset: Real,
pub drift: Real,
pub tai_jd: Real,
}
pub const SOFA_TAI_UTC_PRE_1972: &[TaiUtcPre1972] = &[
TaiUtcPre1972 {
yr: 1961,
mo: 1,
day: 1,
jd: 2437300.5,
mjd_ref: 37300.0,
offset: 1.4228180,
drift: 0.001296,
tai_jd: 2437300.5000164676,
},
TaiUtcPre1972 {
yr: 1961,
mo: 8,
day: 1,
jd: 2437512.5,
mjd_ref: 37300.0,
offset: 1.3728180,
drift: 0.001296,
tai_jd: 2437512.5000190693,
},
TaiUtcPre1972 {
yr: 1962,
mo: 1,
day: 1,
jd: 2437665.5,
mjd_ref: 37665.0,
offset: 1.8458580,
drift: 0.0011232,
tai_jd: 2437665.500021364,
},
TaiUtcPre1972 {
yr: 1963,
mo: 11,
day: 1,
jd: 2438334.5,
mjd_ref: 37665.0,
offset: 1.9458580,
drift: 0.0011232,
tai_jd: 2438334.5000312184,
},
TaiUtcPre1972 {
yr: 1964,
mo: 1,
day: 1,
jd: 2438395.5,
mjd_ref: 38761.0,
offset: 3.2401300,
drift: 0.001296,
tai_jd: 2438395.5000320114,
},
TaiUtcPre1972 {
yr: 1964,
mo: 4,
day: 1,
jd: 2438486.5,
mjd_ref: 38761.0,
offset: 3.3401300,
drift: 0.001296,
tai_jd: 2438486.500034534,
},
TaiUtcPre1972 {
yr: 1964,
mo: 9,
day: 1,
jd: 2438639.5,
mjd_ref: 38761.0,
offset: 3.4401300,
drift: 0.001296,
tai_jd: 2438639.5000379863,
},
TaiUtcPre1972 {
yr: 1965,
mo: 1,
day: 1,
jd: 2438761.5,
mjd_ref: 38761.0,
offset: 3.5401300,
drift: 0.001296,
tai_jd: 2438761.5000409735,
},
TaiUtcPre1972 {
yr: 1965,
mo: 3,
day: 1,
jd: 2438820.5,
mjd_ref: 38761.0,
offset: 3.6401300,
drift: 0.001296,
tai_jd: 2438820.500043016,
},
TaiUtcPre1972 {
yr: 1965,
mo: 7,
day: 1,
jd: 2438942.5,
mjd_ref: 38761.0,
offset: 3.7401300,
drift: 0.001296,
tai_jd: 2438942.5000460036,
},
TaiUtcPre1972 {
yr: 1965,
mo: 9,
day: 1,
jd: 2439004.5,
mjd_ref: 38761.0,
offset: 3.8401300,
drift: 0.001296,
tai_jd: 2439004.500048091,
},
TaiUtcPre1972 {
yr: 1966,
mo: 1,
day: 1,
jd: 2439126.5,
mjd_ref: 39126.0,
offset: 4.3131700,
drift: 0.002592,
tai_jd: 2439126.5000499208,
},
TaiUtcPre1972 {
yr: 1968,
mo: 2,
day: 1,
jd: 2439887.5,
mjd_ref: 39126.0,
offset: 4.2131700,
drift: 0.002592,
tai_jd: 2439887.5000715936,
},
];
pub const fn historical_sofa_for_utc_to_tai(utc: &Dt) -> Option<Real> {
let TSpan { sec, .. } = utc.to(Scale::UTCSofa);
if sec < -1230724800 || sec >= -883656990 {
return None;
}
let jd = utc.to_jd(Scale::UTC);
let mjd = utc.to_mjd(Scale::UTC);
let len = SOFA_TAI_UTC_PRE_1972.len();
let mut i = len;
while i > 0 {
i -= 1;
let entry = &SOFA_TAI_UTC_PRE_1972[i];
if jd >= entry.jd {
let offset = entry.offset + (mjd - entry.mjd_ref) * entry.drift;
return Some(offset);
}
}
None
}
pub const fn historical_sofa_for_tai_to_utc(tai: &Dt) -> Option<Real> {
if (tai.sec() < -1230724800 || (tai.sec() == -1230724800 && tai.attos() < 422817999999999936))
|| tai.sec() >= -883655990
{
return None;
}
let jd = tai.to_jd(Scale::TAI);
let mjd = tai.to_mjd(Scale::TAI);
let len = SOFA_TAI_UTC_PRE_1972.len();
let mut i = len;
while i > 0 {
i -= 1;
let entry = &SOFA_TAI_UTC_PRE_1972[i];
if jd >= entry.tai_jd {
let offset = entry.offset + (mjd - entry.mjd_ref) * entry.drift;
return Some(offset);
}
}
None
}