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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines