Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 : Copyright (c) 2011-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 : #ifndef __PLUMED_core_Colvar_h 23 : #define __PLUMED_core_Colvar_h 24 : 25 : #include "ActionAtomistic.h" 26 : #include "ActionWithValue.h" 27 : #include <vector> 28 : 29 : #define PLUMED_COLVAR_INIT(ao) Action(ao),Colvar(ao) 30 : 31 : namespace PLMD { 32 : 33 : /** 34 : \ingroup INHERIT 35 : This is the abstract base class to use for implementing new collective variables, within it there is 36 : \ref AddingAColvar "information" as to how to go about implementing a new CV. 37 : */ 38 : 39 : class Colvar : 40 : public ActionAtomistic, 41 : public ActionWithValue { 42 : private: 43 : protected: 44 : void requestAtoms(const std::vector<AtomNumber> & a); 45 : // Set the derivatives for a particular atom equal to the input Vector 46 : // This routine is called setAtomsDerivatives because not because you 47 : // are setting the derivative of many atoms but because you are setting 48 : // the derivatives of a particular atom. The s is an apostrophe s 49 : // but you can't put apostrophes in function names 50 : void setAtomsDerivatives(int,const Vector&); 51 : void setAtomsDerivatives(Value*,int,const Vector&); 52 : void setBoxDerivatives(const Tensor&); 53 : void setBoxDerivatives(Value*,const Tensor&); 54 : const Tensor & getBoxDerivatives()const; 55 : const double & getForce()const; 56 : void apply() override; 57 : /// Set box derivatives automatically. 58 : /// It should be called after the setAtomsDerivatives has been used for all 59 : /// single atoms. 60 : /// \warning It only works for collective variable NOT using PBCs! 61 : void setBoxDerivativesNoPbc(); 62 : void setBoxDerivativesNoPbc(Value*); 63 : public: 64 : explicit Colvar(const ActionOptions&); 65 2148 : ~Colvar() {} 66 : static void registerKeywords( Keywords& keys ); 67 : unsigned getNumberOfDerivatives() override; 68 : static void setBoxDerivativesNoPbc( const std::vector<Vector>& pos, std::vector<std::vector<Vector> >& derivs, std::vector<Tensor>& virial ); 69 : }; 70 : 71 : inline 72 18577763 : void Colvar::setAtomsDerivatives(Value*v,int i,const Vector&d) { 73 18577763 : v->addDerivative(3*i+0,d[0]); 74 18577763 : v->addDerivative(3*i+1,d[1]); 75 18577763 : v->addDerivative(3*i+2,d[2]); 76 18577763 : } 77 : 78 : 79 : inline 80 265939 : void Colvar::setBoxDerivatives(Value* v,const Tensor&d) { 81 : unsigned nat=getNumberOfAtoms(); 82 265939 : v->addDerivative(3*nat+0,d(0,0)); 83 265939 : v->addDerivative(3*nat+1,d(0,1)); 84 265939 : v->addDerivative(3*nat+2,d(0,2)); 85 265939 : v->addDerivative(3*nat+3,d(1,0)); 86 265939 : v->addDerivative(3*nat+4,d(1,1)); 87 265939 : v->addDerivative(3*nat+5,d(1,2)); 88 265939 : v->addDerivative(3*nat+6,d(2,0)); 89 265939 : v->addDerivative(3*nat+7,d(2,1)); 90 265939 : v->addDerivative(3*nat+8,d(2,2)); 91 265939 : } 92 : 93 : inline 94 : void Colvar::setAtomsDerivatives(int i,const Vector&d) { 95 16765345 : setAtomsDerivatives(getPntrToValue(),i,d); 96 : } 97 : 98 : inline 99 : void Colvar::setBoxDerivatives(const Tensor&d) { 100 126551 : setBoxDerivatives(getPntrToValue(),d); 101 4014 : } 102 : 103 : inline 104 : void Colvar::setBoxDerivativesNoPbc() { 105 42246 : setBoxDerivativesNoPbc(getPntrToValue()); 106 222 : } 107 : 108 : inline 109 152632 : unsigned Colvar::getNumberOfDerivatives() { 110 152632 : return 3*getNumberOfAtoms() + 9; 111 : } 112 : 113 : 114 : } 115 : 116 : #endif