Skip to content

Commit 83cb315

Browse files
committed
Add iterator over vertex pairs
1 parent 2f8b9c1 commit 83cb315

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

β€Žsrc/icoscan.rsβ€Ž

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -73,18 +73,29 @@ pub fn do_icoscan(
7373
.expect("invalid r value")
7474
.get(omega)
7575
.expect("invalid omega value");
76-
for vertex_a in a.vertices.iter() {
77-
for vertex_b in vertex_a.data.get().unwrap().vertices.iter() {
78-
let q1 = to_neg_zaxis(&vertex_b.pos);
79-
let q2 = around_z(omega);
80-
let q3 = UnitQuaternion::rotation_between(&zaxis, &vertex_a.pos).unwrap();
81-
let mut mol_b = ref_b.clone(); // initially at origin
82-
mol_b.transform(|pos| (q1 * q2).transform_vector(&pos));
83-
mol_b.transform(|pos| q3.transform_vector(&(pos + r_vec)));
84-
let energy = pair_matrix.sum_energy(&ref_a, &mol_b);
85-
vertex_b.data.set(energy).unwrap();
86-
}
87-
}
76+
77+
a.flat_iter().for_each(|(vertex_a, vertex_b)| {
78+
let q1 = to_neg_zaxis(&vertex_b.pos);
79+
let q2 = around_z(omega);
80+
let q3 = UnitQuaternion::rotation_between(&zaxis, &vertex_a.pos).unwrap();
81+
let mut mol_b = ref_b.clone(); // initially at origin
82+
mol_b.transform(|pos| (q1 * q2).transform_vector(&pos));
83+
mol_b.transform(|pos| q3.transform_vector(&(pos + r_vec)));
84+
let energy = pair_matrix.sum_energy(&ref_a, &mol_b);
85+
vertex_b.data.set(energy).unwrap();
86+
});
87+
// for vertex_a in a.vertices.iter() {
88+
// for vertex_b in vertex_a.data.get().unwrap().vertices.iter() {
89+
// let q1 = to_neg_zaxis(&vertex_b.pos);
90+
// let q2 = around_z(omega);
91+
// let q3 = UnitQuaternion::rotation_between(&zaxis, &vertex_a.pos).unwrap();
92+
// let mut mol_b = ref_b.clone(); // initially at origin
93+
// mol_b.transform(|pos| (q1 * q2).transform_vector(&pos));
94+
// mol_b.transform(|pos| q3.transform_vector(&(pos + r_vec)));
95+
// let energy = pair_matrix.sum_energy(&ref_a, &mol_b);
96+
// vertex_b.data.set(energy).unwrap();
97+
// }
98+
// }
8899
};
89100

90101
// Pair all mass center separations (r) and dihedral angles (omega)

β€Žsrc/icotable.rsβ€Ž

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,21 @@ use std::sync::OnceLock;
2525
/// A icotable where each vertex holds an icotable of floats
2626
pub type IcoTableOfSpheres = IcoTable<IcoTable<f64>>;
2727

28+
impl IcoTableOfSpheres {
29+
/// Get flat iterator that runs over all pairs of (vertex_a, vertex_b)
30+
pub fn flat_iter(&self) -> impl Iterator<Item = (&Vertex<IcoTable<f64>>, &Vertex<f64>)> {
31+
self.vertices.iter().flat_map(|vertex_a| {
32+
vertex_a
33+
.data
34+
.get()
35+
.unwrap()
36+
.vertices
37+
.iter()
38+
.map(move |vertex_b| (vertex_a, vertex_b))
39+
})
40+
}
41+
}
42+
2843
/// A 6D table for relative twobody orientations, R β†’ πœ” β†’ (πœƒπœ‘) β†’ (πœƒπœ‘)
2944
///
3045
/// The first two dimensions are radial distances and dihedral angles.

0 commit comments

Comments
Β (0)