Skip to main content

mddem/
lib.rs

1//! Top-level MDDEM crate. Re-exports all sub-crates and provides [`CorePlugins`],
2//! [`GranularDefaultPlugins`](dem_granular::GranularDefaultPlugins), and [`LJDefaultPlugins`]
3//! plugin groups for quick setup.
4
5pub use dem_atom;
6pub use dem_atom_insert;
7pub use dem_granular;
8pub use dem_gravity;
9pub use dem_wall;
10pub use md_lattice;
11pub use md_lj;
12pub use md_measure;
13pub use md_thermostat;
14pub use mddem_core;
15pub use mddem_fixes;
16pub use mddem_neighbor;
17pub use mddem_print;
18pub use mddem_verlet;
19
20use mddem_app::prelude::*;
21
22/// Core simulation infrastructure plugin group.
23///
24/// Includes, in registration order:
25/// - [`InputPlugin`](mddem_core::InputPlugin) — CLI parsing, banner printing, TOML config loading
26///   (skipped if `Config` is already present)
27/// - [`CommunicationPlugin`](mddem_core::CommunicationPlugin) —
28///   Unified MPI or single-process communication backend (selected by `mpi_backend` feature)
29/// - [`DomainPlugin`](mddem_core::DomainPlugin) — Cartesian domain decomposition
30/// - [`NeighborPlugin`](mddem_neighbor::NeighborPlugin) — sweep-and-prune neighbor lists
31/// - [`RunPlugin`](mddem_core::RunPlugin) — run/cycle management
32/// - [`VelocityVerletPlugin`](mddem_verlet::VelocityVerletPlugin) — translational Velocity Verlet integration
33/// - [`PrintPlugin`](mddem_print::PrintPlugin) — thermo output, dump files, restart files
34///
35/// MPI finalization is registered as a cleanup callback and runs automatically
36/// at the end of [`App::start()`].
37///
38/// # Usage
39/// ```rust,ignore
40/// use mddem::prelude::*;
41///
42/// let mut app = App::new();
43/// app.add_plugins(CorePlugins).add_plugins(GranularDefaultPlugins);
44/// app.start();
45/// ```
46pub struct CorePlugins;
47
48impl PluginGroup for CorePlugins {
49    fn build(self) -> PluginGroupBuilder {
50        let builder = PluginGroupBuilder::start::<Self>().add(mddem_core::InputPlugin);
51
52        builder
53            .add(mddem_core::CommunicationPlugin)
54            .add(mddem_core::DomainPlugin::default())
55            .add(mddem_neighbor::NeighborPlugin {
56                style: mddem_neighbor::NeighborStyle::Bin,
57            })
58            .add(mddem_core::GroupPlugin)
59            .add(mddem_core::RunPlugin)
60            .add(mddem_verlet::VelocityVerletPlugin)
61            .add(mddem_print::PrintPlugin)
62    }
63}
64
65/// Lennard-Jones simulation plugin group.
66///
67/// Includes:
68/// - [`LatticePlugin`](md_lattice::LatticePlugin) — FCC lattice initialization
69/// - [`LJForcePlugin`](md_lj::LJForcePlugin) — LJ 12-6 pair force + virial
70/// - [`NoseHooverPlugin`](md_thermostat::NoseHooverPlugin) — NVT thermostat
71/// - [`MeasurePlugin`](md_measure::MeasurePlugin) — RDF, MSD, pressure measurements
72pub struct LJDefaultPlugins;
73
74impl PluginGroup for LJDefaultPlugins {
75    fn build(self) -> PluginGroupBuilder {
76        PluginGroupBuilder::start::<Self>()
77            .add(md_lattice::LatticePlugin)
78            .add(md_lj::LJForcePlugin)
79            .add(md_thermostat::NoseHooverPlugin)
80            .add(md_measure::MeasurePlugin)
81    }
82}
83
84pub mod prelude {
85    pub use crate::{CorePlugins, LJDefaultPlugins};
86    pub use dem_atom::{DemAtomPlugin, DemConfig, MaterialTable};
87    pub use dem_atom_insert::{DemAtomInsertPlugin, ParticlesConfig};
88    pub use dem_granular::GranularDefaultPlugins;
89    pub use dem_gravity::{GravityConfig, GravityPlugin};
90    pub use dem_wall::{WallDef, WallPlane, WallPlugin, Walls};
91    pub use md_lattice::{LatticeConfig, LatticePlugin};
92    pub use md_lj::{LJConfig, LJForcePlugin, LJTailCorrections, VirialAccumulator};
93    pub use md_measure::{MeasureConfig, MeasurePlugin};
94    pub use md_thermostat::{LangevinConfig, LangevinPlugin, LangevinState, NoseHooverPlugin, NoseHooverState, ThermostatConfig};
95    pub use mddem_fixes::{AddForceDef, FixesPlugin, FixesRegistry, FreezeDef, MoveLinearDef, SetForceDef};
96    pub use mddem_app::prelude::*;
97    pub use mddem_core::*;
98    pub use mddem_neighbor::*;
99    pub use mddem_print::*;
100    pub use mddem_scheduler::prelude::*;
101    pub use mddem_verlet::*;
102}