This is part of the colvar module |
Calculate coordination numbers.
This keyword can be used to calculate the number of contacts between two groups of atoms and is defined as
\[ \sum_{i\in A} \sum_{i\in B} s_{ij} \]
where \(s_{ij}\) is 1 if the contact between atoms \(i\) and \(j\) is formed, zero otherwise. In actuality, \(s_{ij}\) is replaced with a switching function so as to ensure that the calculated CV has continuous derivatives. The default switching function is:
\[ s_{ij} = \frac{ 1 - \left(\frac{{\bf r}_{ij}-d_0}{r_0}\right)^n } { 1 - \left(\frac{{\bf r}_{ij}-d_0}{r_0}\right)^m } \]
but it can be changed using the optional SWITCH option.
To make your calculation faster you can use a neighbor list, which makes it that only a relevant subset of the pairwise distance are calculated at every step.
If GROUPB is empty, it will sum the \(\frac{N(N-1)}{2}\) pairs in GROUPA. This avoids computing twice permuted indexes (e.g. pair (i,j) and (j,i)) thus running at twice the speed.
Notice that if there are common atoms between GROUPA and GROUPB the switching function should be equal to one. These "self contacts" are discarded by plumed (since version 2.1), so that they actually count as "zero".
The following example instructs plumed to calculate the total coordination number of the atoms in group 1-10 with the atoms in group 20-100. For atoms 1-10 coordination numbers are calculated that count the number of atoms from the second group that are within 0.3 nm of the central atom. A neighbor list is used to make this calculation faster, this neighbor list is updated every 100 steps.
COORDINATIONGROUPA=1-10First list of atoms.GROUPB=20-100Second list of atoms (if empty, N*(N-1)/2 pairs in GROUPA are counted).R_0=0.3could not find this keywordNLIST( default=off ) Use a neighbor list to speed up the calculationNL_CUTOFF=0.5The cutoff for the neighbor listNL_STRIDE=100The frequency with which we are updating the atoms in the neighbor list
The following is a dummy example which should compute the value 0 because the self interaction of atom 1 is skipped. Notice that in plumed 2.0 "self interactions" were not skipped, and the same calculation should return 1.
c: COORDINATIONGROUPA=1First list of atoms.GROUPB=1Second list of atoms (if empty, N*(N-1)/2 pairs in GROUPA are counted).R_0=0.3 PRINTcould not find this keywordARG=cthe input for this action is the scalar output from one or more other actions.STRIDE=10compulsory keyword ( default=1 ) the frequency with which the quantities of interest should be output
Here's an example that shows what happens when providing COORDINATION with a single group:
# define some huge group: group: GROUPATOMS=1-1000 # Here's coordination of a group against itself: c1: COORDINATIONthe numerical indexes for the set of atoms in the group.GROUPA=groupFirst list of atoms.GROUPB=groupSecond list of atoms (if empty, N*(N-1)/2 pairs in GROUPA are counted).R_0=0.3 # Here's coordination within a single group: x: COORDINATIONcould not find this keywordGROUPA=groupFirst list of atoms.R_0=0.3 # This is just multiplying times 2 the variable x: c2: COMBINEcould not find this keywordARG=xthe input for this action is the scalar output from one or more other actions.COEFFICIENTS=2compulsory keyword ( default=1.0 ) the coefficients of the arguments in your functionPERIODIC=NO # the two variables c1 and c2 should be identical, but the calculation of c2 is twice faster # since it runs on half of the pairs. PRINTcompulsory keyword if the output of your function is periodic then you should specify the periodicity of the function.ARG=c1,c2the input for this action is the scalar output from one or more other actions.STRIDE=10compulsory keyword ( default=1 ) the frequency with which the quantities of interest should be output
GROUPA | First list of atoms. For more information on how to specify lists of atoms see Groups and Virtual Atoms |
GROUPB | Second list of atoms (if empty, N*(N-1)/2 pairs in GROUPA are counted). For more information on how to specify lists of atoms see Groups and Virtual Atoms |
NN | ( default=6 ) The n parameter of the switching function |
MM | ( default=0 ) The m parameter of the switching function; 0 implies 2*NN |
D_0 | ( default=0.0 ) The d_0 parameter of the switching function |
R_0 | The r_0 parameter of the switching function |
NUMERICAL_DERIVATIVES | ( default=off ) calculate the derivatives for these quantities numerically |
NOPBC | ( default=off ) ignore the periodic boundary conditions when calculating distances |
SERIAL | ( default=off ) Perform the calculation in serial - for debug purpose |
PAIR | ( default=off ) Pair only 1st element of the 1st group with 1st element in the second, etc |
NLIST | ( default=off ) Use a neighbor list to speed up the calculation |
NL_CUTOFF | The cutoff for the neighbor list |
NL_STRIDE | The frequency with which we are updating the atoms in the neighbor list |
SWITCH | This keyword is used if you want to employ an alternative to the continuous switching function defined above. The following provides information on the switchingfunction that are available. When this keyword is present you no longer need the NN, MM, D_0 and R_0 keywords. |