use crate::{Duration, TimeUnits};
pub(crate) const TCL_MINUS_TT_MEAN_RATE: f64 = 6.8e-10;
pub(crate) const TL_DELTA_F: f64 = -TCL_MINUS_TT_MEAN_RATE / (1.0 + TCL_MINUS_TT_MEAN_RATE);
pub(crate) const TL_CONST0_S: f64 = 0.0;
#[inline]
pub fn tt_since_t77_to_tcl_since_t77(tt_since_t77: Duration) -> Duration {
tt_since_t77 + tt_since_t77 * TCL_MINUS_TT_MEAN_RATE
}
#[inline]
pub fn tcl_since_t77_to_tt_since_t77(tcl_since_t77: Duration) -> Duration {
tcl_since_t77 - tcl_since_t77 * (TCL_MINUS_TT_MEAN_RATE / (1.0 + TCL_MINUS_TT_MEAN_RATE))
}
#[inline]
pub fn tcl_since_t77_to_tl_since_t77(tcl_since_t77: Duration) -> Duration {
tcl_since_t77 + tcl_since_t77 * TL_DELTA_F + TL_CONST0_S.seconds()
}
#[inline]
pub fn tl_since_t77_to_tcl_since_t77(tl_since_t77: Duration) -> Duration {
let tl_minus_const0 = tl_since_t77 - TL_CONST0_S.seconds();
tl_minus_const0 + tl_minus_const0 * TCL_MINUS_TT_MEAN_RATE
}
#[cfg(test)]
mod ut_tcl {
use super::*;
use crate::{Epoch, TimeScale, TimeUnits};
#[test]
fn tcl_accumulates_mean_drift_from_tt() {
let tt = Epoch::from_gregorian_at_midnight(2024, 2, 29, TimeScale::TT);
let tcl = tt.to_time_scale(TimeScale::TCL);
let tt_since_t77 = tt.duration - TimeScale::TCL.prime_epoch_offset();
let expected = tt_since_t77 * TCL_MINUS_TT_MEAN_RATE;
let actual = tcl.duration - tt_since_t77;
assert!(
(actual - expected).abs() <= 1.nanoseconds(),
"actual={actual}, expected={expected}"
);
}
}