pub struct System {
pub atoms: Vec<Atom>,
pub bonds: Vec<Bond>,
pub cell: UnitCell,
}Expand description
Represents a molecular system consisting of atoms, bonds, and an optional unit cell.
Fields§
§atoms: Vec<Atom>List of atoms in the system.
bonds: Vec<Bond>List of chemical bonds.
cell: UnitCellUnit cell for periodic boundary conditions.
Implementations§
Source§impl System
impl System
Sourcepub fn new(atoms: Vec<Atom>, bonds: Vec<Bond>, cell: UnitCell) -> Self
pub fn new(atoms: Vec<Atom>, bonds: Vec<Bond>, cell: UnitCell) -> Self
Creates a new molecular system and automatically assigns UFF atom types.
§Arguments
atoms- Initial atom positions and elements.bonds- Connectivity and bond orders.cell- Boundary conditions (useUnitCell::new_none()for gas phase).
Examples found in repository?
examples/benzene.rs (line 33)
4fn main() {
5 // 1. Create atoms for Benzene (6 Carbons, 6 Hydrogens)
6 let mut atoms = Vec::new();
7
8 // Carbon ring (approximate positions)
9 for i in 0..6 {
10 let angle = (i as f64) * 60.0f64.to_radians();
11 let pos = DVec3::new(angle.cos() * 1.4, angle.sin() * 1.4, 0.0);
12 atoms.push(Atom::new(6, pos)); // 6 is Atomic Number for Carbon
13 }
14
15 // Hydrogen atoms (approximate positions)
16 for i in 0..6 {
17 let angle = (i as f64) * 60.0f64.to_radians();
18 let pos = DVec3::new(angle.cos() * 2.4, angle.sin() * 2.4, 0.0);
19 atoms.push(Atom::new(1, pos)); // 1 is Atomic Number for Hydrogen
20 }
21
22 // 2. Define bonds
23 let mut bonds = Vec::new();
24 for i in 0..6 {
25 // C-C aromatic bonds (order 1.5)
26 bonds.push(Bond { atom_indices: (i, (i + 1) % 6), order: 1.5 });
27 // C-H single bonds (order 1.0)
28 bonds.push(Bond { atom_indices: (i, i + 6), order: 1.0 });
29 }
30
31 // 3. Setup the system (No periodic boundary conditions)
32 let cell = UnitCell::new_none();
33 let mut system = System::new(atoms, bonds, cell);
34
35 // 4. Configure the optimizer
36 // Max 1000 iterations, force threshold 1e-3 kcal/mol/A
37 let optimizer = UffOptimizer::new(1000, 1e-3)
38 .with_verbose(true); // Print progress to console
39
40 println!("Starting optimization of Benzene...");
41
42 // 5. Run the optimization
43 optimizer.optimize(&mut system);
44
45 println!("Optimization complete!");
46
47 // Check final C-C bond length
48 let d01 = (system.atoms[0].position - system.atoms[1].position).length();
49 println!("Final C-C bond length: {:.4} Å", d01);
50}Sourcepub fn auto_assign_uff_types(&mut self)
pub fn auto_assign_uff_types(&mut self)
Automatically infers UFF atom types based on element, connectivity, and bond orders.
Sourcepub fn compute_forces(&mut self) -> EnergyTerms
pub fn compute_forces(&mut self) -> EnergyTerms
Computes forces and total energy breakdown.
pub fn compute_forces_with_threads( &mut self, num_threads: usize, cutoff: f64, ) -> EnergyTerms
Auto Trait Implementations§
impl Freeze for System
impl RefUnwindSafe for System
impl Send for System
impl Sync for System
impl Unpin for System
impl UnwindSafe for System
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more