// [[file:../neighbors.note::ef6b0d05][ef6b0d05]] use gchemol_neighbors::Neighborhood; #[test] fn test_periodic_neighbors() { use approx::*; use vecfx::*; let particles = [[ 0.60421912, 4.2840792 , 0.67433509], [-0.69258171, 3.9731936 , 3.49208748], [ 0.32811792, 4.34729737, 6.48343793], [ 4.88477572, 1.81537674, 6.26972558], [ 6.14499816, 1.48505734, 3.37312786], [ 5.12754047, 1.85762907, 0.43572421], [ 2.09507387, 3.66872721, 0.39353504], [ 0.5848138 , 0.91854645, 0.28564143], [ 0.33364169, 4.10698461, 2.26790994], [-1.14582521, 2.41879964, 3.57784907], [ 0.06571752, 4.4286596 , 4.80486228], [ 3.78132323, 0.96146537, 0.19503846], [ 3.29078661, 1.21859679, 6.60654731], [ 4.93953611, 3.49170736, 6.71444093], [ 5.15070623, 1.63464631, 4.60290757], [ 6.60903043, 4.89706872, 3.2209702 ], [ 5.36681478, 1.95057166, 2.05143108], [ 1.73241622, 3.38087446, 6.78291188]]; let cell = [[ 8.60700000e+00, 0.00000000e+00, 0.00000000e+00], [ 8.64636107e-04, 4.95399992e+00, 0.00000000e+00], [-3.14318359e+00, 1.38078488e-02, 6.91625732e+00]]; let mut nh = Neighborhood::new(); nh.update(particles.iter().enumerate().map(|(i, &v)| (i + 1, v))); nh.set_lattice(cell); let cutoff = 1.8; let mut neighbors: Vec<_> = nh.neighbors(1, cutoff).collect(); // sort by node index neighbors.sort_by_key(|n| n.node); assert_eq!(4, neighbors.len(), "{:?}", neighbors); let nodes: Vec<_> = neighbors.iter().map(|n| n.node).collect(); assert_eq!(nodes, vec![7, 8, 9, 14]); let images: Vec<_> = neighbors.iter().map(|n| n.image.unwrap()).collect(); let expected = vec![ [0.0, 0.0, 0.0], // node 7 [0.0, 1.0, 0.0], // node 8 [0.0, 0.0, 0.0], // node 9 [-1.0, 0.0, -1.0], // node 14 ]; for (i, &image) in images.iter().enumerate() { let _image = Vector3f::from(expected[i]); assert_relative_eq!(image, _image); } // Fe32C2 #[rustfmt::skip] let particles = [[ 4.01630700e+00, 0.00000000e+00, 9.45118200e+00], [ 4.01630700e+00, 3.43100400e+00, 9.45118200e+00], [ 3.64450000e-02, 0.00000000e+00, 4.91360000e-02], [-4.79000000e-04, 0.00000000e+00, 2.71075600e+00], [-4.79000000e-04, 0.00000000e+00, 5.39025700e+00], [ 3.64450000e-02, 0.00000000e+00, 8.05187700e+00], [ 3.64450000e-02, 3.43100400e+00, 4.91360000e-02], [-4.79000000e-04, 3.43100400e+00, 2.71075600e+00], [-4.79000000e-04, 3.43100400e+00, 5.39025700e+00], [ 3.64450000e-02, 3.43100400e+00, 8.05187700e+00], [ 2.64109300e+00, 0.00000000e+00, 4.91360000e-02], [ 2.67801700e+00, 0.00000000e+00, 2.71075600e+00], [ 2.67801700e+00, 0.00000000e+00, 5.39025700e+00], [ 2.64109300e+00, 0.00000000e+00, 8.05187700e+00], [ 2.64109300e+00, 3.43100400e+00, 4.91360000e-02], [ 2.67801700e+00, 3.43100400e+00, 2.71075600e+00], [ 2.67801700e+00, 3.43100400e+00, 5.39025700e+00], [ 2.64109300e+00, 3.43100400e+00, 8.05187700e+00], [ 1.33876900e+00, 1.71550200e+00, 1.36751700e+00], [ 1.33876900e+00, 1.71550200e+00, 4.05050700e+00], [ 1.33876900e+00, 1.71550200e+00, 6.73349600e+00], [ 1.33876900e+00, 1.71550200e+00, 9.45118200e+00], [ 1.33876900e+00, 5.14650600e+00, 1.36751700e+00], [ 1.33876900e+00, 5.14650600e+00, 4.05050700e+00], [ 1.33876900e+00, 5.14650600e+00, 6.73349600e+00], [ 1.33876900e+00, 5.14650600e+00, 9.45118200e+00], [ 4.01630700e+00, 1.71550200e+00, 1.37042100e+00], [ 4.01630700e+00, 1.71550200e+00, 4.05050700e+00], [ 4.01630700e+00, 1.71550200e+00, 6.73059200e+00], [ 4.01630700e+00, 1.71550200e+00, 9.45118200e+00], [ 4.01630700e+00, 5.14650600e+00, 1.37042100e+00], [ 4.01630700e+00, 5.14650600e+00, 4.05050700e+00], [ 4.01630700e+00, 5.14650600e+00, 6.73059200e+00], [ 4.01630700e+00, 5.14650600e+00, 9.45118200e+00]]; #[rustfmt::skip] let cell = [[ 5.35507610e+00, 0.00000000e+00, -0.00000000e+00], [-0.00000000e+00, 6.86200788e+00, -0.00000000e+00], [ 0.00000000e+00, 0.00000000e+00, 1.08013509e+01]]; let mut nh = Neighborhood::new(); nh.update(particles.iter().enumerate().map(|(i, &v)| (i + 1, v))); nh.set_lattice(cell); // NOTE: node 4 is speical let mut neighbors: Vec<_> = nh.neighbors(4, 3.0).collect(); // sort by node index neighbors.sort_by_key(|n| n.node); assert_eq!(12, neighbors.len(), "{:?}", neighbors); let nodes: Vec<_> = neighbors.iter().map(|n| n.node).collect(); assert_eq!(nodes, vec![3, 5, 12, 12, 19, 20, 23, 24, 27, 28, 31, 32]); let images: Vec<_> = neighbors.iter().map(|n| n.image.unwrap()).collect(); let expected = vec![ [0.0, 0.0, 0.0], // node 3 [0.0, 0.0, 0.0], // node 5 [0.0, 0.0, 0.0], // node 12 [-1.0, 0.0, 0.0], // node 12 [0.0, 0.0, 0.0], // node 19 [0.0, 0.0, 0.0], // node 20 [0.0, -1.0, 0.0], // node 23 [0.0, -1.0, 0.0], // node 24 [-1.0, 0.0, 0.0], // node 27 [-1.0, 0.0, 0.0], // node 28 [-1.0, -1.0, 0.0], // node 31 [-1.0, -1.0, 0.0], // node 32 ]; for (&image, image_) in images.iter().zip(expected) { let image_ = Vector3f::from(image_); assert_relative_eq!(image, image_); } } // ef6b0d05 ends here