use deep_time::consts::C_SQUARED;
use deep_time::physics::{Spacetime, Velocity};
use deep_time::{Dt, DtErr, Scale};
const GM_EARTH: f64 = 3.986_004_418e14;
const R_GROUND_M: f64 = 6_378_137.0;
const R_CRAFT_M: f64 = 6_778_137.0;
const ARC_S: i128 = 3_600;
fn tai_sec(sec: i128) -> Dt {
Dt::from_sec(sec, Scale::TAI, Scale::TAI)
}
fn phi_point_mass(r_m: f64) -> f64 {
-GM_EARTH / r_m
}
fn spacetime_from_phi_speed(phi_m2_s2: f64, speed_m_s: f64) -> Spacetime {
Spacetime::from_potential_velocity_and_scale(
phi_m2_s2 / C_SQUARED,
Velocity::from_speed(speed_m_s),
0.0,
)
}
fn main() -> Result<(), DtErr> {
let phi_ground = phi_point_mass(R_GROUND_M);
let ground = spacetime_from_phi_speed(phi_ground, 0.0);
let ground_rate = ground.proper_time_rate();
let speed_craft = (GM_EARTH / R_CRAFT_M).sqrt();
let phi_craft = phi_point_mass(R_CRAFT_M);
let craft = spacetime_from_phi_speed(phi_craft, speed_craft);
let craft_rate = craft.proper_time_rate();
let t0 = tai_sec(0);
let t1 = tai_sec(ARC_S);
let coordinate_span = t1.to_diff_raw(t0);
let velocity_craft = Velocity::from_speed(speed_craft);
let samples = [
(t0, velocity_craft, phi_craft),
(tai_sec(ARC_S / 2), velocity_craft, phi_craft),
(t1, velocity_craft, phi_craft),
];
let proper_time_craft = Dt::proper_time_from_states_between(t0, t1, samples, 0.0)?;
let path = [(t0, craft.clone()), (t1, craft)];
let versus_ground = Dt::proper_time_differential_vs_rate(t0, t1, path, ground_rate)?;
let drift = Dt::proper_time_drift_from_states(t0, t1, samples, 0.0)?;
let proper_time_const = t0.proper_time_between_constant_rate(t1, craft_rate);
assert_eq!(
proper_time_craft, proper_time_const,
"proper_time_from_states_between must match constant-rate integration when v and Φ are fixed"
);
let proper_time_ground = t0.proper_time_between_constant_rate(t1, ground_rate);
assert_eq!(
versus_ground,
proper_time_const.sub(proper_time_ground),
"proper_time_differential_vs_rate must equal Δτ_craft − Δτ_ground"
);
assert_eq!(
drift,
proper_time_craft.sub(coordinate_span),
"proper_time_drift_from_states must equal Δτ − Δt"
);
assert!(
craft_rate < ground_rate,
"craft rate {craft_rate} must be below ground rate {ground_rate}"
);
assert!(
versus_ground.to_sec_f() < 0.0,
"craft must lag ground over the arc (got {} s)",
versus_ground.to_sec_f()
);
assert!(
drift.to_sec_f() < 0.0,
"craft must lag coordinate time (got {} s)",
drift.to_sec_f()
);
let abs_diff_us = versus_ground.to_sec_f().abs() * 1e6;
assert!(
(0.1..100.0).contains(&abs_diff_us),
"|Δτ_craft − Δτ_ground| = {abs_diff_us:.3} µs over {ARC_S} s coordinate time \
(expected microsecond-class for this LEO illustration)"
);
Ok(())
}