ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-3.0/src/primitives/Molecule.hpp
Revision: 1782
Committed: Wed Nov 24 20:55:03 2004 UTC (19 years, 7 months ago) by tim
File size: 9188 byte(s)
Log Message:
types and primitives get built

File Contents

# User Rev Content
1 tim 1692 /*
2     * Copyright (C) 2000-2004 Object Oriented Parallel Simulation Engine (OOPSE) project
3     *
4     * Contact: oopse@oopse.org
5     *
6     * This program is free software; you can redistribute it and/or
7     * modify it under the terms of the GNU Lesser General Public License
8     * as published by the Free Software Foundation; either version 2.1
9     * of the License, or (at your option) any later version.
10     * All we ask is that proper credit is given for our work, which includes
11     * - but is not limited to - adding the above copyright notice to the beginning
12     * of your source code files, and to any copyright notice that you may distribute
13     * with programs based on this work.
14     *
15     * This program is distributed in the hope that it will be useful,
16     * but WITHOUT ANY WARRANTY; without even the implied warranty of
17     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18     * GNU Lesser General Public License for more details.
19     *
20     * You should have received a copy of the GNU Lesser General Public License
21     * along with this program; if not, write to the Free Software
22     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23     *
24     */
25 gezelter 1490
26 tim 1692 /**
27     * @file Molecule.hpp
28     * @author tlin
29     * @date 10/25/2004
30     * @version 1.0
31     */
32    
33     #ifndef PRIMITIVES_MOLECULE_HPP
34     #define PRIMITIVES_MOLECULE_HPP
35 gezelter 1490 #include <vector>
36 tim 1692 #include <iostream>
37 gezelter 1490
38 tim 1692 #include "math/Vector3.hpp"
39 tim 1492 #include "primitives/Atom.hpp"
40     #include "primitives/RigidBody.hpp"
41 tim 1782 #include "primitives/Bond.hpp"
42     #include "primitives/Bend.hpp"
43     #include "primitives/Torsion.hpp"
44 tim 1695 #include "primitives/CutoffGroup.hpp"
45 gezelter 1490
46 tim 1692 namespace oopse{
47 gezelter 1490
48 tim 1701 class Constraint;
49    
50 tim 1692 /**
51     * @class Molecule Molecule.hpp "primitives/Molecule.hpp"
52     * @brief
53     */
54     class Molecule {
55     public:
56 gezelter 1490
57 tim 1725 typedef std::vector<Atom*>::iterator AtomIterator;
58     typedef std::vector<Bond*>::iterator BondIterator;
59     typedef std::vector<Bend*>::iterator BendIterator;
60     typedef std::vector<Torsion*>::iterator TorsionIterator;
61     typedef std::vector<RigidBody*>::iterator RigidBodyIterator;
62     typedef std::vector<CutoffGroup*>::iterator CutoffGroupIterator;
63     typedef std::vector<StuntDouble*>::iterator IntegrableObjectIterator;
64    
65 tim 1733 Molecule(int stampId, int globalIndex, const std::string& molName);
66 tim 1692 virtual ~Molecule();
67 gezelter 1490
68 tim 1692 /**
69     * Returns the global index of this molecule.
70     * @return the global index of this molecule
71     */
72     int getGlobalIndex() {
73     return globalIndex_;
74     }
75 gezelter 1490
76 tim 1692 /**
77 tim 1733 * Returns the stamp id of this molecule
78     * @note Ideally, every molecule should keep a pointer of its molecule stamp instead of its
79     * stamp id. However, the pointer will become invalid, if the molecule migrate to other processor.
80     */
81     int getStampId() {
82     return stampId_;
83     }
84    
85     /** Returns the name of the molecule */
86     std::string getType() {
87     return moleculeName_;
88     }
89    
90     /**
91 tim 1692 * Sets the global index of this molecule.
92     * @param new global index to be set
93     */
94 tim 1695 int setGlobalIndex(int index) {
95 tim 1692 return globalIndex_;
96     }
97 gezelter 1490
98 tim 1733
99 tim 1692 /** add an atom into this molecule */
100     void addAtom(Atom* atom);
101 gezelter 1490
102 tim 1692 /** add a bond into this molecule */
103     void addBond(Bond* bond);
104 gezelter 1490
105 tim 1692 /** add a bend into this molecule */
106     void addBend(Bend* bend);
107 gezelter 1490
108 tim 1692 /** add a torsion into this molecule*/
109     void addTorsion(Torsion* torsion);
110 gezelter 1490
111 tim 1692 /** add a rigidbody into this molecule */
112     void addRigidBody(RigidBody *rb);
113 gezelter 1490
114 tim 1692 /** add a cutoff group into this molecule */
115     void addCutoffGroup(CutoffGroup* cp);
116 gezelter 1490
117 tim 1692 /** */
118     void complete();
119 gezelter 1490
120 tim 1692 /** Returns the total number of atoms in this molecule */
121     unsigned int getNAtoms() {
122     return atoms_.size();
123     }
124 gezelter 1490
125 tim 1692 /** Returns the total number of bonds in this molecule */
126     unsigned int getNBonds(){
127     return bonds_.size();
128     }
129 gezelter 1490
130 tim 1692 /** Returns the total number of bends in this molecule */
131     unsigned int getNBends() {
132     return bends_.size();
133     }
134 gezelter 1490
135 tim 1692 /** Returns the total number of torsions in this molecule */
136     unsigned int getNTorsions() {
137     return torsions_.size();
138     }
139 gezelter 1490
140 tim 1692 /** Returns the total number of rigid bodies in this molecule */
141     unsigned int getNRigidBodies() {
142     return rigidBodies_.size();
143     }
144 gezelter 1490
145 tim 1692 /** Returns the total number of integrable objects in this molecule */
146     unsigned int getNIntegrableObjects() {
147     return integrableObjects_.size();
148     }
149    
150     /** Returns the total number of cutoff groups in this molecule */
151     unsigned int getNCutoffGroups() {
152     return cutoffGroups_.size();
153     }
154    
155 tim 1696 /** Returns the total number of constraints in this molecule */
156     unsigned int getNConstraints() {
157     return constraints_.size();
158     }
159 tim 1719
160     Atom* getAtomAt(unsigned int i) {
161     assert(i < atoms_.size());
162     return atoms_[i];
163     }
164 tim 1692 /**
165     * Returns the first atom in this molecule and initialize the iterator.
166     * @return the first atom, return NULL if there is not cut off group in this molecule
167     * @param i iteraotr
168     */
169     Atom* beginAtom(std::vector<Atom*>::iterator& i);
170    
171     Atom* nextAtom(std::vector<Atom*>::iterator& i);
172    
173     /**
174     * Returns the first bond in this molecule and initialize the iterator.
175     * @return the first bond, return NULL if there is not cut off group in this molecule
176     * @param i iteraotr
177     */
178     Bond* beginBond(std::vector<Bond*>::iterator& i);
179    
180     Bond* nextBond(std::vector<Bond*>::iterator& i);
181    
182     /**
183     * Returns the first bend in this molecule and initialize the iterator.
184     * @return the first bend, return NULL if there is not cut off group in this molecule
185     * @param i iteraotr
186     */
187     Bend* beginBend(std::vector<Bend*>::iterator& i);
188    
189     Bend* nextBend(std::vector<Bend*>::iterator& i);
190    
191     /**
192     * Returns the first torsion in this molecule and initialize the iterator.
193     * @return the first torsion, return NULL if there is not cut off group in this molecule
194     * @param i iteraotr
195     */
196     Torsion* beginTorsion(std::vector<Torsion*>::iterator& i);
197     Torsion* nextTorsion(std::vector<Torsion*>::iterator& i);
198    
199     /**
200     * Returns the first rigid body in this molecule and initialize the iterator.
201     * @return the first rigid body, return NULL if there is not cut off group in this molecule
202     * @param i iteraotr
203     */
204     RigidBody* beginRigidBody(std::vector<RigidBody*>::iterator& i);
205    
206     RigidBody* nextRigidBody(std::vector<RigidBody*>::iterator& i);
207    
208     /**
209     * Returns the first integrable object in this molecule and initialize the iterator.
210     * @return the first integrable object, return NULL if there is not cut off group in this molecule
211     * @param i iteraotr
212     */
213     StuntDouble* beginIntegrableObject(std::vector<StuntDouble*>::iterator& i);
214    
215     StuntDouble* nextIntegrableObject(std::vector<StuntDouble*>::iterator& i);
216    
217     /**
218     * Returns the first cutoff group in this molecule and initialize the iterator.
219     * @return the first cutoff group, return NULL if there is not cut off group in this molecule
220     * @param i iteraotr
221     */
222     CutoffGroup* beginCutoffGroup(std::vector<CutoffGroup*>::iterator& i);
223    
224     /**
225     * Returns next cutoff group based on the iterator
226     * @return next cutoff group
227     * @param i
228     */
229     CutoffGroup* nextCutoffGroup(std::vector<CutoffGroup*>::iterator& i);
230    
231 tim 1696 Constraint* beginConstraint(std::vector<Constraint*>::iterator& i);
232    
233     Constraint* nextConstraint(std::vector<Constraint*>::iterator& i);
234    
235 tim 1692
236     /** return the total potential energy of short range interaction of this molecule */
237     double getPotential();
238    
239    
240     /** return the center of mass of this molecule */
241     Vector3d getCom();
242    
243     /** Moves the center of this molecule */
244 tim 1695 void moveCom(const Vector3d& delta);
245 tim 1692
246     /** Returns the velocity of center of mass of this molecule */
247     Vector3d getComVel();
248    
249     /** Returns the total mass of this molecule */
250     double getTotalMass();
251    
252 tim 1695 friend std::ostream& operator <<(std::ostream& o, Molecule& mol);
253 tim 1692
254     private:
255 tim 1725
256 tim 1692 int globalIndex_;
257    
258     std::vector<Atom*> atoms_;
259     std::vector<Bond*> bonds_;
260     std::vector<Bend*> bends_;
261     std::vector<Torsion*> torsions_;
262     std::vector<RigidBody*> rigidBodies_;
263     std::vector<StuntDouble*> integrableObjects_;
264     std::vector<CutoffGroup*> cutoffGroups_;
265 tim 1696 std::vector<Constraint*> constraints_;
266 tim 1713
267 tim 1733 int stampId_;
268     std::string moleculeName_;
269 gezelter 1490 };
270    
271 tim 1692 } //namespace oopse
272     #endif //