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 : { 43 : private: 44 : protected: 45 : bool isEnergy; 46 : bool isExtraCV; 47 : void requestAtoms(const std::vector<AtomNumber> & a); 48 : // Set the derivatives for a particular atom equal to the input Vector 49 : // This routine is called setAtomsDerivatives because not because you 50 : // are setting the derivative of many atoms but because you are setting 51 : // the derivatives of a particular atom. The s is an apostrophe s 52 : // but you can't put apostrophes in function names 53 : void setAtomsDerivatives(int,const Vector&); 54 : void setAtomsDerivatives(Value*,int,const Vector&); 55 : void setBoxDerivatives(const Tensor&); 56 : void setBoxDerivatives(Value*,const Tensor&); 57 : const Tensor & getBoxDerivatives()const; 58 : const double & getForce()const; 59 : void apply() override; 60 : /// Set box derivatives automatically. 61 : /// It should be called after the setAtomsDerivatives has been used for all 62 : /// single atoms. 63 : /// \warning It only works for collective variable NOT using PBCs! 64 : void setBoxDerivativesNoPbc(); 65 : void setBoxDerivativesNoPbc(Value*); 66 : public: 67 115866 : bool checkIsEnergy() {return isEnergy;} 68 : explicit Colvar(const ActionOptions&); 69 1870 : ~Colvar() {} 70 : static void registerKeywords( Keywords& keys ); 71 : unsigned getNumberOfDerivatives() override; 72 : }; 73 : 74 : inline 75 17928231 : void Colvar::setAtomsDerivatives(Value*v,int i,const Vector&d) { 76 17928231 : v->addDerivative(3*i+0,d[0]); 77 17928231 : v->addDerivative(3*i+1,d[1]); 78 17928231 : v->addDerivative(3*i+2,d[2]); 79 17928231 : } 80 : 81 : 82 : inline 83 228947 : void Colvar::setBoxDerivatives(Value* v,const Tensor&d) { 84 : unsigned nat=getNumberOfAtoms(); 85 228947 : v->addDerivative(3*nat+0,d(0,0)); 86 228947 : v->addDerivative(3*nat+1,d(0,1)); 87 228947 : v->addDerivative(3*nat+2,d(0,2)); 88 228947 : v->addDerivative(3*nat+3,d(1,0)); 89 228947 : v->addDerivative(3*nat+4,d(1,1)); 90 228947 : v->addDerivative(3*nat+5,d(1,2)); 91 228947 : v->addDerivative(3*nat+6,d(2,0)); 92 228947 : v->addDerivative(3*nat+7,d(2,1)); 93 228947 : v->addDerivative(3*nat+8,d(2,2)); 94 228947 : } 95 : 96 : inline 97 16116836 : void Colvar::setAtomsDerivatives(int i,const Vector&d) { 98 16116836 : setAtomsDerivatives(getPntrToValue(),i,d); 99 16116836 : } 100 : 101 : inline 102 13246 : void Colvar::setBoxDerivatives(const Tensor&d) { 103 13246 : setBoxDerivatives(getPntrToValue(),d); 104 13246 : } 105 : 106 : inline 107 118901 : void Colvar::setBoxDerivativesNoPbc() { 108 118901 : setBoxDerivativesNoPbc(getPntrToValue()); 109 118901 : } 110 : 111 : inline 112 4879 : unsigned Colvar::getNumberOfDerivatives() { 113 4879 : return 3*getNumberOfAtoms() + 9; 114 : } 115 : 116 : 117 : } 118 : 119 : #endif