ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/primitives/StuntDouble.hpp
(Generate patch)

Comparing:
trunk/src/primitives/StuntDouble.hpp (file contents), Revision 2 by gezelter, Fri Sep 24 04:16:43 2004 UTC vs.
branches/development/src/primitives/StuntDouble.hpp (file contents), Revision 1839 by gezelter, Fri Jan 25 15:21:04 2013 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. Redistributions of source code must retain the above copyright
10 > *    notice, this list of conditions and the following disclaimer.
11 > *
12 > * 2. Redistributions in binary form must reproduce the above copyright
13 > *    notice, this list of conditions and the following disclaimer in the
14 > *    documentation and/or other materials provided with the
15 > *    distribution.
16 > *
17 > * This software is provided "AS IS," without a warranty of any
18 > * kind. All express or implied conditions, representations and
19 > * warranties, including any implied warranty of merchantability,
20 > * fitness for a particular purpose or non-infringement, are hereby
21 > * excluded.  The University of Notre Dame and its licensors shall not
22 > * be liable for any damages suffered by licensee as a result of
23 > * using, modifying or distributing the software or its
24 > * derivatives. In no event will the University of Notre Dame or its
25 > * licensors be liable for any lost revenue, profit or data, or for
26 > * direct, indirect, special, consequential, incidental or punitive
27 > * damages, however caused and regardless of the theory of liability,
28 > * arising out of the use of or inability to use software, even if the
29 > * University of Notre Dame has been advised of the possibility of
30 > * such damages.
31 > *
32 > * SUPPORT OPEN SCIENCE!  If you use OpenMD or its source code in your
33 > * research, please cite the appropriate papers when you publish your
34 > * work.  Good starting points are:
35 > *                                                                      
36 > * [1]  Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).            
37 > * [2]  Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).          
38 > * [3]  Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).          
39 > * [4]  Kuang & Gezelter,  J. Chem. Phys. 133, 164101 (2010).
40 > * [5]  Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 > */
42 >
43 > /**
44 > * @file StuntDouble.hpp
45 > * @author    tlin
46 > * @date  10/22/2004
47 > * @version 1.0
48 > */
49 >  
50 > #ifndef PRIMITIVES_STUNTDOUBLE_HPP
51 > #define PRIMITIVES_STUNTDOUBLE_HPP
52  
53 < #include <map>
5 < #include "GenericData.hpp"
53 > #include <vector>
54  
55 < #define OT_ATOM 0
56 < #define OT_DATOM 1
57 < #define OT_RIGIDBODY 2
55 > #include "visitors/BaseVisitor.hpp"
56 > #include "math/Quaternion.hpp"
57 > #include "math/SquareMatrix3.hpp"
58 > #include "math/Vector3.hpp"
59 > #include "utils/PropertyMap.hpp"
60 > #include "brains/Snapshot.hpp"
61 > #include "brains/SnapshotManager.hpp"
62 > namespace OpenMD{
63  
11 using namespace std;
12 class BaseVisitor;
64  
65 < class StuntDouble {
66 < public:
67 <  virtual ~StuntDouble();
68 <  
69 <  int getObjType();
70 <  
71 <  bool isAtom(){
72 <    return objType == OT_ATOM || objType == OT_DATOM;
73 <  }
65 >  
66 >  /**
67 >   * @class StuntDouble StuntDouble.hpp "Primitives/StuntDouble.hpp"
68 >   * @brief
69 >   *     "Don't move, or you're dead! Stand up! Captain, we've got them!"
70 >   *
71 >   *     "Spectacular stunt, my friends, but all for naught. Turn around
72 >   *      please. Ha. What a pity. What a pity. So, Princess, you thought
73 >   *      you could outwit the imperious forces of...."
74 >   *
75 >   *     "You idiots! These are not them. You've captured their stunt
76 >   *      doubles! Search the area. Find them! Find them!"
77 >   *
78 >   * StuntDouble is a very strange idea.  A StuntDouble stands in for
79 >   * some object that can be manipulated by the Integrators or
80 >   * Minimizers.  Some of the manipulable objects are Atoms, some are
81 >   * DirectionalAtoms, and some are RigidBodies.  StuntDouble
82 >   * provides an interface for the Integrators and Minimizers to use,
83 >   * and does some preliminary sanity checking so that the program
84 >   * doesn't try to do something stupid like torque an Atom (The
85 >   * quotes above are from Spaceballs...)
86 >   *
87 >   * @note the dynamic data of stuntDouble will be stored outside of the class
88 >   */
89 >  class StuntDouble{
90 >  public:    
91  
92 <  bool isDirectionalAtom(){
93 <    return objType == OT_DATOM;
94 <  }
92 >    enum ObjectType{
93 >      otAtom,
94 >      otDAtom,
95 >      otRigidBody
96 >    };
97  
98 <  bool isRigidBody(){
99 <    return objType == OT_RIGIDBODY;
100 <  }
98 >    virtual ~StuntDouble();
99 >        
100 >    /**
101 >     * Returns the global index of this stuntDouble.
102 >     * @return  the global index of this stuntDouble
103 >     */
104 >    int getGlobalIndex() {
105 >      return globalIndex_;
106 >    }
107  
108 <  bool isDirectional(){
109 <    return isDirectionalAtom() || isRigidBody();
110 <  }
108 >    /**
109 >     * Sets the global index of this stuntDouble.
110 >     * @param index new global index to be set
111 >     */
112 >    void setGlobalIndex(int index) {
113 >      globalIndex_ = index;
114 >    }
115 >    
116 >    /**
117 >     * Returns the local index of this stuntDouble
118 >     * @return the local index of this stuntDouble
119 >     */
120 >    int getLocalIndex() {
121 >      return localIndex_;
122 >    }
123  
124 <  virtual double getMass(void);
125 <  
126 <  virtual void   getPos(double pos[3]);
127 <  virtual void   setPos(double pos[3]);
128 <  
129 <  virtual void   getVel(double vel[3]);
130 <  virtual void   setVel(double vel[3]);
131 <  
132 <  virtual void   getFrc(double frc[3]);
133 <  virtual void   addFrc(double frc[3]);
124 >    /**
125 >     * Sets the local index of this stuntDouble
126 >     * @param index new index to be set
127 >     */        
128 >    void setLocalIndex(int index) {
129 >      localIndex_ = index;
130 >    }
131 >    
132 >    int getGlobalIntegrableObjectIndex(){
133 >      return globalIntegrableObjectIndex_;
134 >    }
135 >    void setGlobalIntegrableObjectIndex(int index) {
136 >      globalIntegrableObjectIndex_ = index;
137 >    }
138  
139 <  virtual void   getA(double A[3][3]);
140 <  virtual void   setA(double A[3][3]);
139 >    /**
140 >     * Sets the Snapshot Manager of this stuntDouble
141 >     */
142 >    void setSnapshotManager(SnapshotManager* sman) {
143 >      snapshotMan_ = sman;
144 >    }
145  
146 <  virtual void   getJ(double j[3]);
147 <  virtual void   setJ(double j[3]);
146 >    /**
147 >     * Tests if this stuntDouble is an atom
148 >     * @return true is this stuntDouble is an atom(or a directional atom), return false otherwise
149 >     */
150 >    bool isAtom(){
151 >      return objType_ == otAtom || 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 an directional atom
156 >     * @return true if this stuntDouble is an directional atom, return false otherwise
157 >     */
158 >    bool isDirectionalAtom(){
159 >      return objType_ == otDAtom;
160 >    }
161  
162 <  virtual void setType(char* type) = 0;
163 <  virtual char* getType() = 0;
164 <  
162 >    /**
163 >     * Tests if this stuntDouble is a rigid body.
164 >     * @return true if this stuntDouble is a rigid body, otherwise return false
165 >     */
166 >    bool isRigidBody(){
167 >      return objType_ == otRigidBody;
168 >    }
169  
170 <  virtual void   getTrq(double trq[3]);
171 <  virtual void   addTrq(double trq[3]);
170 >    /**
171 >     * Tests if this stuntDouble is a directional one.
172 >     * @return true is this stuntDouble is a directional atom or a rigid body, return false otherwise
173 >     */
174 >    bool isDirectional(){
175 >      return isDirectionalAtom() || isRigidBody();
176 >    }
177  
178 <  virtual void   getI(double I[3][3]);
179 <  virtual void   lab2Body(double vec[3]);
178 >    /**
179 >     * Freezes out all velocity, angular velocity, forces and torques
180 >     * on this StuntDouble.  Also computes the number of frozen degrees
181 >     * of freedom.
182 >     * @return the total number of frozen degrees of freedom
183 >     */  
184 >    int freeze() {
185 >      
186 >      int fdf = 3;
187  
188 <  virtual void   getGrad(double grad[6]);
189 <  virtual void   setEuler(double phi, double theta, double psi);
190 <  virtual void   getEulerAngles(double eulers[3]);
188 >      setVel(V3Zero);
189 >      setFrc(V3Zero);
190 >      if (isDirectional()){
191 >        setJ(V3Zero);
192 >        setTrq(V3Zero);
193 >        if (isLinear())
194 >          fdf +=2;
195 >        else
196 >          fdf +=3;        
197 >      }      
198 >      return fdf;
199 >    }
200  
201 <  virtual bool isLinear() {return false;}
202 <  virtual int linearAxis() {return -1;}
201 >    /**
202 >     * Returns the previous position of this stuntDouble
203 >     * @return the position of this stuntDouble
204 >     */    
205 >    Vector3d getPrevPos() {
206 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_];
207 >    }
208 >      
209 >    /**
210 >     * Returns the current position of this stuntDouble
211 >     * @return the position of this stuntDouble
212 >     */    
213 >    Vector3d getPos() {
214 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).position[localIndex_];
215 >    }
216  
217 <  virtual double   getZangle();
218 <  virtual void   setZangle(double zAngle);
219 <  virtual void   addZangle(double zAngle);
217 >    /**
218 >     * Returns the position of this stuntDouble in specified snapshot
219 >     * @return the position of this stuntDouble
220 >     * @param snapshotNo
221 >     */    
222 >    Vector3d getPos(int snapshotNo) {
223 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_];
224 >    }
225  
226 <  virtual void accept(BaseVisitor* v) = 0;
226 >    /**
227 >     * Sets  the previous position of this stuntDouble
228 >     * @param pos  new position
229 >     * @see #getPos
230 >     */        
231 >    void setPrevPos(const Vector3d& pos) {
232 >      ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_] = pos;
233 >    }
234 >      
235 >    /**
236 >     * Sets  the current position of this stuntDouble
237 >     * @param pos  new position
238 >     */        
239 >    void setPos(const Vector3d& pos) {
240 >      DataStorage&  data = snapshotMan_->getCurrentSnapshot()->*storage_;
241 >      data.position[localIndex_] = pos;
242 >      //((snapshotMan_->getCurrentSnapshot())->*storage_).position[localIndex_] = pos;
243 >    }
244  
245 <  void addProperty(GenericData* data);
246 <  void removeProperty(const string& propName);
247 <  GenericData* getProperty(const string& propName);
248 <  
249 < protected:
250 <  StuntDouble(){}
245 >    /**
246 >     * Sets  the position of this stuntDouble in specified snapshot
247 >     * @param pos position to be set
248 >     * @param snapshotNo
249 >     * @see #getPos
250 >     */        
251 >    void setPos(const Vector3d& pos, int snapshotNo) {
252  
253 <  //prevent default copy constructor copy information from properties which will cause problem
87 <  StuntDouble(const StuntDouble& sd){
88 <    objType = sd.objType;
89 <  }
90 <  
91 <  int objType;
253 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_] = pos;
254  
255 <  map<string, GenericData*> properties;
256 < };
255 >    }
256 >      
257 >    /**
258 >     * Returns the previous velocity of this stuntDouble
259 >     * @return the velocity of this stuntDouble
260 >     */    
261 >    Vector3d getPrevVel() {
262 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_];
263 >    }
264 >      
265 >    /**
266 >     * Returns the current velocity of this stuntDouble
267 >     * @return the velocity of this stuntDouble
268 >     */    
269 >    Vector3d getVel() {
270 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_];
271 >    }
272  
273 < #endif
273 >    /**
274 >     * Returns the velocity of this stuntDouble in specified snapshot
275 >     * @return the velocity of this stuntDouble
276 >     * @param snapshotNo
277 >     */    
278 >    Vector3d getVel(int snapshotNo) {
279 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).velocity[localIndex_];
280 >    }
281 >
282 >    /**
283 >     * Sets  the previous velocity of this stuntDouble
284 >     * @param vel  new velocity
285 >     * @see #getVel
286 >     */        
287 >    void setPrevVel(const Vector3d& vel) {
288 >      ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_] = vel;
289 >    }
290 >      
291 >    /**
292 >     * Sets  the current velocity of this stuntDouble
293 >     * @param vel  new velocity
294 >     */        
295 >    void setVel(const Vector3d& vel) {
296 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_] = vel;
297 >    }
298 >
299 >    /**
300 >     * Sets  the velocity of this stuntDouble in specified snapshot
301 >     * @param vel velocity to be set
302 >     * @param snapshotNo
303 >     * @see #getVel
304 >     */        
305 >    void setVel(const Vector3d& vel, int snapshotNo) {
306 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).velocity[localIndex_] = vel;
307 >    }
308 >
309 >    /**
310 >     * Returns the previous rotation matrix of this stuntDouble
311 >     * @return the rotation matrix of this stuntDouble
312 >     */    
313 >    RotMat3x3d getPrevA() {
314 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_];
315 >    }
316 >      
317 >    /**
318 >     * Returns the current rotation matrix of this stuntDouble
319 >     * @return the rotation matrix of this stuntDouble
320 >     */    
321 >    RotMat3x3d getA() {
322 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_];
323 >    }
324 >
325 >    /**
326 >     * Returns the rotation matrix of this stuntDouble in specified snapshot
327 >     *
328 >     * @return the rotation matrix of this stuntDouble
329 >     * @param snapshotNo
330 >     */    
331 >    RotMat3x3d getA(int snapshotNo) {
332 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_];
333 >    }
334 >
335 >    /**
336 >     * Sets  the previous rotation matrix of this stuntDouble
337 >     * @param a  new rotation matrix
338 >     * @see #getA
339 >     */        
340 >    virtual void setPrevA(const RotMat3x3d& a) {
341 >      ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_] = a;
342 >    }
343 >      
344 >    /**
345 >     * Sets  the current rotation matrix of this stuntDouble
346 >     * @param a  new rotation matrix
347 >     */        
348 >    virtual void setA(const RotMat3x3d& a) {
349 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = a;
350 >    }
351 >
352 >    /**
353 >     * Sets  the rotation matrix of this stuntDouble in specified snapshot
354 >     * @param a rotation matrix to be set
355 >     * @param snapshotNo
356 >     * @see #getA
357 >     */        
358 >    virtual void setA(const RotMat3x3d& a, int snapshotNo) {
359 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_] = a;
360 >    }      
361 >
362 >    /**
363 >     * Returns the previous angular momentum of this stuntDouble (body-fixed).
364 >     * @return the angular momentum of this stuntDouble
365 >     */    
366 >    Vector3d getPrevJ() {
367 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_];
368 >    }
369 >      
370 >    /**
371 >     * Returns the current angular momentum of this stuntDouble (body -fixed).
372 >     * @return the angular momentum of this stuntDouble
373 >     */    
374 >    Vector3d getJ() {
375 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_];
376 >    }
377 >
378 >    /**
379 >     * Returns the angular momentum of this stuntDouble in specified snapshot (body-fixed).
380 >     * @return the angular momentum of this stuntDouble
381 >     * @param snapshotNo
382 >     */    
383 >    Vector3d getJ(int snapshotNo) {
384 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).angularMomentum[localIndex_];
385 >    }
386 >
387 >    /**
388 >     * Sets  the previous angular momentum of this stuntDouble (body-fixed).
389 >     * @param angMom  new angular momentum
390 >     * @see #getJ
391 >     */        
392 >    void setPrevJ(const Vector3d& angMom) {
393 >      ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
394 >    }
395 >      
396 >    /**
397 >     * Sets  the current angular momentum of this stuntDouble (body-fixed).
398 >     * @param angMom  new angular momentum
399 >     */        
400 >    void setJ(const Vector3d& angMom) {
401 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
402 >    }
403 >
404 >    /**
405 >     * Sets the angular momentum of this stuntDouble in specified snapshot(body-fixed).
406 >     * @param angMom angular momentum to be set
407 >     * @param snapshotNo
408 >     * @see #getJ
409 >     */        
410 >    void setJ(const Vector3d& angMom, int snapshotNo) {
411 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).angularMomentum[localIndex_] = angMom;
412 >    }
413 >    
414 >    /**
415 >     * Returns system Center of Mass for stuntDouble frame from snapshot
416 >     *
417 >     */
418 >    Vector3d getCOM(){
419 >      return (snapshotMan_->getCurrentSnapshot())->getCOM();
420 >    }
421 >    
422 >    /**
423 >      * Returns system Center of Mass velocity for stuntDouble frame from snapshot
424 >     *
425 >     */
426 >    
427 >    Vector3d getCOMvel(){
428 >      return (snapshotMan_->getCurrentSnapshot())->getCOMvel();
429 >    }
430 >    
431 >    /**
432 >      * Returns system Center of Mass angular momentum for stuntDouble frame from snapshot
433 >     *
434 >     */
435 >    Vector3d getCOMw(){
436 >      return (snapshotMan_->getCurrentSnapshot())->getCOMw();
437 >    }
438 >    
439 > /**
440 >     * Returns system Center of Mass for stuntDouble frame from snapshot
441 >     *
442 >     */
443 >    Vector3d getCOM(int snapshotNo){
444 >      return (snapshotMan_->getSnapshot(snapshotNo))->getCOM();
445 >    }
446 >    
447 >    /**
448 >      * Returns system Center of Mass velocity for stuntDouble frame from snapshot
449 >     *
450 >     */
451 >    
452 >    Vector3d getCOMvel(int snapshotNo){
453 >      return (snapshotMan_->getSnapshot(snapshotNo))->getCOMvel();
454 >    }
455 >    
456 >    /**
457 >      * Returns system Center of Mass angular momentum for stuntDouble frame from snapshot
458 >     *
459 >     */
460 >    Vector3d getCOMw(int snapshotNo){
461 >      return (snapshotMan_->getSnapshot(snapshotNo))->getCOMw();
462 >    }
463 >
464 >    /**
465 >     * Returns the previous quaternion of this stuntDouble
466 >     * @return the quaternion of this stuntDouble
467 >     */    
468 >    Quat4d getPrevQ() {
469 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
470 >    }
471 >      
472 >    /**
473 >     * Returns the current quaternion of this stuntDouble
474 >     * @return the quaternion of this stuntDouble
475 >     */    
476 >    Quat4d getQ() {
477 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
478 >    }
479 >
480 >    /**
481 >     * Returns the quaternion of this stuntDouble in specified snapshot
482 >     * @return the quaternion of this stuntDouble
483 >     * @param snapshotNo
484 >     */    
485 >    Quat4d getQ(int snapshotNo) {
486 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toQuaternion();
487 >    }
488 >
489 >    /**
490 >     * Sets  the previous quaternion of this stuntDouble
491 >     * @param q  new quaternion
492 >     * @note actual storage data is rotation matrix
493 >     */        
494 >    void setPrevQ(const Quat4d& q) {
495 >      setPrevA(q);
496 >    }
497 >      
498 >    /**
499 >     * Sets  the current quaternion of this stuntDouble
500 >     * @param q  new quaternion
501 >     * @note actual storage data is rotation matrix
502 >     */        
503 >    void setQ(const Quat4d& q) {
504 >      setA(q);
505 >    }
506 >
507 >    /**
508 >     * Sets  the quaternion of this stuntDouble in specified snapshot
509 >     *
510 >     * @param q quaternion to be set
511 >     * @param snapshotNo
512 >     * @note actual storage data is rotation matrix
513 >     */        
514 >    void setQ(const Quat4d& q, int snapshotNo) {
515 >      setA(q, snapshotNo);
516 >    }
517 >
518 >    /**
519 >     * Returns the previous euler angles of this stuntDouble
520 >     * @return the euler angles of this stuntDouble
521 >     */    
522 >    Vector3d getPrevEuler() {
523 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
524 >    }
525 >      
526 >    /**
527 >     * Returns the current euler angles of this stuntDouble
528 >     * @return the euler angles of this stuntDouble
529 >     */    
530 >    Vector3d getEuler() {
531 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
532 >    }
533 >
534 >    /**
535 >     * Returns the euler angles of this stuntDouble in specified snapshot.
536 >     * @return the euler angles of this stuntDouble
537 >     * @param snapshotNo
538 >     */    
539 >    Vector3d getEuler(int snapshotNo) {
540 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toEulerAngles();
541 >    }
542 >
543 >    /**
544 >     * Sets  the previous euler angles of this stuntDouble.
545 >     * @param euler  new euler angles
546 >     * @see #getEuler
547 >     * @note actual storage data is rotation matrix        
548 >     */        
549 >    void setPrevEuler(const Vector3d& euler) {
550 >      ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_] = euler;
551 >    }
552 >      
553 >    /**
554 >     * Sets  the current euler angles of this stuntDouble
555 >     * @param euler  new euler angles
556 >     */        
557 >    void setEuler(const Vector3d& euler) {
558 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = euler;
559 >    }
560 >
561 >    /**
562 >     * Sets  the euler angles  of this stuntDouble in specified snapshot
563 >     *
564 >     * @param euler euler angles to be set
565 >     * @param snapshotNo
566 >     * @note actual storage data is rotation matrix                  
567 >     */        
568 >    void setEuler(const Vector3d& euler, int snapshotNo) {
569 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_] = euler;
570 >    }
571 >
572 >    /**
573 >     * Returns the previous dipole vector of this stuntDouble
574 >     * @return the dipole vector of this stuntDouble
575 >     */    
576 >    Vector3d getPrevDipole() {
577 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).dipole[localIndex_];
578 >    }
579 >    
580 >    /**
581 >     * Returns the current dipole vector of this stuntDouble
582 >     * @return the dipole vector of this stuntDouble
583 >     */    
584 >    Vector3d getDipole() {
585 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).dipole[localIndex_];
586 >    }
587 >    
588 >    /**
589 >     * Returns the dipole vector of this stuntDouble in specified snapshot
590 >     *
591 >     * @return the dipole vector of this stuntDouble
592 >     * @param snapshotNo
593 >     */    
594 >    Vector3d getDipole(int snapshotNo) {
595 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).dipole[localIndex_];
596 >    }
597 >
598 >
599 >    /**
600 >     * Returns the previous quadrupole tensor of this stuntDouble
601 >     * @return the quadrupole tensor of this stuntDouble
602 >     */    
603 >    Mat3x3d getPrevQuadrupole() {
604 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).quadrupole[localIndex_];
605 >    }
606 >    
607 >    /**
608 >     * Returns the current quadrupole tensor of this stuntDouble
609 >     * @return the quadrupole tensor of this stuntDouble
610 >     */    
611 >    Mat3x3d getQuadrupole() {
612 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).quadrupole[localIndex_];
613 >    }
614 >    
615 >    /**
616 >     * Returns the quadrupole tensor of this stuntDouble in specified snapshot
617 >     *
618 >     * @return the quadrupole tensor of this stuntDouble
619 >     * @param snapshotNo
620 >     */    
621 >    Mat3x3d getQuadrupole(int snapshotNo) {
622 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).quadrupole[localIndex_];
623 >    }
624 >        
625 >    /**
626 >     * Returns the previous force of this stuntDouble
627 >     * @return the force of this stuntDouble
628 >     */    
629 >    Vector3d getPrevFrc() {
630 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_];
631 >    }
632 >      
633 >    /**
634 >     * Returns the current force of this stuntDouble
635 >     * @return the force of this stuntDouble
636 >     */    
637 >    Vector3d getFrc() {
638 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_];
639 >    }
640 >
641 >    /**
642 >     * Returns the force of this stuntDouble in specified snapshot
643 >     *
644 >     * @return the force of this stuntDouble
645 >     * @param snapshotNo
646 >     */    
647 >    Vector3d getFrc(int snapshotNo) {
648 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_];
649 >    }
650 >
651 >    /**
652 >     * Sets  the previous force of this stuntDouble
653 >     *
654 >     * @param frc  new force
655 >     * @see #getFrc
656 >     */        
657 >    void setPrevFrc(const Vector3d& frc) {
658 >      ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] = frc;
659 >    }
660 >      
661 >    /**
662 >     * Sets  the current force of this stuntDouble
663 >     * @param frc  new force
664 >     */        
665 >    void setFrc(const Vector3d& frc) {
666 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] = frc;
667 >    }
668 >
669 >    /**
670 >     * Sets  the force of this stuntDouble in specified snapshot
671 >     *
672 >     * @param frc force to be set
673 >     * @param snapshotNo
674 >     * @see #getFrc
675 >     */        
676 >    void setFrc(const Vector3d& frc, int snapshotNo) {
677 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_] = frc;
678 >    }
679 >
680 >    /**
681 >     * Adds force into the previous force of this stuntDouble
682 >     *
683 >     * @param frc  new force
684 >     * @see #getFrc
685 >     */        
686 >    void addPrevFrc(const Vector3d& frc) {
687 >      ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] += frc;
688 >    }
689 >      
690 >    /**
691 >     * Adds force into the current force of this stuntDouble
692 >     * @param frc  new force
693 >     */        
694 >    void addFrc(const Vector3d& frc) {
695 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] += frc;
696 >    }
697 >
698 >    /**
699 >     * Adds force into the force of this stuntDouble in specified snapshot
700 >     *
701 >     * @param frc force to be set
702 >     * @param snapshotNo
703 >     * @see #getFrc
704 >     */        
705 >    void addFrc(const Vector3d& frc, int snapshotNo) {
706 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_] += frc;
707 >    }
708 >
709 >    /**
710 >     * Returns the previous torque of this stuntDouble
711 >     * @return the torque of this stuntDouble
712 >     */    
713 >    Vector3d getPrevTrq() {
714 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_];
715 >    }
716 >      
717 >    /**
718 >     * Returns the current torque of this stuntDouble
719 >     * @return the torque of this stuntDouble
720 >     */    
721 >    Vector3d getTrq() {
722 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_];
723 >    }
724 >
725 >    /**
726 >     * Returns the torque of this stuntDouble in specified snapshot
727 >     *
728 >     * @return the torque of this stuntDouble
729 >     * @param snapshotNo
730 >     */    
731 >    Vector3d getTrq(int snapshotNo) {
732 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_];
733 >    }
734 >
735 >    /**
736 >     * Sets  the previous torque of this stuntDouble
737 >     *
738 >     * @param trq  new torque
739 >     * @see #getTrq
740 >     */        
741 >    void setPrevTrq(const Vector3d& trq) {
742 >      ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] = trq;
743 >    }
744 >      
745 >    /**
746 >     * Sets  the current torque of this stuntDouble
747 >     * @param trq  new torque
748 >     */        
749 >    void setTrq(const Vector3d& trq) {
750 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] = trq;
751 >    }
752 >
753 >    /**
754 >     * Sets  the torque of this stuntDouble in specified snapshot
755 >     *
756 >     * @param trq torque to be set
757 >     * @param snapshotNo
758 >     * @see #getTrq
759 >     */        
760 >    void setTrq(const Vector3d& trq, int snapshotNo) {
761 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_] = trq;
762 >    }
763 >
764 >    /**
765 >     * Adds torque into the previous torque of this stuntDouble
766 >     *
767 >     * @param trq  new torque
768 >     * @see #getTrq
769 >     */        
770 >    void addPrevTrq(const Vector3d& trq) {
771 >      ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] += trq;
772 >    }
773 >      
774 >    /**
775 >     * Adds torque into the current torque of this stuntDouble
776 >     * @param trq  new torque
777 >     */        
778 >    void addTrq(const Vector3d& trq) {
779 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] += trq;
780 >    }
781 >
782 >    /**
783 >     * Adds torque into the torque of this stuntDouble in specified snapshot
784 >     *
785 >     * @param trq torque to be add
786 >     * @param snapshotNo
787 >     * @see #getTrq
788 >     */        
789 >    void addTrq(const Vector3d& trq, int snapshotNo) {
790 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_] += trq;
791 >    }      
792 >
793 >
794 >
795 >    /**
796 >     * Returns the previous particlePot of this stuntDouble
797 >     * @return the particlePot of this stuntDouble
798 >     */    
799 >    RealType getPrevParticlePot() {
800 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).particlePot[localIndex_];
801 >    }
802 >      
803 >    /**
804 >     * Returns the current particlePot of this stuntDouble
805 >     * @return the particlePot of this stuntDouble
806 >     */    
807 >    RealType getParticlePot() {
808 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).particlePot[localIndex_];
809 >    }
810 >
811 >    /**
812 >     * Returns the particlePot of this stuntDouble in specified snapshot
813 >     *
814 >     * @return the particlePot of this stuntDouble
815 >     * @param snapshotNo
816 >     */    
817 >    RealType getParticlePot(int snapshotNo) {
818 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).particlePot[localIndex_];
819 >    }
820 >
821 >    /**
822 >     * Sets  the previous particlePot of this stuntDouble
823 >     *
824 >     * @param particlePot  new particlePot
825 >     * @see #getParticlePot
826 >     */        
827 >    void setPrevParticlePot(const RealType& particlePot) {
828 >      ((snapshotMan_->getPrevSnapshot())->*storage_).particlePot[localIndex_] = particlePot;
829 >    }
830 >      
831 >    /**
832 >     * Sets  the current particlePot of this stuntDouble
833 >     * @param particlePot  new particlePot
834 >     */        
835 >    void setParticlePot(const RealType& particlePot) {
836 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).particlePot[localIndex_] = particlePot;
837 >    }
838 >
839 >    /**
840 >     * Sets  the particlePot of this stuntDouble in specified snapshot
841 >     *
842 >     * @param particlePot particlePot to be set
843 >     * @param snapshotNo
844 >     * @see #getParticlePot
845 >     */        
846 >    void setParticlePot(const RealType& particlePot, int snapshotNo) {
847 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).particlePot[localIndex_] = particlePot;
848 >    }
849 >
850 >    /**
851 >     * Adds particlePot into the previous particlePot of this stuntDouble
852 >     *
853 >     * @param particlePot  new particlePot
854 >     * @see #getParticlePot
855 >     */        
856 >    void addPrevParticlePot(const RealType& particlePot) {
857 >      ((snapshotMan_->getPrevSnapshot())->*storage_).particlePot[localIndex_] += particlePot;
858 >    }
859 >      
860 >    /**
861 >     * Adds particlePot into the current particlePot of this stuntDouble
862 >     * @param particlePot  new particlePot
863 >     */        
864 >    void addParticlePot(const RealType& particlePot) {
865 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).particlePot[localIndex_] += particlePot;
866 >    }
867 >
868 >    /**
869 >     * Adds particlePot into the particlePot of this stuntDouble in specified snapshot
870 >     *
871 >     * @param particlePot particlePot to be add
872 >     * @param snapshotNo
873 >     * @see #getParticlePot
874 >     */        
875 >    void addParticlePot(const RealType& particlePot, int snapshotNo) {
876 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).particlePot[localIndex_] += particlePot;
877 >    }      
878 >
879 >    /**
880 >     * Returns the previous fluctuating charge of this stuntDouble
881 >     * @return the fluctuating charge of this stuntDouble
882 >     */    
883 >    RealType getPrevFlucQPos() {
884 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).flucQPos[localIndex_];
885 >    }
886 >      
887 >    /**
888 >     * Returns the current fluctuating charge of this stuntDouble
889 >     * @return the fluctuating charge of this stuntDouble
890 >     */    
891 >    RealType getFlucQPos() {
892 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQPos[localIndex_];
893 >    }
894 >
895 >    /**
896 >     * Returns the fluctuating charge of this stuntDouble in specified snapshot
897 >     * @return the fluctuating charge of this stuntDouble
898 >     * @param snapshotNo
899 >     */    
900 >    RealType getFlucQPos(int snapshotNo) {
901 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQPos[localIndex_];
902 >    }
903 >
904 >    /**
905 >     * Sets  the previous fluctuating charge of this stuntDouble
906 >     * @param charge  new fluctuating charge
907 >     * @see #getFlucQPos
908 >     */        
909 >    void setPrevFlucQPos(RealType charge) {
910 >      ((snapshotMan_->getPrevSnapshot())->*storage_).flucQPos[localIndex_] = charge;
911 >    }
912 >      
913 >    /**
914 >     * Sets  the current fluctuating charge of this stuntDouble
915 >     * @param charge  new fluctuating charge
916 >     */        
917 >    void setFlucQPos(RealType charge) {
918 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQPos[localIndex_] = charge;
919 >    }
920 >
921 >    /**
922 >     * Sets  the fluctuating charge of this stuntDouble in specified snapshot
923 >     * @param charge fluctuating charge to be set
924 >     * @param snapshotNo
925 >     * @see #getFlucQPos
926 >     */        
927 >    void setFlucQPos(RealType charge, int snapshotNo) {
928 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQPos[localIndex_] = charge;
929 >    }
930 >
931 >    /**
932 >     * Adds fluctuating charge into the previous fluctuating charge of this stuntDouble
933 >     * @param charge  new fluctuating charge
934 >     * @see #getFlucQPos
935 >     */        
936 >    void addPrevFlucQPos(RealType charge) {
937 >      ((snapshotMan_->getPrevSnapshot())->*storage_).flucQPos[localIndex_] += charge;
938 >    }
939 >      
940 >    /**
941 >     * Adds fluctuating charge into the current fluctuating charge of this stuntDouble
942 >     * @param charge  new fluctuating charge
943 >     */        
944 >    void addFlucQPos(RealType charge) {
945 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQPos[localIndex_] += charge;
946 >    }
947 >
948 >    /**
949 >     * Adds fluctuating charge into the fluctuating charge of this stuntDouble in specified snapshot
950 >     * @param charge fluctuating charge to be add
951 >     * @param snapshotNo
952 >     * @see #getFlucQPos
953 >     */        
954 >    void addflucQPos(RealType charge, int snapshotNo) {
955 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQPos[localIndex_] += charge;
956 >    }      
957 >
958 >
959 >    /**
960 >     * Returns the previous charge velocity of this stuntDouble
961 >     * @return the charge velocity of this stuntDouble
962 >     */    
963 >    RealType getPrevFlucQVel() {
964 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).flucQVel[localIndex_];
965 >    }
966 >      
967 >    /**
968 >     * Returns the current charge velocity of this stuntDouble
969 >     * @return the charge velocity of this stuntDouble
970 >     */    
971 >    RealType getFlucQVel() {
972 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQVel[localIndex_];
973 >    }
974 >
975 >    /**
976 >     * Returns the charge velocity of this stuntDouble in specified snapshot
977 >     * @return the charge velocity of this stuntDouble
978 >     * @param snapshotNo
979 >     */    
980 >    RealType getFlucQVel(int snapshotNo) {
981 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQVel[localIndex_];
982 >    }
983 >
984 >    /**
985 >     * Sets  the previous charge velocity of this stuntDouble
986 >     * @param cvel  new charge velocity
987 >     * @see #getFlucQVel
988 >     */        
989 >    void setPrevFlucQVel(RealType cvel) {
990 >      ((snapshotMan_->getPrevSnapshot())->*storage_).flucQVel[localIndex_] = cvel;
991 >    }
992 >      
993 >    /**
994 >     * Sets  the current charge velocity of this stuntDouble
995 >     * @param cvel  new charge velocity
996 >     */        
997 >    void setFlucQVel(RealType cvel) {
998 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQVel[localIndex_] = cvel;
999 >    }
1000 >
1001 >    /**
1002 >     * Sets  the charge velocity of this stuntDouble in specified snapshot
1003 >     * @param cvel charge velocity to be set
1004 >     * @param snapshotNo
1005 >     * @see #getFlucQVel
1006 >     */        
1007 >    void setFlucQVel(RealType cvel, int snapshotNo) {
1008 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQVel[localIndex_] = cvel;
1009 >    }
1010 >
1011 >    /**
1012 >     * Adds charge velocity into the previous charge velocity of this stuntDouble
1013 >     * @param cvel  new charge velocity
1014 >     * @see #getFlucQVel
1015 >     */        
1016 >    void addPrevFlucQVel(RealType cvel) {
1017 >      ((snapshotMan_->getPrevSnapshot())->*storage_).flucQVel[localIndex_] += cvel;
1018 >    }
1019 >      
1020 >    /**
1021 >     * Adds charge velocity into the current charge velocity of this stuntDouble
1022 >     * @param cvel  new charge velocity
1023 >     */        
1024 >    void addFlucQVel(RealType cvel) {
1025 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQVel[localIndex_] += cvel;
1026 >    }
1027 >
1028 >    /**
1029 >     * Adds charge velocity into the charge velocity of this stuntDouble in specified snapshot
1030 >     * @param cvel charge velocity to be add
1031 >     * @param snapshotNo
1032 >     * @see #getFlucQVel
1033 >     */        
1034 >    void addflucQVel(RealType cvel, int snapshotNo) {
1035 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQVel[localIndex_] += cvel;
1036 >    }      
1037 >
1038 >
1039 >    /**
1040 >     * Returns the previous charge force of this stuntDouble
1041 >     * @return the charge force of this stuntDouble
1042 >     */    
1043 >    RealType getPrevFlucQFrc() {
1044 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).flucQFrc[localIndex_];
1045 >    }
1046 >      
1047 >    /**
1048 >     * Returns the current charge force of this stuntDouble
1049 >     * @return the charge force of this stuntDouble
1050 >     */    
1051 >    RealType getFlucQFrc() {
1052 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQFrc[localIndex_];
1053 >    }
1054 >
1055 >    /**
1056 >     * Returns the charge force of this stuntDouble in specified snapshot
1057 >     * @return the charge force of this stuntDouble
1058 >     * @param snapshotNo
1059 >     */    
1060 >    RealType getFlucQFrc(int snapshotNo) {
1061 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQFrc[localIndex_];
1062 >    }
1063 >
1064 >    /**
1065 >     * Sets  the previous charge force of this stuntDouble
1066 >     * @param cfrc  new charge force
1067 >     * @see #getFlucQFrc
1068 >     */        
1069 >    void setPrevFlucQFrc(RealType cfrc) {
1070 >      ((snapshotMan_->getPrevSnapshot())->*storage_).flucQFrc[localIndex_] = cfrc;
1071 >    }
1072 >      
1073 >    /**
1074 >     * Sets  the current charge force of this stuntDouble
1075 >     * @param cfrc  new charge force
1076 >     */        
1077 >    void setFlucQFrc(RealType cfrc) {
1078 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQFrc[localIndex_] = cfrc;
1079 >    }
1080 >
1081 >    /**
1082 >     * Sets  the charge force of this stuntDouble in specified snapshot
1083 >     * @param cfrc charge force to be set
1084 >     * @param snapshotNo
1085 >     * @see #getFlucQFrc
1086 >     */        
1087 >    void setFlucQFrc(RealType cfrc, int snapshotNo) {
1088 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQFrc[localIndex_] = cfrc;
1089 >    }
1090 >
1091 >    /**
1092 >     * Adds charge force into the previous charge force of this stuntDouble
1093 >     * @param cfrc   charge force to be added
1094 >     * @see #getFlucQFrc
1095 >     */        
1096 >    void addPrevFlucQFrc(RealType cfrc) {
1097 >      ((snapshotMan_->getPrevSnapshot())->*storage_).flucQFrc[localIndex_] += cfrc;
1098 >    }
1099 >      
1100 >    /**
1101 >     * Adds charge force into the current charge force of this stuntDouble
1102 >     * @param cfrc   charge force to be added
1103 >     */        
1104 >    void addFlucQFrc(RealType cfrc) {
1105 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).flucQFrc[localIndex_] += cfrc;
1106 >    }
1107 >
1108 >    /**
1109 >     * Adds charge force into the charge force of this stuntDouble in specified snapshot
1110 >     * @param cfrc charge force to be added
1111 >     * @param snapshotNo
1112 >     * @see #getFlucQFrc
1113 >     */        
1114 >    void addflucQFrc(RealType cfrc, int snapshotNo) {
1115 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQFrc[localIndex_] += cfrc;
1116 >    }      
1117 >
1118 >
1119 >    /**
1120 >     * Returns the previous electric field of this stuntDouble
1121 >     * @return the electric field of this stuntDouble
1122 >     */    
1123 >    Vector3d getPrevElectricField() {
1124 >      return ((snapshotMan_->getPrevSnapshot())->*storage_).electricField[localIndex_];
1125 >    }
1126 >      
1127 >    /**
1128 >     * Returns the current electric field of this stuntDouble
1129 >     * @return the electric field of this stuntDouble
1130 >     */    
1131 >    Vector3d getElectricField() {
1132 >      return ((snapshotMan_->getCurrentSnapshot())->*storage_).electricField[localIndex_];
1133 >    }
1134 >
1135 >    /**
1136 >     * Returns the electric field of this stuntDouble in specified snapshot
1137 >     * @return the electric field of this stuntDouble
1138 >     * @param snapshotNo
1139 >     */    
1140 >    Vector3d getElectricField(int snapshotNo) {
1141 >      return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).electricField[localIndex_];
1142 >    }
1143 >
1144 >    /**
1145 >     * Sets the previous electric field of this stuntDouble
1146 >     * @param eField  new electric field
1147 >     * @see #getElectricField
1148 >     */        
1149 >    void setPrevElectricField(const Vector3d& eField) {
1150 >      ((snapshotMan_->getPrevSnapshot())->*storage_).electricField[localIndex_] = eField;
1151 >    }
1152 >      
1153 >    /**
1154 >     * Sets the current electric field of this stuntDouble
1155 >     * @param eField  new electric field
1156 >     */        
1157 >    void setElectricField(const Vector3d& eField) {
1158 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).electricField[localIndex_] = eField;
1159 >    }
1160 >
1161 >    /**
1162 >     * Sets the electric field of this stuntDouble in specified snapshot
1163 >     * @param eField electric field to be set
1164 >     * @param snapshotNo
1165 >     * @see #getElectricField
1166 >     */        
1167 >    void setElectricField(const Vector3d& eField, int snapshotNo) {
1168 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).electricField[localIndex_] = eField;
1169 >    }
1170 >
1171 >    /**
1172 >     * Adds electric field into the previous electric field of this
1173 >     * stuntDouble
1174 >     *
1175 >     * @param eField new electric field
1176 >     * @see #getElectricField
1177 >     */        
1178 >    void addPrevEelectricField(const Vector3d& eField) {
1179 >      ((snapshotMan_->getPrevSnapshot())->*storage_).electricField[localIndex_] += eField;
1180 >    }
1181 >      
1182 >    /**
1183 >     * Adds electric field into the current electric field of this stuntDouble
1184 >     * @param eField  new electric field
1185 >     */        
1186 >    void addElectricField(const Vector3d& eField) {
1187 >      ((snapshotMan_->getCurrentSnapshot())->*storage_).electricField[localIndex_] += eField;
1188 >    }
1189 >
1190 >    /**
1191 >     * Adds electric field into the electric field of this stuntDouble in specified snapshot
1192 >     *
1193 >     * @param eField electric field to be added
1194 >     * @param snapshotNo
1195 >     * @see #getElectricField
1196 >     */        
1197 >    void addElectricField(const Vector3d& eField, int snapshotNo) {
1198 >      ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).electricField[localIndex_] += eField;
1199 >    }      
1200 >
1201 >
1202 >    /** Set the force of this stuntDouble to zero */
1203 >    void zeroForcesAndTorques();
1204 >    /**
1205 >     * Returns the inertia tensor of this stuntDouble
1206 >     * @return the inertia tensor of this stuntDouble
1207 >     */
1208 >    virtual Mat3x3d getI() = 0;
1209 >
1210 >    /**
1211 >     * Returns the gradient of this stuntDouble
1212 >     * @return the gradient of this stuntDouble
1213 >     */
1214 >    virtual std::vector<RealType> getGrad() = 0;
1215 >
1216 >    /**
1217 >     * Tests the  if this stuntDouble is a  linear rigidbody
1218 >     *
1219 >     * @return true if this stuntDouble is a  linear rigidbody, otherwise return false
1220 >     * @note atom and directional atom will always return false
1221 >     *
1222 >     * @see #linearAxis
1223 >     */        
1224 >    bool isLinear() {
1225 >      return linear_;
1226 >    }
1227 >
1228 >    /**
1229 >     * Returns the linear axis of the rigidbody, atom and directional atom will always return -1
1230 >     *
1231 >     * @return the linear axis of the rigidbody
1232 >     *
1233 >     * @see #isLinear
1234 >     */
1235 >    int linearAxis() {
1236 >      return linearAxis_;
1237 >    }
1238 >
1239 >    /** Returns the mass of this stuntDouble */
1240 >    RealType getMass() {
1241 >      return mass_;
1242 >    }
1243 >
1244 >    /**
1245 >     * Sets the mass of this stuntdoulbe
1246 >     * @param mass the mass to be set
1247 >     */        
1248 >    void setMass(RealType mass) {
1249 >      mass_ = mass;
1250 >    }
1251 >
1252 >    /** Returns the name of this stuntDouble */
1253 >    virtual std::string getType() = 0;
1254 >        
1255 >    /** Sets the name of this stuntDouble*/
1256 >    virtual void setType(const std::string& name) {}
1257 >
1258 >    /**
1259 >     * Converts a lab fixed vector to a body fixed vector.
1260 >     * @return body fixed vector
1261 >     * @param v lab fixed vector
1262 >     */
1263 >    Vector3d lab2Body(const Vector3d& v) {
1264 >      return getA() * v;
1265 >    }
1266 >
1267 >    Vector3d lab2Body(const Vector3d& v, int frame) {
1268 >      return getA(frame) * v;
1269 >    }
1270 >
1271 >    /**
1272 >     * Converts a body fixed vector to a lab fixed vector.
1273 >     * @return corresponding lab fixed vector
1274 >     * @param v body fixed vector
1275 >     */
1276 >    Vector3d body2Lab(const Vector3d& v){
1277 >      return getA().transpose() * v;
1278 >    }
1279 >
1280 >    Vector3d body2Lab(const Vector3d& v, int frame){
1281 >      return getA(frame).transpose() * v;
1282 >    }
1283 >
1284 >    /**
1285 >     * <p>
1286 >     * The purpose of the Visitor Pattern is to encapsulate an
1287 >     * operation that you want to perform on the elements of a data
1288 >     * structure. In this way, you can change the operation being
1289 >     * performed on a structure without the need of changing the
1290 >     * classes of the elements that you are operating on. Using a
1291 >     * Visitor pattern allows you to decouple the classes for the data
1292 >     * structure and the algorithms used upon them
1293 >     * </p>
1294 >     * @param v visitor
1295 >     */      
1296 >    virtual void accept(BaseVisitor* v) = 0;
1297 >
1298 >    //below functions are just forward functions
1299 >    /**
1300 >     * Adds property into property map
1301 >     * @param genData GenericData to be added into PropertyMap
1302 >     */
1303 >    void addProperty(GenericData* genData);
1304 >
1305 >    /**
1306 >     * Removes property from PropertyMap by name
1307 >     * @param propName the name of property to be removed
1308 >     */
1309 >    void removeProperty(const std::string& propName);
1310 >
1311 >    /**
1312 >     * clear all of the properties
1313 >     */
1314 >    void clearProperties();
1315 >
1316 >    /**
1317 >     * Returns all names of properties
1318 >     * @return all names of properties
1319 >     */
1320 >    std::vector<std::string> getPropertyNames();
1321 >
1322 >    /**
1323 >     * Returns all of the properties in PropertyMap
1324 >     * @return all of the properties in PropertyMap
1325 >     */      
1326 >    std::vector<GenericData*> getProperties();
1327 >
1328 >    /**
1329 >     * Returns property
1330 >     * @param propName name of property
1331 >     * @return a pointer point to property with propName. If no property named propName
1332 >     * exists, return NULL
1333 >     */      
1334 >    GenericData* getPropertyByName(const std::string& propName);
1335 >
1336 >  protected:
1337 >        
1338 >    StuntDouble(ObjectType objType, DataStoragePointer storage);
1339 >        
1340 >    StuntDouble(const StuntDouble& sd);
1341 >    StuntDouble& operator=(const StuntDouble& sd);
1342 >
1343 >    ObjectType objType_;
1344 >    DataStoragePointer storage_;
1345 >    SnapshotManager* snapshotMan_;
1346 >        
1347 >    bool linear_;
1348 >    int linearAxis_;        
1349 >
1350 >        
1351 >    int globalIndex_;
1352 >    int globalIntegrableObjectIndex_;
1353 >    int localIndex_;
1354 >
1355 >
1356 >    RealType mass_;
1357 >        
1358 >  private:
1359 >        
1360 >    PropertyMap properties_;
1361 >  };
1362 >
1363 > }//end namespace OpenMD
1364 > #endif //PRIMITIVES_STUNTDOUBLE_HPP

Comparing:
trunk/src/primitives/StuntDouble.hpp (property svn:keywords), Revision 2 by gezelter, Fri Sep 24 04:16:43 2004 UTC vs.
branches/development/src/primitives/StuntDouble.hpp (property svn:keywords), Revision 1839 by gezelter, Fri Jan 25 15:21:04 2013 UTC

# Line 0 | Line 1
1 + Author Id Revision Date

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines