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)
10
11#[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}