use stormath::spatial_vector::SpatialVector;
use stormath::finite_difference;
use stormath::type_aliases::Float;
#[derive(Debug, Clone)]
pub struct FlowDerivatives {
pub velocity_history: [Vec<SpatialVector>; 2],
update_count: usize,
}
impl FlowDerivatives {
pub fn new(initial_velocity: &[SpatialVector]) -> Self {
Self {
velocity_history: [initial_velocity.to_vec(), initial_velocity.to_vec()],
update_count: 0,
}
}
pub fn acceleration(&self, current_velocity: &[SpatialVector], time_step: Float) -> Vec<SpatialVector> {
if self.update_count < 2 {
return vec![SpatialVector::default(); current_velocity.len()];
}
let mut acceleration = Vec::with_capacity(current_velocity.len());
for i in 0..current_velocity.len() {
let data = [
self.velocity_history[0][i],
self.velocity_history[1][i],
current_velocity[i],
];
acceleration.push(
finite_difference::first_derivative_second_order_backward(
&data,
time_step,
)
);
}
acceleration
}
pub fn update(&mut self, current_velocity: &[SpatialVector]) {
self.velocity_history[0] = self.velocity_history[1].clone();
self.velocity_history[1] = current_velocity.to_vec();
self.update_count += 1;
}
}