11#ifndef COLVARCOMP_COORDNUM_H
12#define COLVARCOMP_COORDNUM_H
17#include "colvarcomp.h"
28 virtual int init(std::string
const &conf);
35 ef_use_internal_pbc = (1 << 8),
36 ef_use_pairlist = (1 << 9),
37 ef_rebuild_pairlist = (1 << 10)
62 template <
bool use_group1_com,
bool use_group2_com,
int flags>
int compute_coordnum();
65 template <
bool use_group1_com,
bool use_group2_com,
int flags>
void main_loop();
158 virtual int init(std::string
const &conf);
178 int const en2 =
en/2;
179 int const ed2 =
ed/2;
189 if (std::abs(h) < eps_l2) {
192 cvm::real const c1 = (en2_r * (en2_r - ed2_r)) / (2.0 * ed2_r);
193 cvm::real const c2 = (en2_r * (en2_r - ed2_r) * (2.0 * en2_r - ed2_r - 3.0)) / (12.0 * ed2_r);
194 func_no_pairlist = c0 + h * (c1 + h * c2);
196 func_no_pairlist = (1.0 - xn) / (1.0 - xd);
200 if (flags & ef_use_pairlist) {
201 inv_one_pairlist_tol = 1 / (1.0-pairlist_tol);
202 func = (func_no_pairlist - pairlist_tol) * inv_one_pairlist_tol;
204 func = func_no_pairlist;
212 if (flags & ef_gradients) {
215 if (std::abs(h) < eps_l2) {
216 cvm::real const g0 = 0.5 * (en2_r - ed2_r);
217 cvm::real const g1 = ((en2_r - ed2_r) * (en2_r + ed2_r - 6.0)) / 12.0;
218 log_deriv = g0 + h * g1;
220 log_deriv = (ed2_r * xd / ((1.0 - xd) * l2)) - (en2_r * xn / ((1.0 - xn) * l2));
222 dFdl2 = (flags & ef_use_pairlist) ?
223 func_no_pairlist * inv_one_pairlist_tol * log_deriv :
259 diff.y * inv_r0_vec.y,
260 diff.z * inv_r0_vec.z);
262 if (flags & ef_use_pairlist) {
263 if (l2 > pairlist_tol_l2_max) {
270 cvm::real F = switching_function<flags>(l2, dFdl2, en, ed, pairlist_tol);
272 if ((flags & ef_gradients) && (F > 0.0)) {
273 cvm::rvector const dl2dx((2.0 * inv_r0sq_vec.x) * diff.x,
274 (2.0 * inv_r0sq_vec.y) * diff.y,
275 (2.0 * inv_r0sq_vec.z) * diff.z);
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:29
int en
Integer exponent of the function numerator.
Definition: colvarcomp_coordnums.h:86
std::unique_ptr< bool[]> pairlist
Pair list.
Definition: colvarcomp_coordnums.h:115
bool b_use_internal_pbc
Use the PBC functions from the Colvars library (as opposed to MD engine)
Definition: colvarcomp_coordnums.h:100
virtual void calc_value()
Calculate the variable.
Definition: colvarcomp_coordnums.cpp:288
cvm::rvector inv_r0_vec
Inverse of r0_vec.
Definition: colvarcomp_coordnums.h:77
cvm::atom_group * group2
Second atom group.
Definition: colvarcomp_coordnums.h:71
cvm::real tolerance
Tolerance for the pair list.
Definition: colvarcomp_coordnums.h:103
static cvm::real switching_function(cvm::real const &l2, cvm::real &dFdl2, int en, int ed, cvm::real pairlist_tol)
Definition: colvarcomp_coordnums.h:173
bool b_group2_center_only
If true, group2 will be treated as a single atom.
Definition: colvarcomp_coordnums.h:97
bool b_group1_center_only
If true, group1 will be treated as a single atom.
Definition: colvarcomp_coordnums.h:94
int ed
Integer exponent of the function denominator.
Definition: colvarcomp_coordnums.h:88
virtual void calc_gradients()
Calculate the atomic gradients, to be reused later in order to apply forces.
Definition: colvarcomp_coordnums.cpp:330
static 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, colvarmodule *cvmodule)
Main kernel for the coordination number.
Definition: colvarcomp_coordnums.h:232
int pairlist_freq
Frequency of update of the pair list.
Definition: colvarcomp_coordnums.h:112
cvm::real tolerance_l2_max
Value of the squared scaled distance (l^2) that matches the given tolerance.
Definition: colvarcomp_coordnums.h:106
int compute_coordnum()
Workhorse function.
Definition: colvarcomp_coordnums.cpp:266
virtual int init(std::string const &conf)
Definition: colvarcomp_coordnums.cpp:47
size_t num_pairs
The number of pairwise distances being calculated.
Definition: colvarcomp_coordnums.h:91
cvm::atom_group * group1
First atom group.
Definition: colvarcomp_coordnums.h:69
cvm::rvector inv_r0sq_vec
Square of inv_r0_vec.
Definition: colvarcomp_coordnums.h:80
void main_loop()
Workhorse function.
Definition: colvarcomp_coordnums.cpp:195
void compute_tolerance_l2_max()
Recompute the value of tolerance_l2_max.
Definition: colvarcomp_coordnums.cpp:169
cvm::rvector r0_vec
Cutoff distances along each dimension.
Definition: colvarcomp_coordnums.h:74
Colvar component (base class for collective variables)
Definition: colvarcomp.h:72
Colvar component: coordination number between two groups (colvarvalue::type_scalar type,...
Definition: colvarcomp_coordnums.h:139
virtual void calc_value()
Calculate the variable.
Definition: colvarcomp_coordnums.cpp:588
virtual void calc_gradients()
Calculate the atomic gradients, to be reused later in order to apply forces.
Definition: colvarcomp_coordnums.cpp:601
Colvar component: hydrogen bond, defined as the product of a colvar::coordnum and 1/2*(1-cos((180-ang...
Definition: colvarcomp_coordnums.h:151
int ed
Integer exponent of the function denominator.
Definition: colvarcomp_coordnums.h:168
virtual void calc_value()
Calculate the variable.
Definition: colvarcomp_coordnums.cpp:414
int en
Integer exponent of the function numerator.
Definition: colvarcomp_coordnums.h:166
cvm::rvector r0_vec
Cutoff distances along each dimension.
Definition: colvarcomp_coordnums.h:164
virtual void calc_gradients()
Calculate the atomic gradients, to be reused later in order to apply forces.
Definition: colvarcomp_coordnums.cpp:455
virtual int init(std::string const &conf)
Definition: colvarcomp_coordnums.cpp:349
Colvar component: self-coordination number within a group (colvarvalue::type_scalar type,...
Definition: colvarcomp_coordnums.h:122
virtual void calc_gradients()
Calculate the atomic gradients, to be reused later in order to apply forces.
Definition: colvarcomp_coordnums.cpp:579
int compute_selfcoordnum()
Main workhorse function.
Definition: colvarcomp_coordnums.cpp:547
virtual void calc_value()
Calculate the variable.
Definition: colvarcomp_coordnums.cpp:568
void selfcoordnum_sequential_loop()
Workhorse function.
Definition: colvarcomp_coordnums.cpp:492
vector of real numbers with three components
Definition: colvartypes.h:728
Collective variables module (main class)
Definition: colvarmodule.h:72
double real
Defining an abstract real number allows to switch precision.
Definition: colvarmodule.h:99
static real integer_power(real const &x, int const n)
Override the STL pow() with a product for n integer.
Definition: colvarmodule.h:105
colvarproxy * proxy
Pointer to the proxy object, used to retrieve atomic data from the hosting program.
Definition: colvarmodule.h:957
cvm::rvector position_distance_internal(cvm::atom_pos const &pos1, cvm::atom_pos const &pos2) const
Inline version of position_distance()
Definition: colvarproxy_system.h:240
virtual cvm::rvector position_distance(cvm::atom_pos const &pos1, cvm::atom_pos const &pos2) const
Get the PBC-aware distance vector between two positions (using the MD engine's convention)
Definition: colvarproxy_system.cpp:130
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:107