numeric_algs/symplectic/integration/
mod.rs

1mod neri;
2mod suzuki;
3
4use super::State;
5
6#[derive(Clone, Copy, Debug, PartialEq)]
7pub enum StepSize {
8    UseDefault,
9    Step(f64),
10}
11
12pub trait Integrator<S: State> {
13    fn propagate_in_place<D1, D2>(
14        &mut self,
15        start: &mut S,
16        pos_diff_eq: D1,
17        momentum_diff_eq: D2,
18        step: StepSize,
19    ) where
20        D1: Fn(&S) -> S::PositionDerivative,
21        D2: Fn(&S) -> S::MomentumDerivative;
22
23    fn propagate<D1, D2>(
24        &mut self,
25        start: &S,
26        pos_diff_eq: D1,
27        momentum_diff_eq: D2,
28        step: StepSize,
29    ) -> S
30    where
31        D1: Fn(&S) -> S::PositionDerivative,
32        D2: Fn(&S) -> S::MomentumDerivative,
33    {
34        let mut result = start.clone();
35        self.propagate_in_place(&mut result, pos_diff_eq, momentum_diff_eq, step);
36        result
37    }
38}
39
40pub use neri::*;
41pub use suzuki::*;