LCOV - code coverage report
Current view: top level - crystallization - Q3.cpp (source / functions) Hit Total Coverage
Test: plumed test coverage Lines: 5 19 26.3 %
Date: 2024-10-11 08:09:47 Functions: 5 9 55.6 %

          Line data    Source code
       1             : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       2             :    Copyright (c) 2014-2023 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 parameters that describe the arrangement of chlorine ions around the
      77             : sodium atoms in sodium chloride.  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 parameter 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             : If you simply want to examine the values of the Q3 parameters for each of the atoms in your system you can do so by exploiting the
      87             : command \ref DUMPMULTICOLVAR as shown in the example below.  The following output file will output a file in an extended xyz format
      88             : called q3.xyz for each frame of the analyzed MD trajectory.  The first column in this file will contain a dummy name for each of the
      89             : atoms, columns 2-4 will then contain the x, y and z positions of the atoms, column 5 will contain the value of the Q3 parameter, columns
      90             : 6-12 will contain the real parts of the director of the \f$q_{3m}\f$ vector while columns 12-19 will contain the imaginary parts of this director.
      91             : 
      92             : \plumedfile
      93             : q3: Q3 SPECIESA=1-64 SPECIESB=65-128 D_0=1.3 R_0=0.2 MEAN
      94             : DUMPMULTICOLVAR DATA=q3 FILE=q3.xyz
      95             : \endplumedfile
      96             : 
      97             : */
      98             : //+ENDPLUMEDOC
      99             : 
     100             : //+PLUMEDOC MCOLVARF LOCAL_Q3
     101             : /*
     102             : 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 on the atoms in the first coordination sphere.
     103             : 
     104             : 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
     105             : 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
     106             : 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
     107             : 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
     108             : 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
     109             : 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
     110             : because the number of atoms is relatively small.
     111             : 
     112             : When the average \ref Q3 parameter is used to bias the dynamics a problems
     113             : can occur. These averaged coordinates cannot distinguish between the correct,
     114             : single-nucleus pathway and a concerted pathway in which all the atoms rearrange
     115             : themselves into their solid-like configuration simultaneously. This second type
     116             : of pathway would be impossible in reality because there is a large entropic
     117             : barrier that prevents concerted processes like this from happening.  However,
     118             : in the finite sized systems that are commonly simulated this barrier is reduced
     119             : substantially. As a result in simulations where average Steinhardt parameters
     120             : are biased there are often quite dramatic system size effects
     121             : 
     122             : If one wants to simulate nucleation using some form on
     123             : biased dynamics what is really required is an order parameter that measures:
     124             : 
     125             : - Whether or not the coordination spheres around atoms are ordered
     126             : - Whether or not the atoms that are ordered are clustered together in a crystalline nucleus
     127             : 
     128             : \ref LOCAL_AVERAGE and \ref NLINKS are variables that can be combined with the Steinhardt parameters allow to calculate variables that satisfy these requirements.
     129             : 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
     130             : 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
     131             : quantity for each of the atoms in the system:
     132             : 
     133             : \f[
     134             :  s_i = \frac{ \sum_j \sigma( r_{ij} ) \sum_{m=-3}^3 q_{3m}^{*}(i)q_{3m}(j) }{ \sum_j \sigma( r_{ij} ) }
     135             : \f]
     136             : 
     137             : 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 asterisk denotes complex
     138             : conjugation.  The function
     139             : \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
     140             : 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
     141             : 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
     142             : adjacent atoms is correlated.
     143             : 
     144             : \par Examples
     145             : 
     146             : 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
     147             : quantity to a file called colvar.
     148             : 
     149             : \plumedfile
     150             : Q3 SPECIES=1-64 D_0=1.3 R_0=0.2 LABEL=q3
     151             : LOCAL_Q3 SPECIES=q3 SWITCH={RATIONAL D_0=1.3 R_0=0.2} MEAN LABEL=lq3
     152             : PRINT ARG=lq3.mean FILE=colvar
     153             : \endplumedfile
     154             : 
     155             : The following input calculates the distribution of LOCAL_Q3 parameters at any given time and outputs this information to a file.
     156             : 
     157             : \plumedfile
     158             : Q3 SPECIES=1-64 D_0=1.3 R_0=0.2 LABEL=q3
     159             : 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
     160             : PRINT ARG=lq3.* FILE=colvar
     161             : \endplumedfile
     162             : 
     163             : 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
     164             : are done with those of all the other atoms in the system.  The final quantity is the average and is outputted to a file
     165             : 
     166             : \plumedfile
     167             : Q3 SPECIESA=1-5 SPECIESB=1-64 D_0=1.3 R_0=0.2 LABEL=q3a
     168             : Q3 SPECIESA=6-64 SPECIESB=1-64 D_0=1.3 R_0=0.2 LABEL=q3b
     169             : 
     170             : LOCAL_Q3 SPECIES=q3a,q3b SWITCH={RATIONAL D_0=1.3 R_0=0.2} MEAN LOWMEM LABEL=w3
     171             : PRINT ARG=w3.* FILE=colvar
     172             : \endplumedfile
     173             : 
     174             : */
     175             : //+ENDPLUMEDOC
     176             : 
     177             : 
     178             : namespace PLMD {
     179             : namespace crystallization {
     180             : 
     181             : class Q3 : public Steinhardt {
     182             : public:
     183             :   static void registerKeywords( Keywords& keys );
     184             :   explicit Q3( const ActionOptions& ao );
     185             : };
     186             : 
     187             : // For some reason, this is not seen correctly by cppcheck
     188             : // cppcheck-suppress unknownMacro
     189       10419 : PLUMED_REGISTER_ACTION(Q3,"Q3")
     190             : typedef LocalSteinhardt<Q3> LOCAL_Q3;
     191       10419 : PLUMED_REGISTER_ACTION(LOCAL_Q3,"LOCAL_Q3")
     192             : 
     193           1 : void Q3::registerKeywords( Keywords& keys ) {
     194           1 :   Steinhardt::registerKeywords( keys );
     195           1 : }
     196             : 
     197           0 : Q3::Q3(const ActionOptions& ao ):
     198             :   Action(ao),
     199           0 :   Steinhardt(ao)
     200             : {
     201           0 :   setAngularMomentum(3);
     202             : 
     203             : // Spherical harmonics normalization:
     204             : // even =  sqrt ( ((2l+1)*(l-m)!) / (4*pi*(l+m)!) )
     205             : // odd  = -sqrt ( ((2l+1)*(l-m)!) / (4*pi*(l+m)!) )
     206             : 
     207           0 :   normaliz.resize( 4 );
     208           0 :   normaliz[0] = sqrt( ( 7.0*6.0 ) / (4.0*pi*6.0) );
     209           0 :   normaliz[1] = -sqrt( ( 7.0*2.0 ) / (4.0*pi*24.0) );
     210           0 :   normaliz[2] = sqrt( ( 7.0*1.0) / (4.0*pi*120.0) );
     211           0 :   normaliz[3] = -sqrt( ( 7.0*1.0) / (4.0*pi*720.0) );
     212             : 
     213             : // Legendre polynomial coefficients of order three
     214             : 
     215           0 :   coeff_poly.resize( 4 );
     216           0 :   coeff_poly[0]=0.0;
     217           0 :   coeff_poly[1]=-1.5;
     218           0 :   coeff_poly[2]=0.0;
     219           0 :   coeff_poly[3]=2.5;
     220             : 
     221           0 : }
     222             : 
     223             : }
     224             : }
     225             : 

Generated by: LCOV version 1.15