use crate::{Dt, Real};
#[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 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,
},
TaiUtcPre1972 {
yr: 1961,
mo: 8,
day: 1,
jd: 2437512.5,
mjd_ref: 37300.0,
offset: 1.3728180,
drift: 0.001296,
},
TaiUtcPre1972 {
yr: 1962,
mo: 1,
day: 1,
jd: 2437665.5,
mjd_ref: 37665.0,
offset: 1.8458580,
drift: 0.0011232,
},
TaiUtcPre1972 {
yr: 1963,
mo: 11,
day: 1,
jd: 2438334.5,
mjd_ref: 37665.0,
offset: 1.9458580,
drift: 0.0011232,
},
TaiUtcPre1972 {
yr: 1964,
mo: 1,
day: 1,
jd: 2438395.5,
mjd_ref: 38761.0,
offset: 3.2401300,
drift: 0.001296,
},
TaiUtcPre1972 {
yr: 1964,
mo: 4,
day: 1,
jd: 2438486.5,
mjd_ref: 38761.0,
offset: 3.3401300,
drift: 0.001296,
},
TaiUtcPre1972 {
yr: 1964,
mo: 9,
day: 1,
jd: 2438639.5,
mjd_ref: 38761.0,
offset: 3.4401300,
drift: 0.001296,
},
TaiUtcPre1972 {
yr: 1965,
mo: 1,
day: 1,
jd: 2438761.5,
mjd_ref: 38761.0,
offset: 3.5401300,
drift: 0.001296,
},
TaiUtcPre1972 {
yr: 1965,
mo: 3,
day: 1,
jd: 2438820.5,
mjd_ref: 38761.0,
offset: 3.6401300,
drift: 0.001296,
},
TaiUtcPre1972 {
yr: 1965,
mo: 7,
day: 1,
jd: 2438942.5,
mjd_ref: 38761.0,
offset: 3.7401300,
drift: 0.001296,
},
TaiUtcPre1972 {
yr: 1965,
mo: 9,
day: 1,
jd: 2439004.5,
mjd_ref: 38761.0,
offset: 3.8401300,
drift: 0.001296,
},
TaiUtcPre1972 {
yr: 1966,
mo: 1,
day: 1,
jd: 2439126.5,
mjd_ref: 39126.0,
offset: 4.3131700,
drift: 0.002592,
},
TaiUtcPre1972 {
yr: 1968,
mo: 2,
day: 1,
jd: 2439887.5,
mjd_ref: 39126.0,
offset: 4.2131700,
drift: 0.002592,
},
];
pub const fn historical_sofa_offset_for_non_adjusted(dt: &Dt) -> Option<Real> {
if dt.sec < -1230724800 || dt.sec >= -883656990 {
return None;
}
let jd = dt.to_jd_f();
let mjd = dt.to_mjd_f();
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
}