Skip to main content

oxiphysics_gpu/kernels/md_force/
nlistupdatekernel_traits.rs

1//! # NlistUpdateKernel - Trait Implementations
2//!
3//! This module contains trait implementations for `NlistUpdateKernel`.
4//!
5//! ## Implemented Traits
6//!
7//! - `ComputeKernel`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10use 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}