All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
Atoms.h
Go to the documentation of this file.
1 /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2  Copyright (c) 2013 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-code.org for more information.
6 
7  This file is part of plumed, version 2.0.
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_Atoms_h
23 #define __PLUMED_core_Atoms_h
24 
25 #include "tools/Communicator.h"
26 #include "tools/Tensor.h"
27 #include "tools/Units.h"
28 #include "tools/Exception.h"
29 #include "tools/AtomNumber.h"
30 #include <vector>
31 #include <set>
32 #include <map>
33 #include <string>
34 
35 namespace PLMD{
36 
37 class MDAtomsBase;
38 class PlumedMain;
39 class ActionAtomistic;
40 class ActionWithVirtualAtom;
41 class Pbc;
42 
43 /// Class containing atom related quantities from the MD code.
44 /// IT IS STILL UNDOCUMENTED. IT PROBABLY NEEDS A STRONG CLEANUP
45 class Atoms
46 {
47  friend class ActionAtomistic;
48  friend class ActionWithVirtualAtom;
49  int natoms;
50  std::vector<Vector> positions;
51  std::vector<Vector> forces;
52  std::vector<double> masses;
53  std::vector<double> charges;
54  std::vector<ActionWithVirtualAtom*> virtualAtomsActions;
56  Pbc& pbc;
58 // this is the energy set by each processor:
59  double md_energy;
60 // this is the summed energy:
61  double energy;
62 
72 
73  std::map<std::string,std::vector<AtomNumber> > groups;
74 
75  void resizeVectors(unsigned);
76 
77  std::vector<int> fullList;
78 
80 
82 
85 
88 
89  double timestep;
90  double forceOnEnergy;
91 
92  std::vector<const ActionAtomistic*> actions;
93  std::vector<int> gatindex;
94 
96  public Communicator
97  {
98  public:
99  bool on;
100  bool async;
101  std::vector<int> g2l;
102 
103  std::vector<Communicator::Request> mpi_request_positions;
104  std::vector<Communicator::Request> mpi_request_index;
105 
106  std::vector<double> positionsToBeSent;
107  std::vector<double> positionsToBeReceived;
108  std::vector<int> indexToBeSent;
109  std::vector<int> indexToBeReceived;
110  operator bool(){return on;}
112  on(false), async(false)
113  {}
114  void enable(Communicator& c);
115  };
116 
118 
119  void share(const std::set<AtomNumber>&);
120 
121 public:
122 
123  Atoms(PlumedMain&plumed);
124  ~Atoms();
125 
126  void init();
127 
128  void share();
129  void shareAll();
130  void wait();
131  void updateForces();
132 
133  void setRealPrecision(int);
134  int getRealPrecision()const;
135 
136  void setTimeStep(void*);
137  double getTimeStep()const;
138 
139  void setNatoms(int);
140  const int & getNatoms()const;
141 
142  void setCollectEnergy(bool b){ collectEnergy=b; }
143 
145  void setAtomsGatindex(int*);
146  void setAtomsContiguous(int);
147  void setAtomsNlocal(int);
148 
149  void startStep();
150  void setEnergy(void*);
151  void setBox(void*);
152  void setVirial(void*);
153  void setPositions(void*);
154  void setPositions(void*,int);
155  void setForces(void*);
156  void setForces(void*,int);
157  void setMasses(void*);
158  void setCharges(void*);
159  bool chargesWereSet() const ;
160  bool boxWasSet() const ;
161 
162  void MD2double(const void*m,double&d)const;
163  void double2MD(const double&d,void*m)const;
164 
165  void createFullList(int*);
166  void getFullList(int**);
167  void clearFullList();
168 
169  void add(const ActionAtomistic*);
170  void remove(const ActionAtomistic*);
171 
172  double getEnergy()const{plumed_assert(collectEnergy && energyHasBeenSet); return energy;}
173 
174  bool isEnergyNeeded()const{return collectEnergy;}
175 
176  void setMDEnergyUnits(double d){MDUnits.setEnergy(d);}
177  void setMDLengthUnits(double d){MDUnits.setLength(d);}
178  void setMDTimeUnits(double d){MDUnits.setTime(d);}
179  const Units& getMDUnits(){return MDUnits;}
180  void setUnits(const Units&u){units=u;}
181  const Units& getUnits(){return units;}
182  void updateUnits();
183 
187  bool isVirtualAtom(AtomNumber)const;
188  void insertGroup(const std::string&name,const std::vector<AtomNumber>&a);
189  void removeGroup(const std::string&name);
190  void writeBinary(std::ostream&)const;
191  void readBinary(std::istream&);
192  double getKBoltzmann()const;
193  double getMDKBoltzmann()const;
194  bool usingNaturalUnits()const;
195  void setNaturalUnits(bool n){naturalUnits=n;}
196  void setMDNaturalUnits(bool n){MDnaturalUnits=n;}
197  Vector & modifyPosition(AtomNumber i){ return positions[i.index()];}
198 };
199 
200 inline
201 const int & Atoms::getNatoms()const{
202  return natoms;
203 }
204 
205 inline
207  return i.index()>=getNatoms();
208 }
209 
210 inline
212  return virtualAtomsActions[i.index()-getNatoms()];
213 }
214 
215 inline
217  return naturalUnits;
218 }
219 
220 inline
221 bool Atoms::chargesWereSet() const {
222  return chargesHaveBeenSet;
223 }
224 
225 inline
226 bool Atoms::boxWasSet() const {
227  return boxHasBeenSet;
228 }
229 
230 
231 }
232 #endif
double forceOnEnergy
Definition: Atoms.h:90
void setTime(const std::string &)
Set time units from string.
Definition: Units.cpp:73
std::vector< const ActionAtomistic * > actions
Definition: Atoms.h:92
void wait()
Definition: Atoms.cpp:204
Simple class to store the index of an atom.
Definition: AtomNumber.h:39
const int & getNatoms() const
Definition: Atoms.h:201
void removeVirtualAtom(ActionWithVirtualAtom *)
Definition: Atoms.cpp:377
std::vector< int > g2l
Definition: Atoms.h:101
void setVirial(void *)
Definition: Atoms.cpp:96
void getFullList(int **)
Definition: Atoms.cpp:341
AtomNumber addVirtualAtom(ActionWithVirtualAtom *)
Definition: Atoms.cpp:370
std::vector< Vector > forces
Definition: Atoms.h:51
std::vector< double > charges
Definition: Atoms.h:53
double getMDKBoltzmann() const
Definition: Atoms.cpp:412
bool isEnergyNeeded() const
Definition: Atoms.h:174
void setTimeStep(void *)
Definition: Atoms.cpp:322
bool massesHaveBeenSet
Definition: Atoms.h:67
void removeGroup(const std::string &name)
Definition: Atoms.cpp:389
void setCharges(void *)
Definition: Atoms.cpp:90
void setAtomsContiguous(int)
Definition: Atoms.cpp:296
bool virialHasBeenSet
Definition: Atoms.h:71
Class implementing fixed size matrices of doubles.
Definition: Tensor.h:70
void add(const ActionAtomistic *)
Definition: Atoms.cpp:261
Class implementing fixed size vectors of doubles.
Definition: Vector.h:74
void enable(Communicator &c)
Definition: Atoms.cpp:272
void updateForces()
Definition: Atoms.cpp:237
int getRealPrecision() const
Definition: Atoms.cpp:307
std::vector< double > masses
Definition: Atoms.h:52
void setLength(const std::string &)
Set lengh units from string.
Definition: Units.cpp:57
void setAtomsNlocal(int)
Definition: Atoms.cpp:278
void writeBinary(std::ostream &) const
Definition: Atoms.cpp:394
std::vector< int > indexToBeSent
Definition: Atoms.h:108
Class containing wrappers to MPI.
Definition: Communicator.h:44
bool energyHasBeenSet
Definition: Atoms.h:65
MDAtomsBase * mdatoms
Definition: Atoms.h:79
DomainDecomposition dd
Definition: Atoms.h:117
Class containing atom related quantities from the MD code.
Definition: Atoms.h:45
std::vector< Communicator::Request > mpi_request_index
Definition: Atoms.h:104
std::vector< Vector > positions
Definition: Atoms.h:50
void const char const char int * n
Definition: Matrix.h:42
void shareAll()
Definition: Atoms.cpp:138
Definition: Pbc.h:38
std::vector< ActionWithVirtualAtom * > virtualAtomsActions
Definition: Atoms.h:54
Class containing interface to MDAtomsTyped.
Definition: MDAtoms.h:48
double energy
Definition: Atoms.h:61
Atoms(PlumedMain &plumed)
Definition: Atoms.cpp:37
double timestep
Definition: Atoms.h:89
void double2MD(const double &d, void *m) const
Definition: Atoms.cpp:314
void setMDEnergyUnits(double d)
Definition: Atoms.h:176
void setUnits(const Units &u)
Definition: Atoms.h:180
std::vector< Communicator::Request > mpi_request_positions
Definition: Atoms.h:103
double getKBoltzmann() const
Definition: Atoms.cpp:407
Small utility class that contains information about units.
Definition: Units.h:41
void readBinary(std::istream &)
Definition: Atoms.cpp:400
std::vector< int > indexToBeReceived
Definition: Atoms.h:109
void createFullList(int *)
Definition: Atoms.cpp:330
bool chargesWereSet() const
Definition: Atoms.h:221
bool boxHasBeenSet
Definition: Atoms.h:69
void setNaturalUnits(bool n)
Definition: Atoms.h:195
Action used to create objects that access the positions of the atoms from the MD code.
bool MDnaturalUnits
Definition: Atoms.h:87
void setEnergy(const std::string &)
Set energy units from string.
Definition: Units.cpp:39
bool dataCanBeSet
Definition: Atoms.h:63
void setNatoms(int)
Definition: Atoms.cpp:250
double getEnergy() const
Definition: Atoms.h:172
void setEnergy(void *)
Definition: Atoms.cpp:102
void setMDLengthUnits(double d)
Definition: Atoms.h:177
std::vector< double > positionsToBeReceived
Definition: Atoms.h:107
Vector & modifyPosition(AtomNumber i)
Definition: Atoms.h:197
Inherit from here if you are calculating the position of a virtual atom (eg a center of mass) ...
void setMDTimeUnits(double d)
Definition: Atoms.h:178
void startStep()
Definition: Atoms.cpp:66
void setMasses(void *)
Definition: Atoms.cpp:83
void resizeVectors(unsigned)
Definition: Atoms.cpp:363
void setAtomsGatindex(int *)
Definition: Atoms.cpp:289
double md_energy
Definition: Atoms.h:59
Units MDUnits
Definition: Atoms.h:83
unsigned index() const
Returns the index number.
Definition: AtomNumber.h:89
bool usingNaturalUnits() const
Definition: Atoms.h:216
void init()
Definition: Atoms.cpp:350
Tensor virial
Definition: Atoms.h:57
bool boxWasSet() const
Definition: Atoms.h:226
Tensor box
Definition: Atoms.h:55
const Units & getMDUnits()
Definition: Atoms.h:179
void const char const char int double int double double int int double int * m
Definition: Matrix.h:42
const Units & getUnits()
Definition: Atoms.h:181
void setDomainDecomposition(Communicator &)
Definition: Atoms.cpp:359
void clearFullList()
Definition: Atoms.cpp:346
bool isVirtualAtom(AtomNumber) const
Definition: Atoms.h:206
bool chargesHaveBeenSet
Definition: Atoms.h:68
unsigned forcesHaveBeenSet
Definition: Atoms.h:70
Main plumed object.
Definition: PlumedMain.h:71
void insertGroup(const std::string &name, const std::vector< AtomNumber > &a)
Definition: Atoms.cpp:384
void setRealPrecision(int)
Definition: Atoms.cpp:302
unsigned positionsHaveBeenSet
Definition: Atoms.h:66
std::vector< int > gatindex
Definition: Atoms.h:93
void setMDNaturalUnits(bool n)
Definition: Atoms.h:196
ActionWithVirtualAtom * getVirtualAtomsAction(AtomNumber) const
Definition: Atoms.h:211
void setCollectEnergy(bool b)
Definition: Atoms.h:142
double getTimeStep() const
Definition: Atoms.cpp:326
std::vector< double > positionsToBeSent
Definition: Atoms.h:106
void const char const char int double * a
Definition: Matrix.h:42
Units units
Definition: Atoms.h:84
int natoms
Definition: Atoms.h:49
bool collectEnergy
Definition: Atoms.h:64
void setForces(void *)
Definition: Atoms.cpp:109
PlumedMain & plumed
Definition: Atoms.h:81
void updateUnits()
Definition: Atoms.cpp:318
std::vector< int > fullList
Definition: Atoms.h:77
void MD2double(const void *m, double &d) const
Definition: Atoms.cpp:311
bool naturalUnits
Definition: Atoms.h:86
void setPositions(void *)
Definition: Atoms.cpp:77
void share()
Definition: Atoms.cpp:128
void setBox(void *)
Definition: Atoms.cpp:72
std::map< std::string, std::vector< AtomNumber > > groups
Definition: Atoms.h:73
Pbc & pbc
Definition: Atoms.h:56