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::*;