pub struct Atom {
pub element: usize,
pub position: DVec3,
pub force: DVec3,
pub uff_type: UffAtomType,
}Expand description
Represents an individual atom in the system.
Fields§
§element: usizeAtomic number (e.g., 1 for H, 6 for C).
position: DVec3Position in Cartesian coordinates (Å).
force: DVec3Current force acting on the atom (kcal/mol/Å).
uff_type: UffAtomTypeInternal UFF atom type label (assigned automatically).
Implementations§
Source§impl Atom
impl Atom
Sourcepub fn new(element: usize, position: DVec3) -> Self
pub fn new(element: usize, position: DVec3) -> Self
Creates a new atom with the given atomic number and position.
Examples found in repository?
examples/benzene.rs (line 12)
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}Trait Implementations§
Source§impl<'de> Deserialize<'de> for Atom
impl<'de> Deserialize<'de> for Atom
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Auto Trait Implementations§
impl Freeze for Atom
impl RefUnwindSafe for Atom
impl Send for Atom
impl Sync for Atom
impl Unpin for Atom
impl UnwindSafe for Atom
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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