numeric_algs/symplectic/integration/
mod.rs1mod 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::*;