Loading...
Searching...
No Matches
VesinNeighbors.h
Go to the documentation of this file.
1/*
2** This file is part of eOn.
3**
4** SPDX-License-Identifier: BSD-3-Clause
5**
6** Shared neighbor lists via vesin (single NL backend for classical pots
7** and Metatomic). Do not reimplement Verlet / link-cell / O(N^2) loops.
8*/
9#pragma once
10
11#include <array>
12#include <cstddef>
13#include <cstdint>
14#include <stdexcept>
15#include <string>
16
17// Vendored / system vesin C API
18#include "vesin.h"
19
20namespace eonc {
21
28public:
29 struct Options {
30 double cutoff{0.0};
31 bool full{false};
32 bool sorted{false};
33 bool return_shifts{false};
34 bool return_distances{true};
35 bool return_vectors{true};
36 std::array<bool, 3> periodic{{true, true, true}};
41 double skin{0.0};
44 int32_t n_threads{1};
46 VesinAlgorithm algorithm{VesinAutoAlgorithm};
47 };
48
49 VesinNeighbors() = default;
50 VesinNeighbors(const VesinNeighbors &) = delete;
52 VesinNeighbors(VesinNeighbors &&other) noexcept;
53 VesinNeighbors &operator=(VesinNeighbors &&other) noexcept;
55
62 void compute(const double *R, std::size_t n, const double *box,
63 const Options &opt);
64
65 [[nodiscard]] std::size_t size() const { return list_.length; }
66
67 [[nodiscard]] std::size_t i(std::size_t p) const { return list_.pairs[p][0]; }
68 [[nodiscard]] std::size_t j(std::size_t p) const { return list_.pairs[p][1]; }
69
71 [[nodiscard]] double distance(std::size_t p) const {
72 return list_.distances[p];
73 }
74
76 [[nodiscard]] const double *vector(std::size_t p) const {
77 return list_.vectors[p];
78 }
79
80 [[nodiscard]] const int32_t *shift(std::size_t p) const {
81 return list_.shifts[p];
82 }
83
85 [[nodiscard]] const VesinNeighborList &raw() const { return list_; }
86 [[nodiscard]] VesinNeighborList &raw() { return list_; }
87
90 VesinNeighborList *release();
91
92private:
93 VesinNeighborList list_{};
94 bool owns_{false};
95
96 void free_list();
97};
98
99} // namespace eonc
std::size_t j(std::size_t p) const
const double * vector(std::size_t p) const
Vector r_j − r_i (+ PBC). Requires return_vectors.
const int32_t * shift(std::size_t p) const
std::size_t i(std::size_t p) const
VesinNeighborList list_
VesinNeighborList * release()
Steal ownership of the internal list (for Metatomic custom deleters).
VesinNeighborList & raw()
VesinNeighbors & operator=(const VesinNeighbors &)=delete
double distance(std::size_t p) const
Distance |r_ij| (requires return_distances).
void compute(const double *R, std::size_t n, const double *box, const Options &opt)
Build / rebuild the list.
VesinNeighbors(const VesinNeighbors &)=delete
VesinNeighbors()=default
std::size_t size() const
const VesinNeighborList & raw() const
Raw list for advanced consumers (Metatomic tensor conversion).
RAII resource manager for the ARTn C library with global synchronization.
VesinAlgorithm algorithm
vesin pair-search algorithm (auto / brute-force MIC / cell list).
int32_t n_threads
Threads for the vesin build; 1 keeps small builds deterministic and spawn-free, 0 defers to OMP_NUM_T...
double skin
vesin 0.6 native Verlet skin: > 0 lets vesin cache the topology in this list until an atom moves more...
bool full
true: both i→j and j→i; false: half list
std::array< bool, 3 > periodic