use nalgebra::{DMatrix, DVector};
use crate::propagators::traits::DStatePropagator;
use crate::propagators::{DNumericalOrbitPropagator, DNumericalPropagator};
use crate::time::Epoch;
pub enum DynamicsSource {
OrbitPropagator(DNumericalOrbitPropagator),
GenericPropagator(DNumericalPropagator),
}
impl DynamicsSource {
pub fn propagate_to(&mut self, epoch: Epoch) {
match self {
DynamicsSource::OrbitPropagator(p) => p.propagate_to(epoch),
DynamicsSource::GenericPropagator(p) => p.propagate_to(epoch),
}
}
pub fn current_state(&self) -> DVector<f64> {
match self {
DynamicsSource::OrbitPropagator(p) => p.current_state(),
DynamicsSource::GenericPropagator(p) => p.current_state(),
}
}
pub fn current_epoch(&self) -> Epoch {
match self {
DynamicsSource::OrbitPropagator(p) => p.current_epoch(),
DynamicsSource::GenericPropagator(p) => p.current_epoch(),
}
}
pub fn stm(&self) -> Option<&DMatrix<f64>> {
match self {
DynamicsSource::OrbitPropagator(p) => p.stm(),
DynamicsSource::GenericPropagator(p) => p.stm(),
}
}
pub fn current_covariance(&self) -> Option<&DMatrix<f64>> {
match self {
DynamicsSource::OrbitPropagator(p) => p.current_covariance(),
DynamicsSource::GenericPropagator(p) => p.current_covariance(),
}
}
pub fn has_stm(&self) -> bool {
match self {
DynamicsSource::OrbitPropagator(p) => p.has_stm(),
DynamicsSource::GenericPropagator(p) => p.has_stm(),
}
}
pub fn reinitialize(
&mut self,
epoch: Epoch,
state: DVector<f64>,
covariance: Option<DMatrix<f64>>,
) {
match self {
DynamicsSource::OrbitPropagator(p) => p.reinitialize(epoch, state, covariance),
DynamicsSource::GenericPropagator(p) => p.reinitialize(epoch, state, covariance),
}
}
pub fn state_dim(&self) -> usize {
match self {
DynamicsSource::OrbitPropagator(p) => p.state_dim(),
DynamicsSource::GenericPropagator(p) => p.state_dim(),
}
}
}