ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-4/src/brains/SimInfo.hpp
Revision: 1725
Committed: Wed Nov 10 22:01:06 2004 UTC (19 years, 8 months ago) by tim
File size: 9600 byte(s)
Log Message:
another painful day
(1) SimCreator, SimInfo, mpiSimulation
(2) DumpReader, DumpWriter (InitializeFrom File will be removed)
(3) ForceField (at least LJ) and BondType, BendType, TorsionType
(4)Integrator
(5)oopse.cpp
(6)visitors & Dump2XYZ
(7)SimpleBuilder
(8)Constraint & ZConstraint

File Contents

# Content
1 /*
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
26 /**
27 * @file SimInfo.hpp
28 * @author tlin
29 * @date 11/02/2004
30 * @version 1.0
31 */
32
33 #ifndef BRAINS_SIMMODEL_HPP
34 #define BRAINS_SIMMODEL_HPP
35
36 #include <iostream>
37 #include <vector>
38 #include <utility>
39
40 #include "brains/fSimulation.h"
41 #include "primitives/Molecule.hpp"
42 #include "types/MoleculeStamp.hpp"
43 #include "utils/PropertyMap.hpp"
44 #include "io/Globals.hpp"
45
46 namespace oopse{
47
48 /**
49 * @class SimInfo SimInfo.hpp "brains/SimInfo.hpp"
50 * @brief
51 */
52 class SimInfo {
53 public:
54 typedef std::vector<Molecule*>::iterator MoleculeIterator;
55 SimInfo();
56 virtual ~SimInfo();
57
58 /**
59 * Adds a molecule
60 * @return return true if adding successfully, return false if the molecule is already in SimInfo
61 * @param mol molecule to be added
62 */
63 bool addMolecule(Molecule* mol);
64
65 /**
66 * Removes a molecule from SimInfo
67 * @return true if removing successfully, return false if molecule is not in this SimInfo
68 */
69 bool removeMolecule(Molecule* mol);
70
71 /** Returns the total number of molecules in the system. */
72 int getNGlobalMolecules() {
73
74 #ifdef IS_MPI
75 int nmols;
76 int totNMols;
77
78 nmols = getNMolecules();
79 MPI_Allreduce(&nmols, &totNMols, 1, MPI_INT,MPI_SUM, MPI_COMM_WORLD);
80
81 return totNMols;
82 #else
83 return getNMolecules();
84 #endif
85 }
86
87 /** Returns the total number of atoms in the system. */
88 int getNGlobalAtoms() {
89
90 #ifdef IS_MPI
91 int totNAtoms;
92 MPI_Allreduce(&nAtoms_, &totNAtoms, 1, MPI_INT,MPI_SUM, MPI_COMM_WORLD);
93 return totNAtoms;
94 #else
95 return nAtoms_;
96 #endif
97 }
98
99 /** Returns the total number of cutoff groups in the system. */
100 int getNGlobalCutoffGroups() {
101 #ifdef IS_MPI
102 int totNGroups;
103 MPI_Allreduce(&nCutoffGroups_, &totNGroups, 1, MPI_INT,MPI_SUM, MPI_COMM_WORLD);
104 return totNGroups;
105 #else
106 return nCutoffGroups_;
107 #endif
108 }
109
110 /**
111 * Returns the number of local molecules.
112 * @return the number of local molecules
113 */
114 int getNMolecules() {
115 return molecules_.size();
116 }
117
118 /** Returns the number of local atoms */
119 unsigned int getNAtoms() {
120 return nAtoms_;
121 }
122
123 /** Returns the number of local bonds */
124 unsigned int getNBonds(){
125 return nBonds_;
126 }
127
128 /** Returns the number of local bends */
129 unsigned int getNBends() {
130 return nBends_;
131 }
132
133 /** Returns the number of local torsions */
134 unsigned int getNTorsions() {
135 return nTorsions_;
136 }
137
138 /** Returns the number of local rigid bodies */
139 unsigned int getNRigidBodies() {
140 return nRigidBodies_;
141 }
142
143 /** Returns the number of local integrable objects */
144 unsigned int getNIntegrableObjects() {
145 return nIntegrableObjects_;
146 }
147
148 /** Returns the number of local cutoff groups */
149 unsigned int getNCutoffGroups() {
150 return nCutoffGroups_;
151 }
152
153 /** Returns the total number of constraints in this SimInfo */
154 unsigned int getNConstraints() {
155 return nConstraints_;
156 }
157
158 /**
159 * Returns the first molecule in this SimInfo and intialize the iterator.
160 * @return the first molecule, return NULL if there is not molecule in this SimInfo
161 * @param i the iterator of molecule array (user shouldn't change it)
162 */
163 Molecule* beginMolecule(std::vector<Molecule*>::iterator& i);
164
165 /**
166 * Returns the next avaliable Molecule based on the iterator.
167 * @return the next avaliable molecule, return NULL if reaching the end of the array
168 * @param i the iterator of molecule array
169 */
170 Molecule* nextMolecule(std::vector<Molecule*>::iterator& i);
171
172 /** Returns the number of degrees of freedom */
173 int getNdf() {
174 return ndf_;
175 }
176
177 /** Returns the number of raw degrees of freedom */
178 int getNdfRaw() {
179 return ndfRaw_;
180 }
181
182 /** Returns the number of translational degrees of freedom */
183 int getNdfTrans() {
184 return ndfTrans_;
185 }
186
187 /** Returns the snapshot manager. */
188 SnapshotManager* getSnapshotManager() {
189 return sman_;
190 }
191
192 /** Sets the snapshot manager. */
193 void setSnapshotManager(SnapshotManager* sman) {
194 sman_ = sman;
195 }
196
197 /** Returns the force field */
198 ForceField* getForceField() {
199 return forceField_;
200 }
201
202 /** Sets the force field */
203 void setForceField(ForceField* ff) {
204 forceField_ = ff;
205 }
206
207 Globals* getGlobals() {
208 return globals_;
209 }
210
211 void setGlobals(Globals* globals) {
212 globals_ = globals;
213 }
214
215 /** Returns the velocity of center of mass of the whole system.*/
216 Vector3d getComVel();
217
218 /** Returns the center of the mass of the whole system.*/
219 Vector3d getCom();
220
221 /** Returns the seed (used for random number generator) */
222 int getSeed() {
223 return seed_;
224 }
225
226 /** Sets the seed*/
227 void setSeed(int seed) {
228 seed_ = seed;
229 }
230
231
232 void update();
233
234
235 /** Returns the local index manager */
236 LocalIndexManager* getLocalIndexManager() {
237 return localIndexMan_;
238 }
239
240
241 /**
242 *
243 */
244 void addMoleculeStamp(MoleculeStamp* molStamp, int nmol);
245
246 int getMoleculeStampId(int globalIndex) {
247 //assert(globalIndex < molStampIds_.size())
248 return molStampIds_[globalIndex];
249 }
250
251 /** Returns the molecule stamp */
252 MoleculeStamp* getMoleculeStamp(int id) {
253 return moleculeStamps_[id];
254 }
255
256 /**
257 * Finds the processor where a molecule resides
258 * @return the id of the processor which contains the molecule
259 * @param globalIndex global Index of the molecule
260 */
261 int getMolToProc(int globalIndex) {
262 //assert(globalIndex < molToProcMap_.size());
263 return molToProcMap_[globalIndex];
264 }
265
266 /**
267 * Finds a molecule with a specified global index
268 * @return a pointer point to found molecule
269 * @param index
270 */
271 Molecule* getMoleculeByGlobalIndex(int index) {
272 std::map<int, Molecule*> i;
273 i = globalIndexToMol_.find(index);
274
275 return i != globalIndexToMol_.end() ? i->second : NULL;
276 }
277
278
279 friend std::ostream& operator <<(ostream& o, SimInfo& info);
280
281 private:
282
283 void calcNdf();
284 void calcNdfRaw();
285 void calcNdfTrans();
286
287 int* getExcludeList() {
288 return exclude_.getExcludeList();
289 }
290
291 void addExcludePairs(Molecule* mol);
292 void removeExcludePairs(Molecule* mol);
293
294 //degress of freedom
295 int ndf_; /** number of degress of freedom */
296 int ndfRaw_;
297 int ndfTrans_; /**< number of translation degress of freedom */
298
299 //number of local objects
300 int nAtoms_;
301 int nBonds_;
302 int nBends_;
303 int nTorsions_;
304 int nRigidBodies_;
305 int nIntegrableObjects_;
306 int nCutoffGroups_;
307 int nConstraints_;
308
309 simtype fInfo_;
310 Exclude exclude_;
311 ForceField* forceField_;
312
313 std::vector<Molecule*> molecules_; /**< Molecule array */
314 PropertyMap properties_; /**< Generic Property */
315 SnapshotManager* sman_; /**< SnapshotManager */
316
317 Globals* globals_;
318
319 int seed_; /**< seed for random number generator */
320
321 LocalIndexManager localIndexMan_;
322
323 //
324 std::vector<int> molToProcMap_;
325 std::map<int, Molecule*> globalIndexToMol_;
326 std::vector<int> molStampIds_; /**< stamp id array of all molecules in the system */
327 std::vector<MoleculeStamp*> moleculeStamps_; /**< molecule stamps array */
328
329 };
330
331 } //namespace oopse
332 #endif //BRAINS_SIMMODEL_HPP