oxiphysics_gpu/kernels/md_force/
nlistupdatekernel_traits.rs1#[allow(unused_imports)]
12use super::functions::*;
13use crate::compute::ComputeKernel;
14
15use super::types::NlistUpdateKernel;
16
17impl ComputeKernel for NlistUpdateKernel {
18 fn name(&self) -> &str {
19 "NlistUpdateKernel"
20 }
21 fn execute(&self, inputs: &[&[f64]], outputs: &mut [Vec<f64>], work_size: usize) {
22 if inputs.len() < 3 || outputs.len() < 2 {
23 return;
24 }
25 let pos = inputs[0];
26 let ref_pos = inputs[1];
27 let cutoff = inputs[2][0];
28 let skin = inputs[2][1];
29 let n = work_size;
30 let mut max_disp2 = 0.0f64;
31 for i in 0..n {
32 let dx = pos[i * 3] - ref_pos[i * 3];
33 let dy = pos[i * 3 + 1] - ref_pos[i * 3 + 1];
34 let dz = pos[i * 3 + 2] - ref_pos[i * 3 + 2];
35 let d2 = dx * dx + dy * dy + dz * dz;
36 if d2 > max_disp2 {
37 max_disp2 = d2;
38 }
39 }
40 let max_disp = max_disp2.sqrt();
41 let needs_rebuild = max_disp > skin * 0.5;
42 if !needs_rebuild {
43 outputs[0] = vec![];
44 outputs[1] = vec![0.0, 0.0];
45 return;
46 }
47 let r_list = cutoff + skin;
48 let r_list2 = r_list * r_list;
49 let mut pairs = Vec::new();
50 for i in 0..n {
51 for j in (i + 1)..n {
52 let dx = pos[i * 3] - pos[j * 3];
53 let dy = pos[i * 3 + 1] - pos[j * 3 + 1];
54 let dz = pos[i * 3 + 2] - pos[j * 3 + 2];
55 let r2 = dx * dx + dy * dy + dz * dz;
56 if r2 < r_list2 {
57 pairs.push(i as f64);
58 pairs.push(j as f64);
59 }
60 }
61 }
62 let num_pairs = pairs.len() / 2;
63 outputs[0] = pairs;
64 outputs[1] = vec![1.0, num_pairs as f64];
65 }
66}