diff options
-rw-r--r-- | src/main.rs | 5 | ||||
-rw-r--r-- | src/particle_system.rs | 4 | ||||
-rw-r--r-- | src/solver/midpoint.rs | 18 | ||||
-rw-r--r-- | src/solver/mod.rs (renamed from src/midpoint.rs) | 24 |
4 files changed, 28 insertions, 23 deletions
diff --git a/src/main.rs b/src/main.rs index 8984bf6..0a51789 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,8 @@ -use particle_system::{Particle, ParticleSystem, Point, Solver, Vector}; +use particle_system::{Particle, ParticleSystem, Point, Vector}; +use solver::Solver; -mod midpoint; mod particle_system; +mod solver; fn main() { let dt = 0.01; diff --git a/src/particle_system.rs b/src/particle_system.rs index 52e6284..6f43c35 100644 --- a/src/particle_system.rs +++ b/src/particle_system.rs @@ -41,7 +41,3 @@ pub struct ParticleSystem { /// Simulation clock pub t: Scalar, } - -pub trait Solver { - fn step(&mut self, dt: Scalar); -} diff --git a/src/solver/midpoint.rs b/src/solver/midpoint.rs new file mode 100644 index 0000000..c5a01c4 --- /dev/null +++ b/src/solver/midpoint.rs @@ -0,0 +1,18 @@ +use crate::particle_system::{ParticleSystem, Scalar}; +use super::{PhaseSpace, Solver}; + +impl Solver for ParticleSystem { + fn step(&mut self, dt: Scalar) { + let mut state = self.collect_phase_space(); + + // Shift to the midpoint + self.scatter_phase_space(&&PhaseSpace { + 0: state.0.clone() + self.compute_derivative().0 * dt / 2.0, + }); + + state.0 += self.compute_derivative().0 * dt; + self.scatter_phase_space(&state); + + self.t += dt; + } +} diff --git a/src/midpoint.rs b/src/solver/mod.rs index 1aa1de8..4a5fec5 100644 --- a/src/midpoint.rs +++ b/src/solver/mod.rs @@ -1,6 +1,8 @@ -use crate::particle_system::{ParticleSystem, Point, Scalar, Solver, Vector, N}; +use crate::particle_system::{ParticleSystem, Point, Scalar, Vector, N}; use nalgebra::{Const, DVector, Dyn, Matrix, ViewStorage}; +mod midpoint; + /// A vector of concatenated position and velocity components of each particle #[derive(Debug, Clone)] pub struct PhaseSpace(DVector<Scalar>); @@ -70,26 +72,14 @@ impl ParticleSystem { } } -impl Solver for ParticleSystem { - fn step(&mut self, dt: Scalar) { - let mut state = self.collect_phase_space(); - - // Shift to the midpoint - self.scatter_phase_space(&PhaseSpace { - 0: state.0.clone() + self.compute_derivative().0 * dt / 2.0, - }); - - state.0 += self.compute_derivative().0 * dt; - self.scatter_phase_space(&state); - - self.t += dt; - } +pub trait Solver { + fn step(&mut self, dt: Scalar); } #[cfg(test)] mod tests { - use super::{ParticleSystem, PhaseSpace, Point, Scalar, Vector}; - use crate::particle_system::{Particle, Solver}; + use super::{ParticleSystem, PhaseSpace, Point, Scalar, Solver, Vector}; + use crate::particle_system::Particle; #[test] fn test_collect_phase_space() { |