Loading...
Searching...
No Matches
eonc::VesinNeighbors Class Reference

RAII wrapper around vesin_neighbors for Matter-style boxes (double[9] row-major 3×3 cell, same layout as Matter::cell). More...

#include <VesinNeighbors.h>

Classes

struct  Options

Public Member Functions

 VesinNeighbors ()=default
 VesinNeighbors (const VesinNeighbors &)=delete
VesinNeighborsoperator= (const VesinNeighbors &)=delete
 VesinNeighbors (VesinNeighbors &&other) noexcept
VesinNeighborsoperator= (VesinNeighbors &&other) noexcept
 ~VesinNeighbors ()
void compute (const double *R, std::size_t n, const double *box, const Options &opt)
 Build / rebuild the list.
std::size_t size () const
std::size_t i (std::size_t p) const
std::size_t j (std::size_t p) const
double distance (std::size_t p) const
 Distance |r_ij| (requires return_distances).
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
const VesinNeighborList & raw () const
 Raw list for advanced consumers (Metatomic tensor conversion).
VesinNeighborList & raw ()
VesinNeighborList * release ()
 Steal ownership of the internal list (for Metatomic custom deleters).

Private Member Functions

void free_list ()

Private Attributes

VesinNeighborList list_ {}
bool owns_ {false}

Detailed Description

RAII wrapper around vesin_neighbors for Matter-style boxes (double[9] row-major 3×3 cell, same layout as Matter::cell).

Pair vector convention matches vesin: r_ij = r_j - r_i + S @ H. Classical pair pots that used r_i - r_j must flip the sign.

Definition at line 27 of file VesinNeighbors.h.

Constructor & Destructor Documentation

◆ VesinNeighbors() [1/3]

eonc::VesinNeighbors::VesinNeighbors ( )
default

◆ VesinNeighbors() [2/3]

eonc::VesinNeighbors::VesinNeighbors ( const VesinNeighbors & )
delete

◆ VesinNeighbors() [3/3]

eonc::VesinNeighbors::VesinNeighbors ( VesinNeighbors && other)
noexcept

Definition at line 14 of file VesinNeighbors.cpp.

15 : list_(other.list_),
16 owns_(other.owns_) {
17 other.list_ = VesinNeighborList{};
18 other.owns_ = false;
19}
VesinNeighborList list_

◆ ~VesinNeighbors()

eonc::VesinNeighbors::~VesinNeighbors ( )

Definition at line 32 of file VesinNeighbors.cpp.

Member Function Documentation

◆ compute()

void eonc::VesinNeighbors::compute ( const double * R,
std::size_t n,
const double * box,
const Options & opt )

Build / rebuild the list.

R is length 3*n (x,y,z interleaved); box is length 9 (row-major cell vectors).

Keep the same VesinNeighbors instance across force evaluations so vesin can re-use pair/distance/vector allocations (see vesin_neighbors docs). Freeing before every compute is incorrect and expensive.

Definition at line 42 of file VesinNeighbors.cpp.

43 {
44 if (R == nullptr || (n > 0 && box == nullptr)) {
45 throw std::invalid_argument("VesinNeighbors::compute: null R or box");
46 }
47 if (opt.cutoff <= 0.0) {
48 free_list();
49 return;
50 }
51
52 // Pass the existing VesinNeighborList through so vesin can re-use pair /
53 // distance / vector buffers (upstream contract). Do not vesin_free first —
54 // that forces a full realloc every call and is the #386 ASV regression.
55 VesinOptions vopt{};
56 vopt.cutoff = opt.cutoff;
57 vopt.full = opt.full;
58 vopt.sorted = opt.sorted;
59 vopt.algorithm = opt.algorithm;
60 vopt.skin = opt.skin;
61 vopt.n_threads = opt.n_threads;
62 vopt.return_shifts = opt.return_shifts;
63 vopt.return_distances = opt.return_distances;
64 vopt.return_vectors = opt.return_vectors;
65
66 bool periodic[3] = {opt.periodic[0], opt.periodic[1], opt.periodic[2]};
67 double box33[3][3];
68 for (int a = 0; a < 3; ++a) {
69 for (int b = 0; b < 3; ++b) {
70 box33[a][b] = box[3 * a + b];
71 }
72 }
73
74 VesinDevice cpu{VesinCPU, 0};
75 const char *error_message = nullptr;
76 int status =
77 vesin_neighbors(reinterpret_cast<const double (*)[3]>(R), n, box33,
78 periodic, cpu, vopt, &list_, &error_message);
79 if (status != EXIT_SUCCESS) {
80 std::string err = "vesin_neighbors failed";
81 if (error_message != nullptr) {
82 err += ": ";
83 err += error_message;
84 }
85 free_list();
86 throw std::runtime_error(err);
87 }
88 owns_ = true;
89}

◆ distance()

double eonc::VesinNeighbors::distance ( std::size_t p) const
inlinenodiscard

Distance |r_ij| (requires return_distances).

Definition at line 71 of file VesinNeighbors.h.

71 {
72 return list_.distances[p];
73 }

◆ free_list()

void eonc::VesinNeighbors::free_list ( )
private

Definition at line 34 of file VesinNeighbors.cpp.

34 {
35 if (owns_) {
36 vesin_free(&list_);
37 owns_ = false;
38 }
39 list_ = VesinNeighborList{};
40}

◆ i()

std::size_t eonc::VesinNeighbors::i ( std::size_t p) const
inlinenodiscard

Definition at line 67 of file VesinNeighbors.h.

67{ return list_.pairs[p][0]; }

◆ j()

std::size_t eonc::VesinNeighbors::j ( std::size_t p) const
inlinenodiscard

Definition at line 68 of file VesinNeighbors.h.

68{ return list_.pairs[p][1]; }

◆ operator=() [1/2]

VesinNeighbors & eonc::VesinNeighbors::operator= ( const VesinNeighbors & )
delete

◆ operator=() [2/2]

VesinNeighbors & eonc::VesinNeighbors::operator= ( VesinNeighbors && other)
noexcept

Definition at line 21 of file VesinNeighbors.cpp.

21 {
22 if (this != &other) {
23 free_list();
24 list_ = other.list_;
25 owns_ = other.owns_;
26 other.list_ = VesinNeighborList{};
27 other.owns_ = false;
28 }
29 return *this;
30}

◆ raw() [1/2]

VesinNeighborList & eonc::VesinNeighbors::raw ( )
inlinenodiscard

Definition at line 86 of file VesinNeighbors.h.

86{ return list_; }

◆ raw() [2/2]

const VesinNeighborList & eonc::VesinNeighbors::raw ( ) const
inlinenodiscard

Raw list for advanced consumers (Metatomic tensor conversion).

Definition at line 85 of file VesinNeighbors.h.

85{ return list_; }

◆ release()

VesinNeighborList * eonc::VesinNeighbors::release ( )

Steal ownership of the internal list (for Metatomic custom deleters).

After release, this object is empty until the next compute.

Definition at line 91 of file VesinNeighbors.cpp.

91 {
92 if (!owns_) {
93 return nullptr;
94 }
95 auto *heap = new VesinNeighborList(list_);
96 list_ = VesinNeighborList{};
97 owns_ = false;
98 return heap;
99}

◆ shift()

const int32_t * eonc::VesinNeighbors::shift ( std::size_t p) const
inlinenodiscard

Definition at line 80 of file VesinNeighbors.h.

80 {
81 return list_.shifts[p];
82 }

◆ size()

std::size_t eonc::VesinNeighbors::size ( ) const
inlinenodiscard

Definition at line 65 of file VesinNeighbors.h.

65{ return list_.length; }

◆ vector()

const double * eonc::VesinNeighbors::vector ( std::size_t p) const
inlinenodiscard

Vector r_j − r_i (+ PBC). Requires return_vectors.

Definition at line 76 of file VesinNeighbors.h.

76 {
77 return list_.vectors[p];
78 }

Member Data Documentation

◆ list_

VesinNeighborList eonc::VesinNeighbors::list_ {}
private

Definition at line 93 of file VesinNeighbors.h.

93{};

◆ owns_

bool eonc::VesinNeighbors::owns_ {false}
private

Definition at line 94 of file VesinNeighbors.h.

94{false};

The documentation for this class was generated from the following files: