summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoreug-vs <eugene@eug-vs.xyz>2024-12-11 02:12:22 +0100
committereug-vs <eugene@eug-vs.xyz>2024-12-11 02:20:41 +0100
commitecdafb45dd9c416cb0810d6687a20ac97e480ac9 (patch)
tree5f4b7de4f9994236ab21d1caba370fcee0f6f805 /src
parentfe464a9fe49e4319be9baa8321ac6cf0a7a7945c (diff)
downloadparticle-physics-ecdafb45dd9c416cb0810d6687a20ac97e480ac9.tar.gz
refactor: allow for other solver implementations
Diffstat (limited to 'src')
-rw-r--r--src/main.rs5
-rw-r--r--src/particle_system.rs4
-rw-r--r--src/solver/midpoint.rs18
-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() {