LCOV - code coverage report
Current view: top level - crystallization - Q3.cpp (source / functions) Hit Total Coverage
Test: plumed test coverage Lines: 6 21 28.6 %
Date: 2020-11-18 11:20:57 Functions: 7 13 53.8 %

          Line data    Source code
       1             : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       2             :    Copyright (c) 2014-2019 The plumed team
       3             :    (see the PEOPLE file at the root of the distribution for a list of names)
       4             : 
       5             :    See http://www.plumed.org for more information.
       6             : 
       7             :    This file is part of plumed, version 2.
       8             : 
       9             :    plumed is free software: you can redistribute it and/or modify
      10             :    it under the terms of the GNU Lesser General Public License as published by
      11             :    the Free Software Foundation, either version 3 of the License, or
      12             :    (at your option) any later version.
      13             : 
      14             :    plumed is distributed in the hope that it will be useful,
      15             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      16             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      17             :    GNU Lesser General Public License for more details.
      18             : 
      19             :    You should have received a copy of the GNU Lesser General Public License
      20             :    along with plumed.  If not, see <http://www.gnu.org/licenses/>.
      21             : +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */
      22             : #include "Steinhardt.h"
      23             : #include "LocalSteinhardt.h"
      24             : #include "core/ActionRegister.h"
      25             : 
      26             : //+PLUMEDOC MCOLVAR Q3
      27             : /*
      28             : Calculate 3rd order Steinhardt parameters.
      29             : 
      30             : The 3rd order Steinhardt parameters allow us to measure the degree to which the first coordination shell
      31             : around an atom is ordered.  The Steinhardt parameter for atom, \f$i\f$ is complex vector whose components are
      32             : calculated using the following formula:
      33             : 
      34             : \f[
      35             : q_{3m}(i) = \frac{\sum_j \sigma( r_{ij} ) Y_{3m}(\mathbf{r}_{ij}) }{\sum_j \sigma( r_{ij} ) }
      36             : \f]
      37             : 
      38             : where \f$Y_{3m}\f$ is one of the 3rd order spherical harmonics so \f$m\f$ is a number that runs from \f$-3\f$ to
      39             : \f$+3\f$.  The function \f$\sigma( r_{ij} )\f$ is a \ref switchingfunction that acts on the distance between
      40             : atoms \f$i\f$ and \f$j\f$.  The parameters of this function should be set so that it the function is equal to one
      41             : when atom \f$j\f$ is in the first coordination sphere of atom \f$i\f$ and is zero otherwise.
      42             : 
      43             : The Steinhardt parameters can be used to measure the degree of order in the system in a variety of different ways.  The
      44             : simplest way of measuring whether or not the coordination sphere is ordered is to simply take the norm of the above vector i.e.
      45             : 
      46             : \f[
      47             : Q_3(i) = \sqrt{ \sum_{m=-3}^3 q_{3m}(i)^{*} q_{3m}(i) }
      48             : \f]
      49             : 
      50             : This norm is small when the coordination shell is disordered and larger when the coordination shell is ordered. Furthermore, when
      51             : the keywords LESS_THAN, MIN, MAX, HISTOGRAM, MEAN and so on are used with this colvar it is the distribution of these normed quantities
      52             : that is investigated.
      53             : 
      54             : Other measures of order can be taken by averaging the components of the individual \f$q_3\f$ vectors individually or by taking dot products of
      55             : the \f$q_{3}\f$ vectors on adjacent atoms.  More information on these variables can be found in the documentation for \ref LOCAL_Q3,
      56             : \ref LOCAL_AVERAGE and \ref NLINKS.
      57             : 
      58             : \par Examples
      59             : 
      60             : The following command calculates the average Q3 parameter for the 64 atoms in a box of Lennard Jones and prints this
      61             : quantity to a file called colvar:
      62             : 
      63             : \plumedfile
      64             : Q3 SPECIES=1-64 D_0=1.3 R_0=0.2 MEAN LABEL=q3
      65             : PRINT ARG=q3.mean FILE=colvar
      66             : \endplumedfile
      67             : 
      68             : The following command calculates the histogram of Q3 parameters for the 64 atoms in a box of Lennard Jones and prints these
      69             : quantities to a file called colvar:
      70             : 
      71             : \plumedfile
      72             : Q3 SPECIES=1-64 D_0=1.3 R_0=0.2 HISTOGRAM={GAUSSIAN LOWER=0.0 UPPER=1.0 NBINS=20 SMEAR=0.1} LABEL=q3
      73             : PRINT ARG=q3.* FILE=colvar
      74             : \endplumedfile
      75             : 
      76             : The following command could be used to measure the Q3 paramters that describe the arrangement of chlorine ions around the
      77             : sodium atoms in NaCl.  The imagined system here is composed of 64 NaCl formula units and the atoms are arranged in the input
      78             : with the 64 Na\f$^+\f$ ions followed by the 64 Cl\f$-\f$ ions.  Once again the average Q3 paramter is calculated and output to a
      79             : file called colvar
      80             : 
      81             : \plumedfile
      82             : Q3 SPECIESA=1-64 SPECIESB=65-128 D_0=1.3 R_0=0.2 MEAN LABEL=q3
      83             : PRINT ARG=q3.mean FILE=colvar
      84             : \endplumedfile
      85             : 
      86             : */
      87             : //+ENDPLUMEDOC
      88             : 
      89             : //+PLUMEDOC MCOLVARF LOCAL_Q3
      90             : /*
      91             : Calculate the local degree of order around an atoms by taking the average dot product between the \f$q_3\f$ vector on the central atom and the \f$q_3\f$ vector
      92             : on the atoms in the first coordination sphere.
      93             : 
      94             : The \ref Q3 command allows one to calculate one complex vectors for each of the atoms in your system that describe the degree of order in the coordination sphere
      95             : around a particular atom. The difficulty with these vectors comes when combining the order parameters from all of the individual atoms/molecules so as to get a
      96             : measure of the global degree of order for the system. The simplest way of doing this - calculating the average Steinhardt parameter - can be problematic. If one is
      97             : examining nucleation say only the order parameters for those atoms in the nucleus will change significantly when the nucleus forms. The order parameters for the
      98             : atoms in the surrounding liquid will remain pretty much the same. As such if one models a small nucleus embedded in a very large amount of solution/melt any
      99             : change in the average order parameter will be negligible. Substantial changes in the value of this average can be observed in simulations of nucleation but only
     100             : because the number of atoms is relatively small.
     101             : 
     102             : When the average \ref Q3 parameter is used to bias the dynamics a problems
     103             : can occur. These averaged coordinates cannot distinguish between the correct,
     104             : single-nucleus pathway and a concerted pathway in which all the atoms rearrange
     105             : themselves into their solid-like configuration simultaneously. This second type
     106             : of pathway would be impossible in reality because there is a large entropic
     107             : barrier that prevents concerted processes like this from happening.  However,
     108             : in the finite sized systems that are commonly simulated this barrier is reduced
     109             : substantially. As a result in simulations where average Steinhardt parameters
     110             : are biased there are often quite dramatic system size effects
     111             : 
     112             : If one wants to simulate nucleation using some form on
     113             : biased dynamics what is really required is an order parameter that measures:
     114             : 
     115             : - Whether or not the coordination spheres around atoms are ordered
     116             : - Whether or not the atoms that are ordered are clustered together in a crystalline nucleus
     117             : 
     118             : \ref LOCAL_AVERAGE and \ref NLINKS are variables that can be combined with the Steinhardt parameteters allow to calculate variables that satisfy these requirements.
     119             : LOCAL_Q3 is another variable that can be used in these sorts of calculations. The LOCAL_Q3 parameter for a particular atom is a number that measures the extent to
     120             : which the orientation of the atoms in the first coordination sphere of an atom match the orientation of the central atom.  It does this by calculating the following
     121             : quantity for each of the atoms in the system:
     122             : 
     123             : \f[
     124             :  s_i = \frac{ \sum_j \sigma( r_{ij} ) \sum_{m=-3}^3 q_{3m}^{*}(i)q_{3m}(j) }{ \sum_j \sigma( r_{ij} ) }
     125             : \f]
     126             : 
     127             : where \f$q_{3m}(i)\f$ and \f$q_{3m}(j)\f$ are the 3rd order Steinhardt vectors calculated for atom \f$i\f$ and atom \f$j\f$ respectively and the asterix denotes complex
     128             : conjugation.  The function
     129             : \f$\sigma( r_{ij} )\f$ is a \ref switchingfunction that acts on the distance between atoms \f$i\f$ and \f$j\f$.  The parameters of this function should be set
     130             : so that it the function is equal to one when atom \f$j\f$ is in the first coordination sphere of atom \f$i\f$ and is zero otherwise.  The sum in the numerator
     131             : of this expression is the dot product of the Steinhardt parameters for atoms \f$i\f$ and \f$j\f$ and thus measures the degree to which the orientations of these
     132             : adjacent atoms is correlated.
     133             : 
     134             : \par Examples
     135             : 
     136             : The following command calculates the average value of the LOCAL_Q3 parameter for the 64 Lennard Jones atoms in the system under study and prints this
     137             : quantity to a file called colvar.
     138             : 
     139             : \plumedfile
     140             : Q3 SPECIES=1-64 D_0=1.3 R_0=0.2 LABEL=q3
     141             : LOCAL_Q3 SPECIES=q3 SWITCH={RATIONAL D_0=1.3 R_0=0.2} MEAN LABEL=lq3
     142             : PRINT ARG=lq3.mean FILE=colvar
     143             : \endplumedfile
     144             : 
     145             : The following input calculates the distribution of LOCAL_Q3 parameters at any given time and outputs this information to a file.
     146             : 
     147             : \plumedfile
     148             : Q3 SPECIES=1-64 D_0=1.3 R_0=0.2 LABEL=q3
     149             : LOCAL_Q3 SPECIES=q3 SWITCH={RATIONAL D_0=1.3 R_0=0.2} HISTOGRAM={GAUSSIAN LOWER=0.0 UPPER=1.0 NBINS=20 SMEAR=0.1} LABEL=lq3
     150             : PRINT ARG=lq3.* FILE=colvar
     151             : \endplumedfile
     152             : 
     153             : The following calculates the LOCAL_Q3 parameters for atoms 1-5 only. For each of these atoms comparisons of the geometry of the coordination sphere
     154             : are done with those of all the other atoms in the system.  The final quantity is the average and is outputted to a file
     155             : 
     156             : \plumedfile
     157             : Q3 SPECIESA=1-5 SPECIESB=1-64 D_0=1.3 R_0=0.2 LABEL=q3a
     158             : Q3 SPECIESA=6-64 SPECIESB=1-64 D_0=1.3 R_0=0.2 LABEL=q3b
     159             : 
     160             : LOCAL_Q3 SPECIES=q3a,q3b SWITCH={RATIONAL D_0=1.3 R_0=0.2} MEAN LOWMEM LABEL=w3
     161             : PRINT ARG=w3.* FILE=colvar
     162             : \endplumedfile
     163             : 
     164             : */
     165             : //+ENDPLUMEDOC
     166             : 
     167             : 
     168             : namespace PLMD {
     169             : namespace crystallization {
     170             : 
     171           0 : class Q3 : public Steinhardt {
     172             : public:
     173             :   static void registerKeywords( Keywords& keys );
     174             :   explicit Q3( const ActionOptions& ao );
     175             : };
     176             : 
     177        6452 : PLUMED_REGISTER_ACTION(Q3,"Q3")
     178             : typedef LocalSteinhardt<Q3> LOCAL_Q3;
     179        6452 : PLUMED_REGISTER_ACTION(LOCAL_Q3,"LOCAL_Q3")
     180             : 
     181           1 : void Q3::registerKeywords( Keywords& keys ) {
     182           1 :   Steinhardt::registerKeywords( keys );
     183           1 : }
     184             : 
     185           0 : Q3::Q3(const ActionOptions& ao ):
     186             :   Action(ao),
     187           0 :   Steinhardt(ao)
     188             : {
     189           0 :   setAngularMomentum(3);
     190             : 
     191             : // Spherical harmonics normalization:
     192             : // even =  sqrt ( ((2l+1)*(l-m)!) / (4*pi*(l+m)!) )
     193             : // odd  = -sqrt ( ((2l+1)*(l-m)!) / (4*pi*(l+m)!) )
     194             : 
     195           0 :   normaliz.resize( 4 );
     196           0 :   normaliz[0] = sqrt( ( 7.0*6.0 ) / (4.0*pi*6.0) );
     197           0 :   normaliz[1] = -sqrt( ( 7.0*2.0 ) / (4.0*pi*24.0) );
     198           0 :   normaliz[2] = sqrt( ( 7.0*1.0) / (4.0*pi*120.0) );
     199           0 :   normaliz[3] = -sqrt( ( 7.0*1.0) / (4.0*pi*720.0) );
     200             : 
     201             : // Legendre polynomial coefficients of order three
     202             : 
     203           0 :   coeff_poly.resize( 4 );
     204           0 :   coeff_poly[0]=0.0;
     205           0 :   coeff_poly[1]=-1.5;
     206           0 :   coeff_poly[2]=0.0;
     207           0 :   coeff_poly[3]=2.5;
     208             : 
     209           0 : }
     210             : 
     211             : }
     212        4839 : }
     213             : 

Generated by: LCOV version 1.13