Skip to main content

sidereon_core/astro/forces/
composite.rs

1use crate::astro::error::PropagationError;
2use crate::astro::forces::r#trait::ForceModel;
3use crate::astro::propagator::api::PropagationContext;
4use crate::astro::state::CartesianState;
5use nalgebra::Vector3;
6
7#[derive(Default)]
8pub struct CompositeForceModel {
9    pub models: Vec<Box<dyn ForceModel>>,
10}
11
12impl CompositeForceModel {
13    pub fn new() -> Self {
14        Self::default()
15    }
16
17    pub fn add(&mut self, model: Box<dyn ForceModel>) {
18        self.models.push(model);
19    }
20}
21
22impl ForceModel for CompositeForceModel {
23    fn acceleration(
24        &self,
25        state: &CartesianState,
26        ctx: &PropagationContext,
27    ) -> Result<Vector3<f64>, PropagationError> {
28        let mut accel = Vector3::zeros();
29        for model in &self.models {
30            accel += model.acceleration(state, ctx)?;
31        }
32        Ok(accel)
33    }
34}