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