11#ifndef COLVARCOMP_COORDNUM_H
12#define COLVARCOMP_COORDNUM_H
17#include "colvarcomp.h"
28 virtual int init(std::string
const &conf)
override;
32#if defined (COLVARS_CUDA) || defined (COLVARS_HIP)
33 virtual int calc_value_gpu()
override;
35 virtual int calc_gradients_gpu()
override {
return COLVARS_OK;}
42 ef_use_pairlist = (1 << 9),
43 ef_rebuild_pairlist = (1 << 10)
52 template <
int flags,
int static_en = 0,
int static_ed = 0>
58 template <
int flags,
int static_en = 0,
int static_ed = 0>
70 template <
bool use_group1_com,
bool use_group2_com,
int flags>
int compute_coordnum();
73 template <
bool use_group1_com,
bool use_group2_com,
int flags>
void main_loop();
125#if defined (COLVARS_CUDA) || defined (COLVARS_HIP)
127 std::unique_ptr<coordnum_gpu_impl_t> coordnum_gpu_impl;
171 virtual int init(std::string
const &conf);
185template <
int flags,
int static_en,
int static_ed>
191 constexpr bool static_ed_is_2en = (static_en > 0) && (static_ed > 0) && (static_ed == 2 * static_en);
192 if constexpr ((static_en > 0) && (static_ed > 0)) {
194 static_assert(static_en % 2 == 0,
"static_en must be an even positive integer.");
195 static_assert(static_ed % 2 == 0,
"static_ed must be an even positive integer.");
199 if constexpr ((static_en > 0) && (static_ed > 0)) {
200 if constexpr (static_ed_is_2en) {
202 if constexpr (static_en == 2) {
205 xn_1 = cvm::positive_integer_power<static_en / 2 - 1>(l2);
210 xn = cvm::positive_integer_power<static_en / 2>(l2);
211 xd = cvm::positive_integer_power<static_ed / 2>(l2);
216 int const en2 =
en/2;
217 int const ed2 =
ed/2;
228 if constexpr (static_ed_is_2en) {
229 func_no_pairlist = 1.0 / (1.0 + xn);
231 if (std::abs(h) < eps_l2) {
234 cvm::real const c1 = (en2_r * (en2_r - ed2_r)) / (2.0 * ed2_r);
235 cvm::real const c2 = (en2_r * (en2_r - ed2_r) * (2.0 * en2_r - ed2_r - 3.0)) / (12.0 * ed2_r);
236 func_no_pairlist = c0 + h * (c1 + h * c2);
238 func_no_pairlist = (1.0 - xn) / (1.0 - xd);
243 if (flags & ef_use_pairlist) {
244 inv_one_pairlist_tol = 1 / (1.0-pairlist_tol);
245 func = (func_no_pairlist - pairlist_tol) * inv_one_pairlist_tol;
247 func = func_no_pairlist;
255 if (flags & ef_gradients) {
256 if constexpr (static_ed_is_2en) {
257 const cvm::real deriv = -func_no_pairlist * func_no_pairlist * en2_r * xn_1;
258 dFdl2 = (flags & ef_use_pairlist) ? inv_one_pairlist_tol * deriv : deriv;
262 if (std::abs(h) < eps_l2) {
263 cvm::real const g0 = 0.5 * (en2_r - ed2_r);
264 cvm::real const g1 = ((en2_r - ed2_r) * (en2_r + ed2_r - 6.0)) / 12.0;
265 log_deriv = g0 + h * g1;
267 log_deriv = (ed2_r * xd / ((1.0 - xd) * l2)) - (en2_r * xn / ((1.0 - xn) * l2));
269 dFdl2 = (flags & ef_use_pairlist) ?
270 func_no_pairlist * inv_one_pairlist_tol * log_deriv :
279template<
int flags,
int static_en,
int static_ed>
306 diff.y * inv_r0_vec.y,
307 diff.z * inv_r0_vec.z);
309 if (flags & ef_use_pairlist) {
310 if (l2 > pairlist_tol_l2_max) {
317 cvm::real F = switching_function<flags, static_en, static_ed>(l2, dFdl2, en, ed, pairlist_tol);
319 if ((flags & ef_gradients) && (F > 0.0)) {
320 cvm::rvector const dl2dx((2.0 * inv_r0sq_vec.x) * diff.x,
321 (2.0 * inv_r0sq_vec.y) * diff.y,
322 (2.0 * inv_r0sq_vec.z) * diff.z);
Definition: colvarcomp_coordnums.cpp:22
Colvar component: coordination number between two groups (colvarvalue::type_scalar type,...
Definition: colvarcomp_coordnums.h:23
void update_cutoffs(cvm::rvector const &r0_vec_i)
Set r0_vec and related fields.
Definition: colvarcomp_coordnums.cpp:402
int en
Integer exponent of the function numerator.
Definition: colvarcomp_coordnums.h:94
std::unique_ptr< bool[]> pairlist
Pair list.
Definition: colvarcomp_coordnums.h:123
cvm::rvector inv_r0_vec
Inverse of r0_vec.
Definition: colvarcomp_coordnums.h:85
bool b_enable_pairlist
If true, then pairlist is enabled.
Definition: colvarcomp_coordnums.h:108
static COLVARS_HOST_DEVICE cvm::real switching_function(cvm::real const &l2, cvm::real &dFdl2, int en, int ed, cvm::real pairlist_tol)
Definition: colvarcomp_coordnums.h:186
cvm::atom_group * group2
Second atom group.
Definition: colvarcomp_coordnums.h:79
cvm::real tolerance
Tolerance for the pair list.
Definition: colvarcomp_coordnums.h:111
virtual void calc_value() override
Calculate the variable.
Definition: colvarcomp_coordnums.cpp:663
bool b_group2_center_only
If true, group2 will be treated as a single atom.
Definition: colvarcomp_coordnums.h:105
bool b_group1_center_only
If true, group1 will be treated as a single atom.
Definition: colvarcomp_coordnums.h:102
int ed
Integer exponent of the function denominator.
Definition: colvarcomp_coordnums.h:96
int pairlist_freq
Frequency of update of the pair list.
Definition: colvarcomp_coordnums.h:120
virtual void calc_gradients() override
Calculate the atomic gradients, to be reused later in order to apply forces.
Definition: colvarcomp_coordnums.cpp:705
cvm::real tolerance_l2_max
Value of the squared scaled distance (l^2) that matches the given tolerance.
Definition: colvarcomp_coordnums.h:114
virtual int calc_gradients_after_gpu() override
CPU-side calculation after the graph in add_calc_gradients_node is done on GPU.
Definition: colvarcomp_coordnums.h:36
static COLVARS_HOST_DEVICE cvm::real compute_pair_coordnum(cvm::rvector const &inv_r0_vec, cvm::rvector const &inv_r0sq_vec, int en, int ed, const cvm::real a1x, const cvm::real a1y, const cvm::real a1z, const cvm::real a2x, const cvm::real a2y, const cvm::real a2z, cvm::real &g1x, cvm::real &g1y, cvm::real &g1z, cvm::real &g2x, cvm::real &g2y, cvm::real &g2z, cvm::real pairlist_tol, cvm::real pairlist_tol_l2_max, cvm::system_boundary_conditions const &bc)
Main kernel for the coordination number.
Definition: colvarcomp_coordnums.h:280
int compute_coordnum()
Workhorse function.
Definition: colvarcomp_coordnums.cpp:641
virtual int calc_value_after_gpu() override
CPU-side calculation after the graph in add_calc_value_node is done on GPU.
Definition: colvarcomp_coordnums.cpp:739
virtual int init(std::string const &conf) override
Definition: colvarcomp_coordnums.cpp:420
size_t num_pairs
The number of pairwise distances being calculated.
Definition: colvarcomp_coordnums.h:99
cvm::atom_group * group1
First atom group.
Definition: colvarcomp_coordnums.h:77
cvm::rvector inv_r0sq_vec
Square of inv_r0_vec.
Definition: colvarcomp_coordnums.h:88
void main_loop()
Workhorse function.
Definition: colvarcomp_coordnums.cpp:577
void compute_tolerance_l2_max()
Recompute the value of tolerance_l2_max.
Definition: colvarcomp_coordnums.cpp:551
cvm::rvector r0_vec
Cutoff distances along each dimension.
Definition: colvarcomp_coordnums.h:82
Colvar component (base class for collective variables)
Definition: colvarcomp.h:71
Colvar component: coordination number between two groups (colvarvalue::type_scalar type,...
Definition: colvarcomp_coordnums.h:152
virtual void calc_value()
Calculate the variable.
Definition: colvarcomp_coordnums.cpp:991
virtual void calc_gradients()
Calculate the atomic gradients, to be reused later in order to apply forces.
Definition: colvarcomp_coordnums.cpp:1004
Colvar component: hydrogen bond, defined as the product of a colvar::coordnum and 1/2*(1-cos((180-ang...
Definition: colvarcomp_coordnums.h:164
int ed
Integer exponent of the function denominator.
Definition: colvarcomp_coordnums.h:181
virtual void calc_value()
Calculate the variable.
Definition: colvarcomp_coordnums.cpp:824
int en
Integer exponent of the function numerator.
Definition: colvarcomp_coordnums.h:179
cvm::rvector r0_vec
Cutoff distances along each dimension.
Definition: colvarcomp_coordnums.h:177
virtual void calc_gradients()
Calculate the atomic gradients, to be reused later in order to apply forces.
Definition: colvarcomp_coordnums.cpp:865
virtual int init(std::string const &conf)
Definition: colvarcomp_coordnums.cpp:759
Colvar component: self-coordination number within a group (colvarvalue::type_scalar type,...
Definition: colvarcomp_coordnums.h:135
virtual void calc_gradients()
Calculate the atomic gradients, to be reused later in order to apply forces.
Definition: colvarcomp_coordnums.cpp:982
int compute_selfcoordnum()
Main workhorse function.
Definition: colvarcomp_coordnums.cpp:950
virtual void calc_value()
Calculate the variable.
Definition: colvarcomp_coordnums.cpp:971
void selfcoordnum_sequential_loop()
Workhorse function.
Definition: colvarcomp_coordnums.cpp:902
vector of real numbers with three components
Definition: colvartypes.h:728
Class to store the system's boundary conditions.
Definition: colvars_system.h:16
COLVARS_HOST_DEVICE cvm::rvector position_distance(cvm::atom_pos const &pos1, cvm::atom_pos const &pos2) const
Compute the distance between two positions.
Definition: colvars_system.h:161
double real
Defining an abstract real number allows to switch precision.
Definition: colvarmodule.h:98
static COLVARS_HOST_DEVICE real integer_power(real const &x, int const n)
Override the STL pow() with a product for n integer.
Definition: colvarmodule.h:104
Store the information of a group of atoms in a structure-of-arrays (SoA) style.
Definition: colvaratoms.h:52
Collective variables main module.
A simplified class of cvm::atom that can be used with cvm::atom_group::atom_modifier.
Definition: colvaratoms.h:111