ak_core/utils/
distance_matrix.rs1use crate::StructureView;
2
3pub fn distance_matrix(view: &StructureView) -> Vec<f64> {
4 let positions = view.positions;
5 let n = positions.len();
6 let mut output = Vec::with_capacity(n * n);
7
8 for i in 0..n {
9 for j in 0..n {
10 let dx = positions[i][0] - positions[j][0];
11 let dy = positions[i][1] - positions[j][1];
12 let dz = positions[i][2] - positions[j][2];
13 let r2 = dx * dx + dy * dy + dz * dz;
14 output.push(f64::sqrt(r2));
15 }
16 }
17
18 output
19}
20
21#[test]
22fn test_shape() {
23 use crate::Structure;
24 let positions = [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]].to_vec();
25 let numbers = [1, 1, 1].to_vec();
26 let cell = [[10.0, 0.0, 0.0], [0.0, 10.0, 0.0], [0.0, 0.0, 10.0]];
27 let pbc = [false, false, false];
28 let structure = Structure::new(positions.clone(), numbers.clone(), cell, pbc);
29 let view = structure.view();
30
31 let distances = distance_matrix(&view);
32 println!("{:#?}", distances);
33 assert_eq!(distances.len(), 9)
34}
35
36#[test]
37fn test_output() {
38 use crate::Structure;
39 use std::f64::consts::SQRT_2;
40
41 let positions = [[0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0]].to_vec();
42 let numbers = [1, 1, 1].to_vec();
43 let cell = [[10.0, 0.0, 0.0], [0.0, 10.0, 0.0], [0.0, 0.0, 10.0]];
44 let pbc = [false, false, false];
45 let structure = Structure::new(positions.clone(), numbers.clone(), cell, pbc);
46 let view = structure.view();
47 let distances = distance_matrix(&view);
48
49 let expected_distances = vec![0.0, 1.0, 1.0, 1.0, 0.0, SQRT_2, 1.0, SQRT_2, 0.0];
50 assert_eq!(expected_distances, distances)
51}