From 8d2d261564153abe5dbdad2c435a7019f5e7fd30 Mon Sep 17 00:00:00 2001 From: Myeongseon Choi Date: Tue, 5 May 2026 00:50:37 +0900 Subject: [PATCH] Add simul-lattice crate for discrete space simulations --- Cargo.lock | 12 +++++++ Cargo.toml | 5 +-- simul-lattice/Cargo.toml | 16 +++++++++ simul-lattice/src/dynamics/mod.rs | 1 + simul-lattice/src/lib.rs | 10 ++++++ simul-lattice/src/prelude.rs | 1 + simul-lattice/src/space.rs | 60 +++++++++++++++++++++++++++++++ simul/Cargo.toml | 5 +-- simul/src/lib.rs | 8 +++++ 9 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 simul-lattice/Cargo.toml create mode 100644 simul-lattice/src/dynamics/mod.rs create mode 100644 simul-lattice/src/lib.rs create mode 100644 simul-lattice/src/prelude.rs create mode 100644 simul-lattice/src/space.rs diff --git a/Cargo.lock b/Cargo.lock index 2558b0d..ad63492 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2923,6 +2923,7 @@ dependencies = [ "rand 0.9.2", "simul-core", "simul-euclidean", + "simul-lattice", ] [[package]] @@ -2957,6 +2958,17 @@ dependencies = [ "thiserror", ] +[[package]] +name = "simul-lattice" +version = "0.1.0" +dependencies = [ + "approx", + "nalgebra", + "rand 0.9.2", + "rand_distr", + "simul-core", +] + [[package]] name = "slab" version = "0.4.12" diff --git a/Cargo.toml b/Cargo.toml index abb3fdc..43c49d8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ members = [ "simul-core", "simul-euclidean", "simul-io", - "simul", + "simul", "simul-lattice", ] [workspace.package] @@ -30,4 +30,5 @@ approx = "0.5" # Internal crates simul-core = { path = "simul-core" } simul-euclidean = { path = "simul-euclidean" } -simul-io = { path = "simul-io" } \ No newline at end of file +simul-io = { path = "simul-io" } +simul-lattice = { path = "simul-lattice" } diff --git a/simul-lattice/Cargo.toml b/simul-lattice/Cargo.toml new file mode 100644 index 0000000..9a0841e --- /dev/null +++ b/simul-lattice/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "simul-lattice" +description = "Lattice space simulations (MD, Brownian, Langevin) for the simul framework" +version.workspace = true +edition.workspace = true +license.workspace = true + +[dependencies] +simul-core = { workspace = true } +nalgebra = { workspace = true } +rand = { workspace = true } +rand_distr = { workspace = true } + +[dev-dependencies] +approx = { workspace = true } +nalgebra = { workspace = true } diff --git a/simul-lattice/src/dynamics/mod.rs b/simul-lattice/src/dynamics/mod.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/simul-lattice/src/dynamics/mod.rs @@ -0,0 +1 @@ + diff --git a/simul-lattice/src/lib.rs b/simul-lattice/src/lib.rs new file mode 100644 index 0000000..c811c3e --- /dev/null +++ b/simul-lattice/src/lib.rs @@ -0,0 +1,10 @@ +//! simul-lattice: Discrete space simulations +//! +//! This crate provides implementations for simulations in discrete space: +//! - Molecular dynamics (Verlet integrator) +//! - Langevin dynamics (stochastic) +//! - Brownian dynamics (overdamped) + +pub mod dynamics; +pub mod prelude; +pub mod space; diff --git a/simul-lattice/src/prelude.rs b/simul-lattice/src/prelude.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/simul-lattice/src/prelude.rs @@ -0,0 +1 @@ + diff --git a/simul-lattice/src/space.rs b/simul-lattice/src/space.rs new file mode 100644 index 0000000..ceee4e8 --- /dev/null +++ b/simul-lattice/src/space.rs @@ -0,0 +1,60 @@ +//! Lattice space implementation + +use nalgebra::SVector; +use simul_core::space::StateSpace; + +/// D-dimensional Lattice space +/// +/// This is the standard discrete space for molecular dynamics and Brownian motion. +/// Points are represented as D-dimensional vectors of i32. +#[derive(Clone, Debug, Default)] +pub struct Lattice; + +impl StateSpace for Lattice { + const DIM: usize = D; + + type Point = SVector; + type Momentum = SVector; + + fn is_continuous() -> bool { + false + } + + fn name() -> &'static str { + match D { + 1 => "Lattice 1D", + 2 => "Lattice 2D", + 3 => "Lattice 3D", + _ => "Lattice ND", + } + } + + fn zero_point() -> Self::Point { + SVector::zeros() + } + + fn zero_momentum() -> Self::Momentum { + SVector::zeros() + } +} + +/// Type alias for 1D Lattice space +pub type Space1D = Lattice<1>; + +/// Type alias for 2D Lattice space +pub type Space2D = Lattice<2>; + +/// Type alias for 3D Lattice space +pub type Space3D = Lattice<3>; + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_lattice_3d() { + assert_eq!(Lattice::<3>::DIM, 3); + assert!(!Lattice::<3>::is_continuous()); + assert_eq!(Lattice::<3>::name(), "Lattice 3D"); + } +} diff --git a/simul/Cargo.toml b/simul/Cargo.toml index e65e6ab..1ccffac 100644 --- a/simul/Cargo.toml +++ b/simul/Cargo.toml @@ -8,14 +8,15 @@ license.workspace = true [features] default = ["euclidean"] euclidean = ["simul-euclidean"] -# lattice = ["simul-lattice"] # Future +lattice = ["simul-lattice"] [dependencies] simul-core = { workspace = true } simul-euclidean = { workspace = true, optional = true } +simul-lattice = { workspace = true, optional = true } nalgebra = { workspace = true } rand = { workspace = true } -# simul-lattice = { workspace = true, optional = true } # Future + [[example]] name = "hello_argon" diff --git a/simul/src/lib.rs b/simul/src/lib.rs index f24f173..e0eb587 100644 --- a/simul/src/lib.rs +++ b/simul/src/lib.rs @@ -27,6 +27,10 @@ pub use simul_core as core; #[cfg(feature = "euclidean")] pub use simul_euclidean as euclidean; +// Re-export lattice (when feature enabled) +#[cfg(feature = "lattice")] +pub use simul_lattice as lattice; + pub mod prelude { //! Convenient re-exports for common use //! @@ -43,4 +47,8 @@ pub mod prelude { // Euclidean types (when enabled) #[cfg(feature = "euclidean")] pub use simul_euclidean::prelude::*; + + // Lattice types (when enabled) + #[cfg(feature = "lattice")] + pub use simul_lattice::prelude::*; }