ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-3.0/src/primitives/StuntDouble.hpp
(Generate patch)

Comparing branches/new_design/OOPSE-3.0/src/primitives/StuntDouble.hpp (file contents):
Revision 1691, Thu Oct 28 22:34:02 2004 UTC vs.
Revision 1692 by tim, Mon Nov 1 20:15:58 2004 UTC

# Line 1 | Line 1
1 < #ifndef __STUNTDOUBLE_HPP__
2 < #define __STUNTDOUBLE_HPP__
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 < #include <map>
27 < #include "utils/GenericData.hpp"
26 > /**
27 > * @file StuntDouble.hpp
28 > * @author    tlin
29 > * @date  10/22/2004
30 > * @version 1.0
31 > */
32 >  
33 > #ifndef _STUNTDOUBLE_HPP_
34 > #define _STUNTDOUBLE_HPP_
35  
36 < #define OT_ATOM 0
8 < #define OT_DATOM 1
9 < #define OT_RIGIDBODY 2
36 > #include <vector>
37  
38 < using namespace std;
39 < using namespace oopse;
38 > #include "visitors/BaseVisitor.hpp"
39 > #include "math/Quaternion.hpp"
40 > #include "math/SquareMatrix3.hpp"
41 > #include "math/Vector3.hpp"
42 > #include "utils/PropertyMap.hpp"
43 > #include "brains/SnapshotManager.hpp"
44 > namespace oopse{
45  
14 class BaseVisitor;
46  
47 < class StuntDouble {
48 < public:
49 <  virtual ~StuntDouble();
50 <  
51 <  int getObjType();
52 <  
53 <  bool isAtom(){
54 <    return objType == OT_ATOM || objType == OT_DATOM;
55 <  }
47 >  
48 >  /**
49 >   * @class StuntDouble StuntDouble.hpp "Primitives/StuntDouble.hpp"
50 >   * @brief
51 >   * StuntDouble is a very strange idea.  A StuntDouble stands in for
52 >   * some object that can be manipulated by the Integrators or
53 >   * Minimizers.  Some of the manipulable objects are Atoms, some are
54 >   * DirectionalAtoms, and some are RigidBodies.  StuntDouble
55 >   * provides an interface for the Integrators and Minimizers to use,
56 >   * and does some preliminary sanity checking so that the program
57 >   * doesn't try to do something stupid like torque an Atom
58 >   * @note the dynamoc data of stuntdouble will be stored outside of the class
59 >   */
60 >   class StuntDouble{
61 >   public:    
62  
63 <  bool isDirectionalAtom(){
64 <    return objType == OT_DATOM;
65 <  }
63 >        enum ObjectType{
64 >            otAtom,
65 >            otDAtom,
66 >            otRigidBody
67 >        };
68  
69 <  bool isRigidBody(){
70 <    return objType == OT_RIGIDBODY;
71 <  }
69 >        virtual ~StuntDouble();
70 >        
71 >        /**
72 >         * Returns the global index of this stuntdouble.
73 >         * @return  the global index of this stuntdouble
74 >         */
75 >        int getGlobalIndex() {
76 >            return globalIndex_;
77 >        }
78  
79 <  bool isDirectional(){
80 <    return isDirectionalAtom() || isRigidBody();
81 <  }
79 >        /**
80 >         * Sets the global index of this stuntdouble.
81 >         * @param new global index to be set
82 >         */
83 >        int setGlobalIndex(int index) {
84 >            return globalIndex_;
85 >        }
86 >        
87 >        /**
88 >         * Returns the local index of this stuntdouble
89 >         * @return the local index of this stuntdouble
90 >         */
91 >        int getLocalIndex() {
92 >            return localIndex_;
93 >        }
94  
95 <  virtual double getMass(void);
96 <  
97 <  virtual void   getPos(double pos[3]);
98 <  virtual void   setPos(double pos[3]);
99 <  
100 <  virtual void   getVel(double vel[3]);
101 <  virtual void   setVel(double vel[3]);
45 <  
46 <  virtual void   getFrc(double frc[3]);
47 <  virtual void   addFrc(double frc[3]);
95 >        /**
96 >         * Sets the local index of this stuntdouble
97 >         * @param index new index to be set
98 >         */        
99 >        void setLocalIndex(int index) {
100 >            localIndex_ = index;
101 >        }
102  
103 <  virtual void   getA(double A[3][3]);
104 <  virtual void   setA(double A[3][3]);
103 >        /**
104 >         * Tests if this stuntdouble is an atom
105 >         * @return true is this stuntdouble is an atom(or a directional atom), return false otherwise
106 >         */
107 >        bool isAtom(){
108 >            return objType_ == otAtom || objType_ == otDAtom;
109 >        }
110  
111 <  virtual void   getJ(double j[3]);
112 <  virtual void   setJ(double j[3]);
111 >        /**
112 >         * Tests if this stuntdouble is an directional atom
113 >         * @return true if this stuntdouble is an directional atom, return false otherwise
114 >         */
115 >        bool isDirectionalAtom(){
116 >            return objType_ == otDAtom;
117 >        }
118  
119 <  virtual void getQ( double q[4] ); // get the quanternions
120 <  virtual void setQ( double q[4] );
119 >        /**
120 >         * Tests if this stuntdouble is a rigid body.
121 >         * @return true if this stuntdouble is a rigid body, otherwise return false
122 >         */
123 >        bool isRigidBody(){
124 >            return objType_ == otRigidBody;
125 >        }
126  
127 <  virtual void setType(char* type) = 0;
128 <  virtual char* getType() = 0;
129 <  
127 >        /**
128 >         * Tests if this stuntdouble is a directional one.
129 >         * @return true is this stuntdouble is a directional atom or a rigid body, return false otherwise
130 >         */
131 >        bool isDirectional(){
132 >            return isDirectionalAtom() || isRigidBody();
133 >        }
134  
135 <  virtual void   getTrq(double trq[3]);
136 <  virtual void   addTrq(double trq[3]);
135 >       /**
136 >         * Returns the previous position of this stuntdouble
137 >         * @return the position of this stuntdouble
138 >         */    
139 >        Vector3d getPrevPos() {
140 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_];
141 >        }
142 >      
143 >        /**
144 >         * Returns the current position of this stuntdouble
145 >         * @return the position of this stuntdouble
146 >         */    
147 >        Vector3d getPos() {
148 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).position[localIndex_];
149 >        }
150  
151 <  virtual void   getI(double I[3][3]);
152 <  virtual void   lab2Body(double vec[3]);
151 >       /**
152 >         * Returns the position of this stuntdouble in specified snapshot
153 >         * @return the position of this stuntdouble
154 >         * @param snapshotNo
155 >         */    
156 >        Vector3d getPos(int snapshotNo) {
157 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_];
158 >        }
159  
160 <  virtual void   getGrad(double grad[6]);
161 <  virtual void   setEuler(double phi, double theta, double psi);
162 <  virtual void   getEulerAngles(double eulers[3]);
160 >       /**
161 >         * Sets  the previous position of this stuntdouble
162 >         * @param pos  new position
163 >         * @see #getPos
164 >         */        
165 >       void setPrevPos(const Vector3d& pos) {
166 >            ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_] = pos;
167 >       }
168 >      
169 >       /**
170 >         * Sets  the current position of this stuntdouble
171 >         * @param pos  new position
172 >         */        
173 >        void setPos(const Vector3d& pos) {
174 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).position[localIndex_] = pos;
175 >        }
176  
177 <  virtual bool isLinear() {return false;}
178 <  virtual int linearAxis() {return -1;}
177 >       /**
178 >         * Sets  the position of this stuntdouble in specified snapshot
179 >         * @param pos position to be set
180 >         * @param snapshotNo
181 >         * @see #getPos
182 >         */        
183 >        void setPos(const Vector3d& pos, int snapshotNo) {
184 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_] = pos;
185 >        }
186 >      
187 >       /**
188 >         * Returns the previous velocity of this stuntdouble
189 >         * @return the velocity of this stuntdouble
190 >         */    
191 >        Vector3d getPrevVel() {
192 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_];
193 >        }
194 >      
195 >        /**
196 >         * Returns the current velocity of this stuntdouble
197 >         * @return the velocity of this stuntdouble
198 >         */    
199 >        Vector3d getVel() {
200 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_];
201 >        }
202  
203 <  virtual double   getZangle();
204 <  virtual void   setZangle(double zAngle);
205 <  virtual void   addZangle(double zAngle);
203 >       /**
204 >         * Returns the velocity of this stuntdouble in specified snapshot
205 >         * @return the velocity of this stuntdouble
206 >         * @param snapshotNo
207 >         */    
208 >         Vector3d getVel(int snapshotNo) {
209 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).velocity[localIndex_];
210 >        }
211  
212 <  virtual void accept(BaseVisitor* v) = 0;
212 >       /**
213 >         * Sets  the previous velocity of this stuntdouble
214 >         * @param vel  new velocity
215 >         * @see #getVel
216 >         */        
217 >       void setPrevVel(const Vector3d& vel) {
218 >            ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_] = vel;
219 >       }
220 >      
221 >       /**
222 >         * Sets  the current velocity of this stuntdouble
223 >         * @param vel  new velocity
224 >         */        
225 >        void setVel(const Vector3d& vel) {
226 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_] = vel;
227 >        }
228  
229 <  void addProperty(GenericData* data);
230 <  void removeProperty(const string& propName);
231 <  GenericData* getProperty(const string& propName);
232 <  
233 < protected:
234 <  StuntDouble(){}
229 >       /**
230 >         * Sets  the velocity of this stuntdouble in specified snapshot
231 >         * @param vel velocity to be set
232 >         * @param snapshotNo
233 >         * @see #getVel
234 >         */        
235 >        void setVel(const Vector3d& vel, int snapshotNo) {
236 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).velocity[localIndex_] = vel;
237 >        }
238  
239 <  //prevent default copy constructor copy information from properties which will cause problem
240 <  StuntDouble(const StuntDouble& sd){
241 <    objType = sd.objType;
242 <  }
243 <  
244 <  int objType;
239 >       /**
240 >         * Returns the previous rotation matrix of this stuntdouble
241 >         * @return the rotation matrix of this stuntdouble
242 >         */    
243 >        RotMat3x3d getPrevA() {
244 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_];
245 >        }
246 >      
247 >        /**
248 >         * Returns the current rotation matrix of this stuntdouble
249 >         * @return the rotation matrix of this stuntdouble
250 >         */    
251 >        RotMat3x3d getA() {
252 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_];
253 >        }
254  
255 <  map<string, GenericData*> properties;
256 < };
255 >       /**
256 >         * Returns the rotation matrix of this stuntdouble in specified snapshot
257 >         *
258 >         * @return the rotation matrix of this stuntdouble
259 >         * @param snapshotNo
260 >         */    
261 >         RotMat3x3d getA(int snapshotNo) {
262 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_];
263 >        }
264  
265 < #endif
265 >       /**
266 >         * Sets  the previous rotation matrix of this stuntdouble
267 >         * @param a  new rotation matrix
268 >         * @see #getA
269 >         */        
270 >       virtual void setPrevA(const RotMat3x3d& a) {
271 >            ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_] = a;
272 >       }
273 >      
274 >       /**
275 >         * Sets  the current rotation matrix of this stuntdouble
276 >         * @param a  new rotation matrix
277 >         */        
278 >        virtual void setA(const RotMat3x3d& a) {
279 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = a;
280 >        }
281 >
282 >       /**
283 >         * Sets  the rotation matrix of this stuntdouble in specified snapshot
284 >         * @param a rotation matrix to be set
285 >         * @param snapshotNo
286 >         * @see #getA
287 >         */        
288 >        virtual void setA(const RotMat3x3d& a, int snapshotNo) {
289 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_] = a;
290 >        }      
291 >
292 >       /**
293 >         * Returns the previous angular momentum of this stuntdouble (body-fixed).
294 >         * @return the angular momentum of this stuntdouble
295 >         */    
296 >        Vector3d getPrevJ() {
297 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_];
298 >        }
299 >      
300 >        /**
301 >         * Returns the current angular momentum of this stuntdouble (body -fixed).
302 >         * @return the angular momentum of this stuntdouble
303 >         */    
304 >        Vector3d getJ() {
305 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_];
306 >        }
307 >
308 >       /**
309 >         * Returns the angular momentum of this stuntdouble in specified snapshot (body-fixed).
310 >         * @return the angular momentum of this stuntdouble
311 >         * @param snapshotNo
312 >         */    
313 >         Vector3d getJ(int snapshotNo) {
314 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).angularMomentum[localIndex_];
315 >        }
316 >
317 >       /**
318 >         * Sets  the previous angular momentum of this stuntdouble (body-fixed).
319 >         * @param angMom  new angular momentum
320 >         * @see #getJ
321 >         */        
322 >       void setPrevJ(const Vector3d& angMom) {
323 >            ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
324 >       }
325 >      
326 >       /**
327 >         * Sets  the current angular momentum of this stuntdouble (body-fixed).
328 >         * @param angMom  new angular momentum
329 >         */        
330 >        void setJ(const Vector3d& angMom) {
331 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
332 >        }
333 >
334 >       /**
335 >         * Sets the angular momentum of this stuntdouble in specified snapshot(body-fixed).
336 >         * @param angMom angular momentum to be set
337 >         * @param snapshotNo
338 >         * @see #getJ
339 >         */        
340 >        void setJ(const Vector3d& angMom, int snapshotNo) {
341 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).angularMomentum[localIndex_] = angMom;
342 >        }
343 >        
344 >       /**
345 >         * Returns the previous quaternion of this stuntdouble
346 >         * @return the quaternion of this stuntdouble
347 >         */    
348 >        Quat4d getPrevQ() {
349 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
350 >        }
351 >      
352 >        /**
353 >         * Returns the current quaternion of this stuntdouble
354 >         * @return the quaternion of this stuntdouble
355 >         */    
356 >        Quat4d getQ() {
357 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
358 >        }
359 >
360 >       /**
361 >         * Returns the quaternion of this stuntdouble in specified snapshot
362 >         * @return the quaternion of this stuntdouble
363 >         * @param snapshotNo
364 >         */    
365 >         Quat4d getQ(int snapshotNo) {
366 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toQuaternion();
367 >        }
368 >
369 >       /**
370 >         * Sets  the previous quaternion of this stuntdouble
371 >         * @param q  new quaternion
372 >         * @note actual storage data is rotation matrix
373 >         */        
374 >       void setPrevQ(const Quat4d& q) {
375 >            ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_] = q;
376 >       }
377 >      
378 >       /**
379 >         * Sets  the current quaternion of this stuntdouble
380 >         * @param q  new quaternion
381 >         * @note actual storage data is rotation matrix
382 >         */        
383 >        void setQ(const Quat4d& q) {
384 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = q;
385 >        }
386 >
387 >       /**
388 >         * Sets  the quaternion of this stuntdouble in specified snapshot
389 >         *
390 >         * @param q quaternion to be set
391 >         * @param snapshotNo
392 >         * @note actual storage data is rotation matrix
393 >         */        
394 >        void setQ(const Quat4d& q, int snapshotNo) {
395 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_] = q;
396 >        }
397 >
398 >       /**
399 >         * Returns the previous euler angles of this stuntdouble
400 >         * @return the euler angles of this stuntdouble
401 >         */    
402 >        Vector3d getPrevEuler() {
403 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
404 >        }
405 >      
406 >        /**
407 >         * Returns the current euler angles of this stuntdouble
408 >         * @return the euler angles of this stuntdouble
409 >         */    
410 >        Vector3d getEuler() {
411 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
412 >        }
413 >
414 >       /**
415 >         * Returns the euler angles of this stuntdouble in specified snapshot.
416 >         * @return the euler angles of this stuntdouble
417 >         * @param snapshotNo
418 >         */    
419 >         Vector3d getEuler(int snapshotNo) {
420 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toEulerAngles();
421 >        }
422 >
423 >       /**
424 >         * Sets  the previous euler angles of this stuntdouble.
425 >         * @param euler  new euler angles
426 >         * @see #getEuler
427 >         * @note actual storage data is rotation matrix        
428 >         */        
429 >       void setPrevEuler(const Vector3d& euler) {
430 >            ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_] = euler;
431 >       }
432 >      
433 >       /**
434 >         * Sets  the current euler angles of this stuntdouble
435 >         * @param euler  new euler angles
436 >         */        
437 >        void setEuler(const Vector3d& euler) {
438 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = euler;
439 >        }
440 >
441 >       /**
442 >         * Sets  the euler angles  of this stuntdouble in specified snapshot
443 >         *
444 >         * @param euler euler angles to be set
445 >         * @param snapshotNo
446 >         * @note actual storage data is rotation matrix                  
447 >         */        
448 >        void setEuler(const Vector3d& euler, int snapshotNo) {
449 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_] = euler;
450 >        }
451 >      
452 >       /**
453 >         * Returns the previous unit vectors of this stuntdouble
454 >         * @return the unit vectors of this stuntdouble
455 >         */    
456 >        Vector3d getPrevUnitVector() {
457 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).unitVector[localIndex_];
458 >        }
459 >      
460 >        /**
461 >         * Returns the current unit vectors of this stuntdouble
462 >         * @return the unit vectors of this stuntdouble
463 >         */    
464 >        Vector3d getUnitVector() {
465 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).unitVector[localIndex_];
466 >        }
467 >
468 >       /**
469 >         * Returns the unit vectors of this stuntdouble in specified snapshot
470 >         *
471 >         * @return the unit vectors of this stuntdouble
472 >         * @param snapshotNo
473 >         */    
474 >         Vector3d getUnitVector(int snapshotNo) {
475 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).unitVector[localIndex_];
476 >        }
477 >
478 >       /**
479 >         * Returns the previous force of this stuntdouble
480 >         * @return the force of this stuntdouble
481 >         */    
482 >        Vector3d getPrevFrc() {
483 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_];
484 >        }
485 >      
486 >        /**
487 >         * Returns the current force of this stuntdouble
488 >         * @return the force of this stuntdouble
489 >         */    
490 >        Vector3d getFrc() {
491 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_];
492 >        }
493 >
494 >       /**
495 >         * Returns the force of this stuntdouble in specified snapshot
496 >         *
497 >         * @return the force of this stuntdouble
498 >         * @param snapshotNo
499 >         */    
500 >         Vector3d getFrc(int snapshotNo) {
501 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_];
502 >        }
503 >
504 >       /**
505 >         * Sets  the previous force of this stuntdouble
506 >         *
507 >         * @param frc  new force
508 >         * @see #getFrc
509 >         */        
510 >       void setPrevFrc(const Vector3d& frc) {
511 >            ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] = frc;
512 >       }
513 >      
514 >       /**
515 >         * Sets  the current force of this stuntdouble
516 >         * @param frc  new force
517 >         */        
518 >        void setFrc(const Vector3d& frc) {
519 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] = frc;
520 >        }
521 >
522 >       /**
523 >         * Sets  the force of this stuntdouble in specified snapshot
524 >         *
525 >         * @param frc force to be set
526 >         * @param snapshotNo
527 >         * @see #getFrc
528 >         */        
529 >        void setFrc(const Vector3d& frc, int snapshotNo) {
530 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_] = frc;
531 >        }
532 >
533 >       /**
534 >         * Adds force into the previous force of this stuntdouble
535 >         *
536 >         * @param frc  new force
537 >         * @see #getFrc
538 >         */        
539 >       void addPrevFrc(const Vector3d& frc) {
540 >            ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] += frc;
541 >       }
542 >      
543 >       /**
544 >         * Adds force into the current force of this stuntdouble
545 >         * @param frc  new force
546 >         */        
547 >        void addFrc(const Vector3d& frc) {
548 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] += frc;
549 >        }
550 >
551 >       /**
552 >         * Adds force into the force of this stuntdouble in specified snapshot
553 >         *
554 >         * @param frc force to be set
555 >         * @param snapshotNo
556 >         * @see #getFrc
557 >         */        
558 >        void addFrc(const Vector3d& frc, int snapshotNo) {
559 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_] += frc;
560 >        }
561 >
562 >       /**
563 >         * Returns the previous torque of this stuntdouble
564 >         * @return the torque of this stuntdouble
565 >         */    
566 >        Vector3d getPrevTrq() {
567 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_];
568 >        }
569 >      
570 >        /**
571 >         * Returns the current torque of this stuntdouble
572 >         * @return the torque of this stuntdouble
573 >         */    
574 >        Vector3d getTrq() {
575 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_];
576 >        }
577 >
578 >       /**
579 >         * Returns the torque of this stuntdouble in specified snapshot
580 >         *
581 >         * @return the torque of this stuntdouble
582 >         * @param snapshotNo
583 >         */    
584 >         Vector3d getTrq(int snapshotNo) {
585 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_];
586 >        }
587 >
588 >       /**
589 >         * Sets  the previous torque of this stuntdouble
590 >         *
591 >         * @param trq  new torque
592 >         * @see #getTrq
593 >         */        
594 >       void setPrevTrq(const Vector3d& trq) {
595 >            ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] = trq;
596 >       }
597 >      
598 >       /**
599 >         * Sets  the current torque of this stuntdouble
600 >         * @param trq  new torque
601 >         */        
602 >        void setTrq(const Vector3d& trq) {
603 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] = trq;
604 >        }
605 >
606 >       /**
607 >         * Sets  the torque of this stuntdouble in specified snapshot
608 >         *
609 >         * @param trq torque to be set
610 >         * @param snapshotNo
611 >         * @see #getTrq
612 >         */        
613 >        void setTrq(const Vector3d& trq, int snapshotNo) {
614 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_] = trq;
615 >        }
616 >
617 >       /**
618 >         * Adds torque into the previous torque of this stuntdouble
619 >         *
620 >         * @param trq  new torque
621 >         * @see #getTrq
622 >         */        
623 >       void addPrevTrq(const Vector3d& trq) {
624 >            ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] += trq;
625 >       }
626 >      
627 >       /**
628 >         * Adds torque into the current torque of this stuntdouble
629 >         * @param trq  new torque
630 >         */        
631 >        void addTrq(const Vector3d& trq) {
632 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] += trq;
633 >        }
634 >
635 >       /**
636 >         * Adds torque into the torque of this stuntdouble in specified snapshot
637 >         *
638 >         * @param trq torque to be add
639 >         * @param snapshotNo
640 >         * @see #getTrq
641 >         */        
642 >        void addTrq(const Vector3d& trq, int snapshotNo) {
643 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_] += trq;
644 >        }      
645 >
646 >
647 >       /**
648 >         * Returns the previous z-angle of this stuntdouble
649 >         * @return the z-angle of this stuntdouble
650 >         */    
651 >        double getPrevZangle() {
652 >            return ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_];
653 >        }
654 >      
655 >        /**
656 >         * Returns the current z-angle of this stuntdouble
657 >         * @return the z-angle of this stuntdouble
658 >         */    
659 >        double getZangle() {
660 >            return ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_];
661 >        }
662 >
663 >       /**
664 >         * Returns the z-angle of this stuntdouble in specified snapshot
665 >         * @return the z-angle of this stuntdouble
666 >         * @param snapshotNo
667 >         */    
668 >         double getZangle(int snapshotNo) {
669 >            return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_];
670 >        }
671 >
672 >       /**
673 >         * Sets  the previous z-angle of this stuntdouble
674 >         * @param angle  new z-angle
675 >         * @see #getZangle
676 >         */        
677 >       void setPrevZangle(double angle) {
678 >            ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_] = angle;
679 >       }
680 >      
681 >       /**
682 >         * Sets  the current z-angle of this stuntdouble
683 >         * @param angle  new z-angle
684 >         */        
685 >        void setZangle(double angle) {
686 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_] = angle;
687 >        }
688 >
689 >       /**
690 >         * Sets  the z-angle of this stuntdouble in specified snapshot
691 >         * @param angle z-angle to be set
692 >         * @param snapshotNo
693 >         * @see #getZangle
694 >         */        
695 >        void setZangle(double angle, int snapshotNo) {
696 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_] = angle;
697 >        }
698 >
699 >       /**
700 >         * Adds z-angle into the previous z-angle of this stuntdouble
701 >         * @param angle  new z-angle
702 >         * @see #getZangle
703 >         */        
704 >       void addPrevZangle(double angle) {
705 >            ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_] += angle;
706 >       }
707 >      
708 >       /**
709 >         * Adds z-angle into the current z-angle of this stuntdouble
710 >         * @param angle  new z-angle
711 >         */        
712 >        void addZangle(double angle) {
713 >            ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_] += angle;
714 >        }
715 >
716 >       /**
717 >         * Adds z-angle into the z-angle of this stuntdouble in specified snapshot
718 >         * @param angle z-angle to be add
719 >         * @param snapshotNo
720 >         * @see #getZangle
721 >         */        
722 >        void addZangle(double angle, int snapshotNo) {
723 >            ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_] += angle;
724 >        }      
725 >
726 >        /** Set the force of this stuntdouble to zero */
727 >        virtual void zeroForces();
728 >       /**
729 >         * Returns the inertia tensor of this stuntdouble
730 >         * @return the inertia tensor of this stuntdouble
731 >         */
732 >        virtual Mat3x3d getI() = 0;
733 >
734 >       /**
735 >         * Returns the gradient of this stuntdouble
736 >         * @return the gradient of this stuntdouble
737 >         */
738 >        virtual std::vector<double> getGrad() = 0;
739 >
740 >       /**
741 >         * Tests the  if this stuntdouble is a  linear rigidbody
742 >         *
743 >         * @return true if this stuntdouble is a  linear rigidbody, otherwise return false
744 >         * @note atom and directional atom will always return false
745 >         *
746 >         * @see #linearAxis
747 >         */        
748 >        bool isLinear() {
749 >            return linear_;
750 >        }
751 >
752 >       /**
753 >         * Returns the linear axis of the rigidbody, atom and directional atom will always return -1
754 >         *
755 >         * @return the linear axis of the rigidbody
756 >         *
757 >         * @see #isLinear
758 >         */
759 >        int linearAxis() {
760 >            return linearAxis_;
761 >        }
762 >
763 >        /** Returns the mass of this stuntdouble */
764 >        double getMass() {
765 >            return mass_;
766 >        }
767 >
768 >        /**
769 >         * Sets the mass of this stuntdoulbe
770 >         * @param mass the mass to be set
771 >         */        
772 >        void setMass(double mass) {
773 >            mass_ = mass;
774 >        }
775 >
776 >        /** Returns the name of this stuntdouble */
777 >        std::string getType();
778 >        
779 >        /** Sets the name of this stuntdouble*/
780 >        void setType(const std::string& name);
781 >
782 >        /**
783 >         * Converts a lab fixed vector to a body fixed vector.
784 >         * @return body fixed vector
785 >         * @param v lab fixed vector
786 >         */
787 >        Vector3d lab2Body(const Vector3d& v);
788 >
789 >        /**
790 >         * Converts a body fixed vector to a lab fixed vector.
791 >         * @return corresponding lab fixed vector
792 >         * @param v body fixed vector
793 >         */
794 >        Vector3d body2Lab(const Vector3d& v);
795 >        /**
796 >         * <p>
797 >         * The purpose of the Visitor Pattern is to encapsulate an operation that you want to perform on
798 >         * the elements of a data structure. In this way, you can change the operation being performed
799 >         * on a structure without the need of changing the classes of the elements that you are operating
800 >         * on. Using a Visitor pattern allows you to decouple the classes for the data structure and the
801 >         * algorithms used upon them
802 >         * </p>
803 >         * @param v visitor
804 >         */      
805 >        virtual void accept(BaseVisitor* v) = 0;
806 >
807 >        //below functions are just forward functions
808 >        /**
809 >         * Adds property into property map
810 >         * @param genData GenericData to be added into PropertyMap
811 >         */
812 >        void addProperty(GenericData* genData);
813 >
814 >        /**
815 >         * Removes property from PropertyMap by name
816 >         * @param propName the name of property to be removed
817 >         */
818 >        void removeProperty(std::string& propName);
819 >
820 >        /**
821 >         * clear all of the properties
822 >         */
823 >        void clearProperties();
824 >
825 >        /**
826 >         * Returns all names of properties
827 >         * @return all names of properties
828 >         */
829 >        std::vector<std::string> getPropertyNames();
830 >
831 >        /**
832 >         * Returns all of the properties in PropertyMap
833 >         * @return all of the properties in PropertyMap
834 >         */      
835 >        std::vector<GenericData*> getProperties();
836 >
837 >        /**
838 >         * Returns property
839 >         * @param propName name of property
840 >         * @return a pointer point to property with propName. If no property named propName
841 >         * exists, return NULL
842 >         */      
843 >        GenericData* getPropertyByName(std::string& propName);
844 >
845 >    protected:
846 >        
847 >        StuntDouble(ObjectType objType, DataStoragePointer storage);
848 >        
849 >        StuntDouble(const StuntDouble& sd);
850 >        StuntDouble& operator=(const StuntDouble& sd);
851 >
852 >        ObjectType objType_;
853 >
854 >        bool linear_;
855 >        int linearAxis_;        
856 >
857 >        DataStoragePointer storage_;
858 >        SnapshotManager* snapshotMan_;
859 >        
860 >        int globalIndex_;
861 >        int localIndex_;
862 >        
863 >    private:
864 >
865 >        std::string name_;
866 >
867 >        double mass_;
868 >        
869 >        PropertyMap properties_;
870 >    };
871 >
872 > }//end namespace oopse
873 > #endif //ifndef _STUNTDOUBLE_HPP_

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines