1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
mod neri;
mod suzuki;

use super::State;

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum StepSize {
    UseDefault,
    Step(f64),
}

pub trait Integrator<S: State> {
    fn propagate_in_place<D1, D2>(
        &mut self,
        start: &mut S,
        pos_diff_eq: D1,
        momentum_diff_eq: D2,
        step: StepSize,
    ) where
        D1: Fn(&S) -> S::PositionDerivative,
        D2: Fn(&S) -> S::MomentumDerivative;

    fn propagate<D1, D2>(
        &mut self,
        start: &S,
        pos_diff_eq: D1,
        momentum_diff_eq: D2,
        step: StepSize,
    ) -> S
    where
        D1: Fn(&S) -> S::PositionDerivative,
        D2: Fn(&S) -> S::MomentumDerivative,
    {
        let mut result = start.clone();
        self.propagate_in_place(&mut result, pos_diff_eq, momentum_diff_eq, step);
        result
    }
}

pub use neri::*;
pub use suzuki::*;