Skip to main content

benzene/
benzene.rs

1use uff_relax::{System, Atom, Bond, UnitCell, UffOptimizer};
2use glam::DVec3;
3
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}