sidereon_core/astro/forces/
composite.rs1use 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}