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

Comparing trunk/OOPSE-2.0/src/primitives/StuntDouble.hpp (file contents):
Revision 1698 by chrisfen, Tue Nov 2 15:28:25 2004 UTC vs.
Revision 2272 by gezelter, Wed Aug 10 19:17:39 2005 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines