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