use glam::DVec3;
#[derive(Debug, Clone, Copy)]
pub struct IntegratorAgreement {
pub pos_a: DVec3,
pub vel_a: DVec3,
pub pos_b: DVec3,
pub vel_b: DVec3,
}
impl IntegratorAgreement {
pub fn position_diff(&self) -> f64 {
(self.pos_a - self.pos_b).length()
}
pub fn velocity_diff(&self) -> f64 {
(self.vel_a - self.vel_b).length()
}
}
pub fn integrator_divergence(pos_a: DVec3, vel_a: DVec3, pos_b: DVec3, vel_b: DVec3) -> (f64, f64) {
let agr = IntegratorAgreement {
pos_a,
vel_a,
pos_b,
vel_b,
};
(agr.position_diff(), agr.velocity_diff())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn zero_diff_for_identical_states() {
let p = DVec3::new(1.0, 2.0, 3.0);
let v = DVec3::new(4.0, 5.0, 6.0);
let (dp, dv) = integrator_divergence(p, v, p, v);
assert!(dp.abs() < 1e-15);
assert!(dv.abs() < 1e-15);
}
}