Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 : Copyright (c) 2011-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 : #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 77631 : bool checkIsEnergy() {return isEnergy;}
67 : explicit Colvar(const ActionOptions&);
68 1423 : ~Colvar() {}
69 : static void registerKeywords( Keywords& keys );
70 : virtual unsigned getNumberOfDerivatives();
71 : };
72 :
73 : inline
74 17964759 : void Colvar::setAtomsDerivatives(Value*v,int i,const Vector&d) {
75 17964759 : v->addDerivative(3*i+0,d[0]);
76 17964759 : v->addDerivative(3*i+1,d[1]);
77 17964759 : v->addDerivative(3*i+2,d[2]);
78 17964759 : }
79 :
80 :
81 : inline
82 163655 : void Colvar::setBoxDerivatives(Value* v,const Tensor&d) {
83 : unsigned nat=getNumberOfAtoms();
84 163655 : v->addDerivative(3*nat+0,d(0,0));
85 163655 : v->addDerivative(3*nat+1,d(0,1));
86 163655 : v->addDerivative(3*nat+2,d(0,2));
87 163655 : v->addDerivative(3*nat+3,d(1,0));
88 163655 : v->addDerivative(3*nat+4,d(1,1));
89 163655 : v->addDerivative(3*nat+5,d(1,2));
90 163655 : v->addDerivative(3*nat+6,d(2,0));
91 163655 : v->addDerivative(3*nat+7,d(2,1));
92 163655 : v->addDerivative(3*nat+8,d(2,2));
93 163655 : }
94 :
95 : inline
96 : void Colvar::setAtomsDerivatives(int i,const Vector&d) {
97 15164416 : setAtomsDerivatives(getPntrToValue(),i,d);
98 : }
99 :
100 : inline
101 : void Colvar::setBoxDerivatives(const Tensor&d) {
102 4554 : setBoxDerivatives(getPntrToValue(),d);
103 : }
104 :
105 : inline
106 : void Colvar::setBoxDerivativesNoPbc() {
107 90303 : setBoxDerivativesNoPbc(getPntrToValue());
108 : }
109 :
110 : inline
111 3678 : unsigned Colvar::getNumberOfDerivatives() {
112 3678 : return 3*getNumberOfAtoms() + 9;
113 : }
114 :
115 :
116 : }
117 :
118 : #endif
|