pub struct UffOptimizer {
pub max_iterations: usize,
pub force_threshold: f64,
pub verbose: bool,
pub num_threads: usize,
pub cutoff: f64,
pub history_size: usize,
}Expand description
Optimizer for molecular structures using the FIRE (Fast Iterative Relaxation Engine) algorithm.
Fields§
§max_iterations: usizeMaximum number of iterations to perform.
force_threshold: f64Threshold for the maximum force on any atom (kcal/mol/Å).
verbose: boolWhether to print optimization progress to stdout.
num_threads: usizeNumber of threads to use. 0 means automatic based on system size.
cutoff: f64Cutoff distance for non-bonded interactions (Å).
history_size: usizeNumber of steps to average for convergence criteria.
Implementations§
Source§impl UffOptimizer
impl UffOptimizer
Sourcepub fn new(max_iterations: usize, force_threshold: f64) -> Self
pub fn new(max_iterations: usize, force_threshold: f64) -> Self
Creates a new optimizer with default settings.
§Arguments
max_iterations- Maximum number of steps.force_threshold- Convergence threshold for forces.
Examples found in repository?
examples/benzene.rs (line 37)
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}pub fn with_num_threads(self, num_threads: usize) -> Self
pub fn with_cutoff(self, cutoff: f64) -> Self
pub fn with_history_size(self, size: usize) -> Self
Sourcepub fn with_verbose(self, verbose: bool) -> Self
pub fn with_verbose(self, verbose: bool) -> Self
Examples found in repository?
examples/benzene.rs (line 38)
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 optimize(&self, system: &mut System)
pub fn optimize(&self, system: &mut System)
Optimized structural geometry using the FIRE algorithm.
Examples found in repository?
examples/benzene.rs (line 43)
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}Auto Trait Implementations§
impl Freeze for UffOptimizer
impl RefUnwindSafe for UffOptimizer
impl Send for UffOptimizer
impl Sync for UffOptimizer
impl Unpin for UffOptimizer
impl UnwindSafe for UffOptimizer
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