use nalgebra::Vector3;
use super::types::{MassiveBody, StateVector};
pub fn helio_to_democratic(
bodies: &mut [MassiveBody],
particles: &mut [StateVector],
m_sun: f64,
) -> Vector3<f64> {
let mut total_momentum = Vector3::zeros();
let mut total_mass = m_sun;
for b in bodies.iter() {
total_momentum += b.mass * b.state.vel;
total_mass += b.mass;
}
let v_bary = total_momentum / total_mass;
for b in bodies.iter_mut() {
b.state.vel -= v_bary;
}
for p in particles.iter_mut() {
p.vel -= v_bary;
}
v_bary
}
pub fn democratic_to_helio(
bodies: &mut [MassiveBody],
particles: &mut [StateVector],
v_bary: &Vector3<f64>,
) {
for b in bodies.iter_mut() {
b.state.vel += v_bary;
}
for p in particles.iter_mut() {
p.vel += v_bary;
}
}
pub fn compute_v_bary(bodies: &[MassiveBody], m_sun: f64) -> Vector3<f64> {
let mut total_momentum = Vector3::zeros();
let mut total_mass = m_sun;
for b in bodies {
total_momentum += b.mass * b.state.vel;
total_mass += b.mass;
}
total_momentum / total_mass
}
pub fn dh_velocity_correction(bodies: &[MassiveBody], m_sun: f64) -> Vector3<f64> {
let mut total_momentum = Vector3::zeros();
for b in bodies {
total_momentum += b.mass * b.state.vel;
}
total_momentum / m_sun
}
pub fn solar_drift(
bodies: &mut [MassiveBody],
particles: &mut [StateVector],
active: &[bool],
dt: f64,
m_sun: f64,
) {
let shift = dt * dh_velocity_correction(bodies, m_sun);
for b in bodies.iter_mut() {
b.state.pos += shift;
}
for (i, p) in particles.iter_mut().enumerate() {
if !active[i] {
continue;
}
p.pos += shift;
}
}