lox_orbits/
propagators.rs

1// SPDX-FileCopyrightText: 2024 Helge Eichhorn <git@helgeeichhorn.de>
2//
3// SPDX-License-Identifier: MPL-2.0
4
5use lox_bodies::Origin;
6use lox_time::Time;
7use lox_time::time_scales::TimeScale;
8
9use crate::trajectories::TrajectoryError;
10use crate::{states::State, trajectories::Trajectory};
11use lox_frames::ReferenceFrame;
12
13pub mod semi_analytical;
14pub mod sgp4;
15mod stumpff;
16
17pub trait Propagator<T, O, R>
18where
19    T: TimeScale + Clone,
20    O: Origin + Clone,
21    R: ReferenceFrame + Clone,
22{
23    type Error: From<TrajectoryError>;
24
25    fn propagate(&self, time: Time<T>) -> Result<State<T, O, R>, Self::Error>;
26
27    fn propagate_all(
28        &self,
29        times: impl IntoIterator<Item = Time<T>>,
30    ) -> Result<Trajectory<T, O, R>, Self::Error> {
31        let mut states = vec![];
32        for time in times {
33            let state = self.propagate(time)?;
34            states.push(state);
35        }
36        Ok(Trajectory::new(&states)?)
37    }
38}