ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/primitives/Molecule.hpp
Revision: 1360
Committed: Mon Sep 7 16:31:51 2009 UTC (15 years, 8 months ago) by cli2
Original Path: trunk/src/primitives/Molecule.hpp
File size: 12090 byte(s)
Log Message:
Added new restraint infrastructure
Added MolecularRestraints
Added ObjectRestraints
Added RestraintStamp
Updated thermodynamic integration to use ObjectRestraints
Added Quaternion mathematics for twist swing decompositions
Significantly updated RestWriter and RestReader to use dump-like files
Added selections for x, y, and z coordinates of atoms
Removed monolithic Restraints class
Fixed a few bugs in gradients of Euler angles in DirectionalAtom and RigidBody
Added some rotational capabilities to prinicpalAxisCalculator

File Contents

# Content
1 /*
2 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3 *
4 * The University of Notre Dame grants you ("Licensee") a
5 * non-exclusive, royalty free, license to use, modify and
6 * redistribute this software in source and binary code form, provided
7 * that the following conditions are met:
8 *
9 * 1. Acknowledgement of the program authors must be made in any
10 * publication of scientific results based in part on use of the
11 * program. An acceptable form of acknowledgement is citation of
12 * the article in which the program was described (Matthew
13 * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 * Parallel Simulation Engine for Molecular Dynamics,"
16 * J. Comput. Chem. 26, pp. 252-271 (2005))
17 *
18 * 2. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 *
21 * 3. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the
24 * distribution.
25 *
26 * This software is provided "AS IS," without a warranty of any
27 * kind. All express or implied conditions, representations and
28 * warranties, including any implied warranty of merchantability,
29 * fitness for a particular purpose or non-infringement, are hereby
30 * excluded. The University of Notre Dame and its licensors shall not
31 * be liable for any damages suffered by licensee as a result of
32 * using, modifying or distributing the software or its
33 * derivatives. In no event will the University of Notre Dame or its
34 * licensors be liable for any lost revenue, profit or data, or for
35 * direct, indirect, special, consequential, incidental or punitive
36 * damages, however caused and regardless of the theory of liability,
37 * arising out of the use of or inability to use software, even if the
38 * University of Notre Dame has been advised of the possibility of
39 * such damages.
40 */
41
42 /**
43 * @file Molecule.hpp
44 * @author tlin
45 * @date 10/25/2004
46 * @version 1.0
47 */
48
49 #ifndef PRIMITIVES_MOLECULE_HPP
50 #define PRIMITIVES_MOLECULE_HPP
51 #include <vector>
52 #include <iostream>
53
54 #include "constraints/ConstraintPair.hpp"
55 #include "math/Vector3.hpp"
56 #include "primitives/Atom.hpp"
57 #include "primitives/RigidBody.hpp"
58 #include "primitives/Bond.hpp"
59 #include "primitives/Bend.hpp"
60 #include "primitives/Torsion.hpp"
61 #include "primitives/Inversion.hpp"
62 #include "primitives/CutoffGroup.hpp"
63 #include "utils/PropertyMap.hpp"
64
65 namespace oopse{
66
67 class Constraint;
68
69 /**
70 * @class Molecule Molecule.hpp "primitives/Molecule.hpp"
71 * @brief
72 */
73 class Molecule {
74 public:
75
76 typedef std::vector<Atom*>::iterator AtomIterator;
77 typedef std::vector<Bond*>::iterator BondIterator;
78 typedef std::vector<Bend*>::iterator BendIterator;
79 typedef std::vector<Torsion*>::iterator TorsionIterator;
80 typedef std::vector<Inversion*>::iterator InversionIterator;
81 typedef std::vector<RigidBody*>::iterator RigidBodyIterator;
82 typedef std::vector<CutoffGroup*>::iterator CutoffGroupIterator;
83 typedef std::vector<StuntDouble*>::iterator IntegrableObjectIterator;
84 typedef std::vector<ConstraintPair*>::iterator ConstraintPairIterator;
85 typedef std::vector<ConstraintElem*>::iterator ConstraintElemIterator;
86
87
88 Molecule(int stampId, int globalIndex, const std::string& molName);
89 virtual ~Molecule();
90
91 /**
92 * Returns the global index of this molecule.
93 * @return the global index of this molecule
94 */
95 int getGlobalIndex() {
96 return globalIndex_;
97 }
98
99 /**
100 * Returns the stamp id of this molecule
101 * @note Ideally, every molecule should keep a pointer of its
102 * molecule stamp instead of its stamp id. However, the pointer
103 * will become invalid, if the molecule migrate to other
104 * processor.
105 */
106 int getStampId() {
107 return stampId_;
108 }
109
110 /** Returns the name of the molecule */
111 std::string getType() {
112 return moleculeName_;
113 }
114
115 /**
116 * Sets the global index of this molecule.
117 * @param new global index to be set
118 */
119 void setGlobalIndex(int index) {
120 globalIndex_ = index;
121 }
122
123
124 /** add an atom into this molecule */
125 void addAtom(Atom* atom);
126
127 /** add a bond into this molecule */
128 void addBond(Bond* bond);
129
130 /** add a bend into this molecule */
131 void addBend(Bend* bend);
132
133 /** add a torsion into this molecule*/
134 void addTorsion(Torsion* torsion);
135
136 /** add an improper torsion into this molecule*/
137 void addInversion(Inversion* inversion);
138
139 /** add a rigidbody into this molecule */
140 void addRigidBody(RigidBody *rb);
141
142 /** add a cutoff group into this molecule */
143 void addCutoffGroup(CutoffGroup* cp);
144
145 void addConstraintPair(ConstraintPair* consPair);
146
147 void addConstraintElem(ConstraintElem* consElem);
148
149 /** */
150 void complete();
151
152 /** Returns the total number of atoms in this molecule */
153 unsigned int getNAtoms() {
154 return atoms_.size();
155 }
156
157 /** Returns the total number of bonds in this molecule */
158 unsigned int getNBonds(){
159 return bonds_.size();
160 }
161
162 /** Returns the total number of bends in this molecule */
163 unsigned int getNBends() {
164 return bends_.size();
165 }
166
167 /** Returns the total number of torsions in this molecule */
168 unsigned int getNTorsions() {
169 return torsions_.size();
170 }
171
172 /** Returns the total number of improper torsions in this molecule */
173 unsigned int getNInversions() {
174 return inversions_.size();
175 }
176
177 /** Returns the total number of rigid bodies in this molecule */
178 unsigned int getNRigidBodies() {
179 return rigidBodies_.size();
180 }
181
182 /** Returns the total number of integrable objects in this molecule */
183 unsigned int getNIntegrableObjects() {
184 return integrableObjects_.size();
185 }
186
187 /** Returns the total number of cutoff groups in this molecule */
188 unsigned int getNCutoffGroups() {
189 return cutoffGroups_.size();
190 }
191
192 /** Returns the total number of constraints in this molecule */
193 unsigned int getNConstraintPairs() {
194 return constraintPairs_.size();
195 }
196
197 Atom* getAtomAt(unsigned int i) {
198 assert(i < atoms_.size());
199 return atoms_[i];
200 }
201
202 RigidBody* getRigidBodyAt(unsigned int i) {
203 assert(i < rigidBodies_.size());
204 return rigidBodies_[i];
205 }
206
207 Atom* beginAtom(std::vector<Atom*>::iterator& i) {
208 i = atoms_.begin();
209 return (i == atoms_.end()) ? NULL : *i;
210 }
211
212 Atom* nextAtom(std::vector<Atom*>::iterator& i) {
213 ++i;
214 return (i == atoms_.end()) ? NULL : *i;
215 }
216
217 Bond* beginBond(std::vector<Bond*>::iterator& i) {
218 i = bonds_.begin();
219 return (i == bonds_.end()) ? NULL : *i;
220 }
221
222 Bond* nextBond(std::vector<Bond*>::iterator& i) {
223 ++i;
224 return (i == bonds_.end()) ? NULL : *i;
225
226 }
227
228 Bend* beginBend(std::vector<Bend*>::iterator& i) {
229 i = bends_.begin();
230 return (i == bends_.end()) ? NULL : *i;
231 }
232
233 Bend* nextBend(std::vector<Bend*>::iterator& i) {
234 ++i;
235 return (i == bends_.end()) ? NULL : *i;
236 }
237
238 Torsion* beginTorsion(std::vector<Torsion*>::iterator& i) {
239 i = torsions_.begin();
240 return (i == torsions_.end()) ? NULL : *i;
241 }
242
243 Torsion* nextTorsion(std::vector<Torsion*>::iterator& i) {
244 ++i;
245 return (i == torsions_.end()) ? NULL : *i;
246 }
247
248 Inversion* beginInversion(std::vector<Inversion*>::iterator& i) {
249 i = inversions_.begin();
250 return (i == inversions_.end()) ? NULL : *i;
251 }
252
253 Inversion* nextInversion(std::vector<Inversion*>::iterator& i) {
254 ++i;
255 return (i == inversions_.end()) ? NULL : *i;
256 }
257
258 RigidBody* beginRigidBody(std::vector<RigidBody*>::iterator& i) {
259 i = rigidBodies_.begin();
260 return (i == rigidBodies_.end()) ? NULL : *i;
261 }
262
263 RigidBody* nextRigidBody(std::vector<RigidBody*>::iterator& i) {
264 ++i;
265 return (i == rigidBodies_.end()) ? NULL : *i;
266 }
267
268 StuntDouble* beginIntegrableObject(std::vector<StuntDouble*>::iterator& i) {
269 i = integrableObjects_.begin();
270 return (i == integrableObjects_.end()) ? NULL : *i;
271 }
272
273 StuntDouble* nextIntegrableObject(std::vector<StuntDouble*>::iterator& i) {
274 ++i;
275 return (i == integrableObjects_.end()) ? NULL : *i;
276 }
277
278 CutoffGroup* beginCutoffGroup(std::vector<CutoffGroup*>::iterator& i) {
279 i = cutoffGroups_.begin();
280 return (i == cutoffGroups_.end()) ? NULL : *i;
281 }
282
283 CutoffGroup* nextCutoffGroup(std::vector<CutoffGroup*>::iterator& i) {
284 ++i;
285 return (i == cutoffGroups_.end()) ? NULL : *i;
286 }
287
288 ConstraintPair* beginConstraintPair(std::vector<ConstraintPair*>::iterator& i) {
289 i = constraintPairs_.begin();
290 return (i == constraintPairs_.end()) ? NULL : *i;
291 }
292
293 ConstraintPair* nextConstraintPair(std::vector<ConstraintPair*>::iterator& i) {
294 ++i;
295 return (i == constraintPairs_.end()) ? NULL : *i;
296 }
297
298 ConstraintElem* beginConstraintElem(std::vector<ConstraintElem*>::iterator& i) {
299 i = constraintElems_.begin();
300 return (i == constraintElems_.end()) ? NULL : *i;
301 }
302
303 ConstraintElem* nextConstraintElem(std::vector<ConstraintElem*>::iterator& i) {
304 ++i;
305 return (i == constraintElems_.end()) ? NULL : *i;
306 }
307
308 /**
309 * Returns the total potential energy of short range interaction
310 * of this molecule
311 */
312 RealType getPotential();
313
314 /** get total mass of this molecule */
315 RealType getMass();
316
317 /** return the center of mass of this molecule */
318 Vector3d getCom();
319
320 /** Moves the center of this molecule */
321 void moveCom(const Vector3d& delta);
322
323 /** Returns the velocity of center of mass of this molecule */
324 Vector3d getComVel();
325
326 std::string getMoleculeName() {
327 return moleculeName_;
328 }
329
330 friend std::ostream& operator <<(std::ostream& o, Molecule& mol);
331
332 //below functions are just forward functions
333 /**
334 * Adds property into property map
335 * @param genData GenericData to be added into PropertyMap
336 */
337 void addProperty(GenericData* genData);
338
339 /**
340 * Removes property from PropertyMap by name
341 * @param propName the name of property to be removed
342 */
343 void removeProperty(const std::string& propName);
344
345 /**
346 * clear all of the properties
347 */
348 void clearProperties();
349
350 /**
351 * Returns all names of properties
352 * @return all names of properties
353 */
354 std::vector<std::string> getPropertyNames();
355
356 /**
357 * Returns all of the properties in PropertyMap
358 * @return all of the properties in PropertyMap
359 */
360 std::vector<GenericData*> getProperties();
361
362 /**
363 * Returns property
364 * @param propName name of property
365 * @return a pointer point to property with propName. If no property named propName
366 * exists, return NULL
367 */
368 GenericData* getPropertyByName(const std::string& propName);
369
370 private:
371
372 int globalIndex_;
373
374 std::vector<Atom*> atoms_;
375 std::vector<Bond*> bonds_;
376 std::vector<Bend*> bends_;
377 std::vector<Torsion*> torsions_;
378 std::vector<Inversion*> inversions_;
379 std::vector<RigidBody*> rigidBodies_;
380 std::vector<StuntDouble*> integrableObjects_;
381 std::vector<CutoffGroup*> cutoffGroups_;
382 std::vector<ConstraintPair*> constraintPairs_;
383 std::vector<ConstraintElem*> constraintElems_;
384 int stampId_;
385 std::string moleculeName_;
386 PropertyMap properties_;
387
388 };
389
390 } //namespace oopse
391 #endif //