ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/primitives/StuntDouble.hpp
Revision: 1839
Committed: Fri Jan 25 15:21:04 2013 UTC (12 years, 3 months ago) by gezelter
File size: 43063 byte(s)
Log Message:
Added bookeeping to add static electric fields and to zero them out when necessary.

File Contents

# User Rev Content
1 gezelter 507 /*
2 gezelter 246 * 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 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
10 gezelter 246 * notice, this list of conditions and the following disclaimer.
11     *
12 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
13 gezelter 246 * 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 gezelter 1390 *
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 gezelter 1665 * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010).
40     * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 gezelter 246 */
42    
43     /**
44     * @file StuntDouble.hpp
45     * @author tlin
46     * @date 10/22/2004
47     * @version 1.0
48     */
49    
50 gezelter 507 #ifndef PRIMITIVES_STUNTDOUBLE_HPP
51     #define PRIMITIVES_STUNTDOUBLE_HPP
52 gezelter 2
53 gezelter 246 #include <vector>
54 gezelter 2
55 gezelter 246 #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 gezelter 1390 namespace OpenMD{
63 gezelter 2
64 tim 132
65 gezelter 246
66     /**
67     * @class StuntDouble StuntDouble.hpp "Primitives/StuntDouble.hpp"
68     * @brief
69 gezelter 573 * "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 gezelter 246 * 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 gezelter 573 * doesn't try to do something stupid like torque an Atom (The
85     * quotes above are from Spaceballs...)
86     *
87 chuckv 1245 * @note the dynamic data of stuntDouble will be stored outside of the class
88 gezelter 246 */
89 gezelter 507 class StuntDouble{
90     public:
91 gezelter 2
92 gezelter 507 enum ObjectType{
93     otAtom,
94     otDAtom,
95     otRigidBody
96     };
97 gezelter 2
98 gezelter 507 virtual ~StuntDouble();
99 gezelter 246
100 gezelter 507 /**
101 chuckv 1245 * Returns the global index of this stuntDouble.
102     * @return the global index of this stuntDouble
103 gezelter 507 */
104     int getGlobalIndex() {
105     return globalIndex_;
106     }
107 gezelter 2
108 gezelter 507 /**
109 chuckv 1245 * Sets the global index of this stuntDouble.
110 gezelter 1808 * @param index new global index to be set
111 gezelter 507 */
112     void setGlobalIndex(int index) {
113     globalIndex_ = index;
114     }
115 chuckv 1245
116 gezelter 507 /**
117 chuckv 1245 * Returns the local index of this stuntDouble
118     * @return the local index of this stuntDouble
119 gezelter 507 */
120     int getLocalIndex() {
121     return localIndex_;
122     }
123 gezelter 2
124 gezelter 507 /**
125 chuckv 1245 * Sets the local index of this stuntDouble
126 gezelter 507 * @param index new index to be set
127     */
128     void setLocalIndex(int index) {
129     localIndex_ = index;
130     }
131 chuckv 1245
132     int getGlobalIntegrableObjectIndex(){
133     return globalIntegrableObjectIndex_;
134     }
135     void setGlobalIntegrableObjectIndex(int index) {
136     globalIntegrableObjectIndex_ = index;
137     }
138 gezelter 2
139 gezelter 507 /**
140 chuckv 1245 * Sets the Snapshot Manager of this stuntDouble
141 gezelter 507 */
142     void setSnapshotManager(SnapshotManager* sman) {
143     snapshotMan_ = sman;
144     }
145 gezelter 2
146 gezelter 507 /**
147 chuckv 1245 * Tests if this stuntDouble is an atom
148     * @return true is this stuntDouble is an atom(or a directional atom), return false otherwise
149 gezelter 507 */
150     bool isAtom(){
151     return objType_ == otAtom || objType_ == otDAtom;
152     }
153 gezelter 2
154 gezelter 507 /**
155 chuckv 1245 * Tests if this stuntDouble is an directional atom
156     * @return true if this stuntDouble is an directional atom, return false otherwise
157 gezelter 507 */
158     bool isDirectionalAtom(){
159     return objType_ == otDAtom;
160     }
161 gezelter 2
162 gezelter 507 /**
163 chuckv 1245 * Tests if this stuntDouble is a rigid body.
164     * @return true if this stuntDouble is a rigid body, otherwise return false
165 gezelter 507 */
166     bool isRigidBody(){
167     return objType_ == otRigidBody;
168     }
169 gezelter 2
170 gezelter 507 /**
171 chuckv 1245 * 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 gezelter 507 */
174     bool isDirectional(){
175     return isDirectionalAtom() || isRigidBody();
176     }
177 gezelter 2
178 gezelter 507 /**
179 gezelter 945 * 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     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     /**
202 chuckv 1245 * Returns the previous position of this stuntDouble
203     * @return the position of this stuntDouble
204 gezelter 507 */
205     Vector3d getPrevPos() {
206     return ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_];
207     }
208 gezelter 246
209 gezelter 507 /**
210 chuckv 1245 * Returns the current position of this stuntDouble
211     * @return the position of this stuntDouble
212 gezelter 507 */
213     Vector3d getPos() {
214     return ((snapshotMan_->getCurrentSnapshot())->*storage_).position[localIndex_];
215     }
216 gezelter 2
217 gezelter 507 /**
218 chuckv 1245 * Returns the position of this stuntDouble in specified snapshot
219     * @return the position of this stuntDouble
220 gezelter 507 * @param snapshotNo
221     */
222     Vector3d getPos(int snapshotNo) {
223     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_];
224     }
225 gezelter 2
226 gezelter 507 /**
227 chuckv 1245 * Sets the previous position of this stuntDouble
228 gezelter 507 * @param pos new position
229     * @see #getPos
230     */
231     void setPrevPos(const Vector3d& pos) {
232     ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_] = pos;
233     }
234 gezelter 246
235 gezelter 507 /**
236 chuckv 1245 * Sets the current position of this stuntDouble
237 gezelter 507 * @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 gezelter 2
245 gezelter 507 /**
246 chuckv 1245 * Sets the position of this stuntDouble in specified snapshot
247 gezelter 507 * @param pos position to be set
248     * @param snapshotNo
249     * @see #getPos
250     */
251     void setPos(const Vector3d& pos, int snapshotNo) {
252 gezelter 2
253 gezelter 507 ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_] = pos;
254 gezelter 2
255 gezelter 507 }
256 gezelter 246
257 gezelter 507 /**
258 chuckv 1245 * Returns the previous velocity of this stuntDouble
259     * @return the velocity of this stuntDouble
260 gezelter 507 */
261     Vector3d getPrevVel() {
262     return ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_];
263     }
264 gezelter 246
265 gezelter 507 /**
266 chuckv 1245 * Returns the current velocity of this stuntDouble
267     * @return the velocity of this stuntDouble
268 gezelter 507 */
269     Vector3d getVel() {
270     return ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_];
271     }
272 gezelter 2
273 gezelter 507 /**
274 chuckv 1245 * Returns the velocity of this stuntDouble in specified snapshot
275     * @return the velocity of this stuntDouble
276 gezelter 507 * @param snapshotNo
277     */
278     Vector3d getVel(int snapshotNo) {
279     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).velocity[localIndex_];
280     }
281 gezelter 2
282 gezelter 507 /**
283 chuckv 1245 * Sets the previous velocity of this stuntDouble
284 gezelter 507 * @param vel new velocity
285     * @see #getVel
286     */
287     void setPrevVel(const Vector3d& vel) {
288     ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_] = vel;
289     }
290 gezelter 246
291 gezelter 507 /**
292 chuckv 1245 * Sets the current velocity of this stuntDouble
293 gezelter 507 * @param vel new velocity
294     */
295     void setVel(const Vector3d& vel) {
296     ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_] = vel;
297     }
298 gezelter 246
299 gezelter 507 /**
300 chuckv 1245 * Sets the velocity of this stuntDouble in specified snapshot
301 gezelter 507 * @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 gezelter 246
309 gezelter 507 /**
310 chuckv 1245 * Returns the previous rotation matrix of this stuntDouble
311     * @return the rotation matrix of this stuntDouble
312 gezelter 507 */
313     RotMat3x3d getPrevA() {
314     return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_];
315     }
316 gezelter 246
317 gezelter 507 /**
318 chuckv 1245 * Returns the current rotation matrix of this stuntDouble
319     * @return the rotation matrix of this stuntDouble
320 gezelter 507 */
321     RotMat3x3d getA() {
322     return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_];
323     }
324 gezelter 246
325 gezelter 507 /**
326 chuckv 1245 * Returns the rotation matrix of this stuntDouble in specified snapshot
327 gezelter 507 *
328 chuckv 1245 * @return the rotation matrix of this stuntDouble
329 gezelter 507 * @param snapshotNo
330     */
331     RotMat3x3d getA(int snapshotNo) {
332     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_];
333     }
334 gezelter 246
335 gezelter 507 /**
336 chuckv 1245 * Sets the previous rotation matrix of this stuntDouble
337 gezelter 507 * @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 gezelter 246
344 gezelter 507 /**
345 chuckv 1245 * Sets the current rotation matrix of this stuntDouble
346 gezelter 507 * @param a new rotation matrix
347     */
348     virtual void setA(const RotMat3x3d& a) {
349     ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = a;
350     }
351 gezelter 246
352 gezelter 507 /**
353 chuckv 1245 * Sets the rotation matrix of this stuntDouble in specified snapshot
354 gezelter 507 * @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 gezelter 246
362 gezelter 507 /**
363 chuckv 1245 * Returns the previous angular momentum of this stuntDouble (body-fixed).
364     * @return the angular momentum of this stuntDouble
365 gezelter 507 */
366     Vector3d getPrevJ() {
367     return ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_];
368     }
369 gezelter 246
370 gezelter 507 /**
371 chuckv 1245 * Returns the current angular momentum of this stuntDouble (body -fixed).
372     * @return the angular momentum of this stuntDouble
373 gezelter 507 */
374     Vector3d getJ() {
375     return ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_];
376     }
377 gezelter 246
378 gezelter 507 /**
379 chuckv 1245 * Returns the angular momentum of this stuntDouble in specified snapshot (body-fixed).
380     * @return the angular momentum of this stuntDouble
381 gezelter 507 * @param snapshotNo
382     */
383     Vector3d getJ(int snapshotNo) {
384     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).angularMomentum[localIndex_];
385     }
386 gezelter 246
387 gezelter 507 /**
388 chuckv 1245 * Sets the previous angular momentum of this stuntDouble (body-fixed).
389 gezelter 507 * @param angMom new angular momentum
390     * @see #getJ
391     */
392     void setPrevJ(const Vector3d& angMom) {
393     ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
394     }
395 gezelter 246
396 gezelter 507 /**
397 chuckv 1245 * Sets the current angular momentum of this stuntDouble (body-fixed).
398 gezelter 507 * @param angMom new angular momentum
399     */
400     void setJ(const Vector3d& angMom) {
401     ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
402     }
403 gezelter 246
404 gezelter 507 /**
405 chuckv 1245 * Sets the angular momentum of this stuntDouble in specified snapshot(body-fixed).
406 gezelter 507 * @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 chuckv 1112
414 gezelter 507 /**
415 chuckv 1245 * Returns system Center of Mass for stuntDouble frame from snapshot
416 chuckv 1112 *
417     */
418     Vector3d getCOM(){
419     return (snapshotMan_->getCurrentSnapshot())->getCOM();
420     }
421    
422     /**
423 chuckv 1245 * Returns system Center of Mass velocity for stuntDouble frame from snapshot
424 chuckv 1112 *
425     */
426    
427     Vector3d getCOMvel(){
428     return (snapshotMan_->getCurrentSnapshot())->getCOMvel();
429     }
430    
431     /**
432 chuckv 1245 * Returns system Center of Mass angular momentum for stuntDouble frame from snapshot
433 chuckv 1112 *
434     */
435     Vector3d getCOMw(){
436     return (snapshotMan_->getCurrentSnapshot())->getCOMw();
437     }
438    
439     /**
440 chuckv 1245 * Returns system Center of Mass for stuntDouble frame from snapshot
441 chuckv 1112 *
442     */
443     Vector3d getCOM(int snapshotNo){
444     return (snapshotMan_->getSnapshot(snapshotNo))->getCOM();
445     }
446    
447     /**
448 chuckv 1245 * Returns system Center of Mass velocity for stuntDouble frame from snapshot
449 chuckv 1112 *
450     */
451    
452     Vector3d getCOMvel(int snapshotNo){
453     return (snapshotMan_->getSnapshot(snapshotNo))->getCOMvel();
454     }
455    
456     /**
457 chuckv 1245 * Returns system Center of Mass angular momentum for stuntDouble frame from snapshot
458 chuckv 1112 *
459     */
460     Vector3d getCOMw(int snapshotNo){
461     return (snapshotMan_->getSnapshot(snapshotNo))->getCOMw();
462     }
463    
464     /**
465 chuckv 1245 * Returns the previous quaternion of this stuntDouble
466     * @return the quaternion of this stuntDouble
467 gezelter 507 */
468     Quat4d getPrevQ() {
469     return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
470     }
471 gezelter 246
472 gezelter 507 /**
473 chuckv 1245 * Returns the current quaternion of this stuntDouble
474     * @return the quaternion of this stuntDouble
475 gezelter 507 */
476     Quat4d getQ() {
477     return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
478     }
479 gezelter 246
480 gezelter 507 /**
481 chuckv 1245 * Returns the quaternion of this stuntDouble in specified snapshot
482     * @return the quaternion of this stuntDouble
483 gezelter 507 * @param snapshotNo
484     */
485     Quat4d getQ(int snapshotNo) {
486     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toQuaternion();
487     }
488 gezelter 246
489 gezelter 507 /**
490 chuckv 1245 * Sets the previous quaternion of this stuntDouble
491 gezelter 507 * @param q new quaternion
492     * @note actual storage data is rotation matrix
493     */
494     void setPrevQ(const Quat4d& q) {
495     setPrevA(q);
496     }
497 gezelter 246
498 gezelter 507 /**
499 chuckv 1245 * Sets the current quaternion of this stuntDouble
500 gezelter 507 * @param q new quaternion
501     * @note actual storage data is rotation matrix
502     */
503     void setQ(const Quat4d& q) {
504     setA(q);
505     }
506 gezelter 246
507 gezelter 507 /**
508 chuckv 1245 * Sets the quaternion of this stuntDouble in specified snapshot
509 gezelter 507 *
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 gezelter 246
518 gezelter 507 /**
519 chuckv 1245 * Returns the previous euler angles of this stuntDouble
520     * @return the euler angles of this stuntDouble
521 gezelter 507 */
522     Vector3d getPrevEuler() {
523     return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
524     }
525 gezelter 246
526 gezelter 507 /**
527 chuckv 1245 * Returns the current euler angles of this stuntDouble
528     * @return the euler angles of this stuntDouble
529 gezelter 507 */
530     Vector3d getEuler() {
531     return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
532     }
533 gezelter 246
534 gezelter 507 /**
535 chuckv 1245 * Returns the euler angles of this stuntDouble in specified snapshot.
536     * @return the euler angles of this stuntDouble
537 gezelter 507 * @param snapshotNo
538     */
539     Vector3d getEuler(int snapshotNo) {
540     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toEulerAngles();
541     }
542 gezelter 246
543 gezelter 507 /**
544 chuckv 1245 * Sets the previous euler angles of this stuntDouble.
545 gezelter 507 * @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 gezelter 246
553 gezelter 507 /**
554 chuckv 1245 * Sets the current euler angles of this stuntDouble
555 gezelter 507 * @param euler new euler angles
556     */
557     void setEuler(const Vector3d& euler) {
558     ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = euler;
559     }
560 gezelter 246
561 gezelter 507 /**
562 chuckv 1245 * Sets the euler angles of this stuntDouble in specified snapshot
563 gezelter 507 *
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 gezelter 1787
572 gezelter 507 /**
573 gezelter 1787 * Returns the previous dipole vector of this stuntDouble
574     * @return the dipole vector of this stuntDouble
575 gezelter 507 */
576 gezelter 1787 Vector3d getPrevDipole() {
577     return ((snapshotMan_->getPrevSnapshot())->*storage_).dipole[localIndex_];
578 gezelter 507 }
579 gezelter 1787
580 gezelter 507 /**
581 gezelter 1787 * Returns the current dipole vector of this stuntDouble
582     * @return the dipole vector of this stuntDouble
583 gezelter 507 */
584 gezelter 1787 Vector3d getDipole() {
585     return ((snapshotMan_->getCurrentSnapshot())->*storage_).dipole[localIndex_];
586 gezelter 507 }
587 gezelter 1787
588 gezelter 507 /**
589 gezelter 1787 * Returns the dipole vector of this stuntDouble in specified snapshot
590 gezelter 507 *
591 gezelter 1787 * @return the dipole vector of this stuntDouble
592 gezelter 507 * @param snapshotNo
593     */
594 gezelter 1787 Vector3d getDipole(int snapshotNo) {
595     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).dipole[localIndex_];
596 gezelter 507 }
597 gezelter 246
598 gezelter 1787
599 gezelter 507 /**
600 gezelter 1787 * 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 chuckv 1245 * Returns the previous force of this stuntDouble
627     * @return the force of this stuntDouble
628 gezelter 507 */
629     Vector3d getPrevFrc() {
630     return ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_];
631     }
632 gezelter 246
633 gezelter 507 /**
634 chuckv 1245 * Returns the current force of this stuntDouble
635     * @return the force of this stuntDouble
636 gezelter 507 */
637     Vector3d getFrc() {
638     return ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_];
639     }
640 gezelter 246
641 gezelter 507 /**
642 chuckv 1245 * Returns the force of this stuntDouble in specified snapshot
643 gezelter 507 *
644 chuckv 1245 * @return the force of this stuntDouble
645 gezelter 507 * @param snapshotNo
646     */
647     Vector3d getFrc(int snapshotNo) {
648     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_];
649     }
650 gezelter 246
651 gezelter 507 /**
652 chuckv 1245 * Sets the previous force of this stuntDouble
653 gezelter 507 *
654     * @param frc new force
655     * @see #getFrc
656     */
657     void setPrevFrc(const Vector3d& frc) {
658     ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] = frc;
659     }
660 gezelter 246
661 gezelter 507 /**
662 chuckv 1245 * Sets the current force of this stuntDouble
663 gezelter 507 * @param frc new force
664     */
665     void setFrc(const Vector3d& frc) {
666     ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] = frc;
667     }
668 gezelter 246
669 gezelter 507 /**
670 chuckv 1245 * Sets the force of this stuntDouble in specified snapshot
671 gezelter 507 *
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 gezelter 246
680 gezelter 507 /**
681 chuckv 1245 * Adds force into the previous force of this stuntDouble
682 gezelter 507 *
683     * @param frc new force
684     * @see #getFrc
685     */
686     void addPrevFrc(const Vector3d& frc) {
687     ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] += frc;
688     }
689 gezelter 246
690 gezelter 507 /**
691 chuckv 1245 * Adds force into the current force of this stuntDouble
692 gezelter 507 * @param frc new force
693     */
694     void addFrc(const Vector3d& frc) {
695     ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] += frc;
696     }
697 gezelter 246
698 gezelter 507 /**
699 chuckv 1245 * Adds force into the force of this stuntDouble in specified snapshot
700 gezelter 507 *
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 gezelter 246
709 gezelter 507 /**
710 chuckv 1245 * Returns the previous torque of this stuntDouble
711     * @return the torque of this stuntDouble
712 gezelter 507 */
713     Vector3d getPrevTrq() {
714     return ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_];
715     }
716 gezelter 246
717 gezelter 507 /**
718 chuckv 1245 * Returns the current torque of this stuntDouble
719     * @return the torque of this stuntDouble
720 gezelter 507 */
721     Vector3d getTrq() {
722     return ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_];
723     }
724 gezelter 246
725 gezelter 507 /**
726 chuckv 1245 * Returns the torque of this stuntDouble in specified snapshot
727 gezelter 507 *
728 chuckv 1245 * @return the torque of this stuntDouble
729 gezelter 507 * @param snapshotNo
730     */
731     Vector3d getTrq(int snapshotNo) {
732     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_];
733     }
734 gezelter 246
735 gezelter 507 /**
736 chuckv 1245 * Sets the previous torque of this stuntDouble
737 gezelter 507 *
738     * @param trq new torque
739     * @see #getTrq
740     */
741     void setPrevTrq(const Vector3d& trq) {
742     ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] = trq;
743     }
744 gezelter 246
745 gezelter 507 /**
746 chuckv 1245 * Sets the current torque of this stuntDouble
747 gezelter 507 * @param trq new torque
748     */
749     void setTrq(const Vector3d& trq) {
750     ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] = trq;
751     }
752 gezelter 246
753 gezelter 507 /**
754 chuckv 1245 * Sets the torque of this stuntDouble in specified snapshot
755 gezelter 507 *
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 gezelter 246
764 gezelter 507 /**
765 chuckv 1245 * Adds torque into the previous torque of this stuntDouble
766 gezelter 507 *
767     * @param trq new torque
768     * @see #getTrq
769     */
770     void addPrevTrq(const Vector3d& trq) {
771     ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] += trq;
772     }
773 gezelter 246
774 gezelter 507 /**
775 chuckv 1245 * Adds torque into the current torque of this stuntDouble
776 gezelter 507 * @param trq new torque
777     */
778     void addTrq(const Vector3d& trq) {
779     ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] += trq;
780     }
781 gezelter 246
782 gezelter 507 /**
783 chuckv 1245 * Adds torque into the torque of this stuntDouble in specified snapshot
784 gezelter 507 *
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 gezelter 246
793    
794 gezelter 1309
795 gezelter 507 /**
796 gezelter 1309 * 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 gezelter 1710 * 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 gezelter 1808 * @see #getFlucQPos
908 gezelter 1710 */
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 gezelter 1808 * @see #getFlucQPos
926 gezelter 1710 */
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 gezelter 1808 * @see #getFlucQPos
935 gezelter 1710 */
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 gezelter 1808 * @param charge fluctuating charge to be add
951 gezelter 1710 * @param snapshotNo
952 gezelter 1808 * @see #getFlucQPos
953 gezelter 1710 */
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 gezelter 1808 * @see #getFlucQVel
988 gezelter 1710 */
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 gezelter 1808 * @see #getFlucQVel
1006 gezelter 1710 */
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 gezelter 1808 * @see #getFlucQVel
1015 gezelter 1710 */
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 gezelter 1808 * @param cvel charge velocity to be add
1031 gezelter 1710 * @param snapshotNo
1032 gezelter 1808 * @see #getFlucQVel
1033 gezelter 1710 */
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 gezelter 1808 * @see #getFlucQFrc
1068 gezelter 1710 */
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 gezelter 1808 * @see #getFlucQFrc
1086 gezelter 1710 */
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 gezelter 1808 * @param cfrc charge force to be added
1094     * @see #getFlucQFrc
1095 gezelter 1710 */
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 gezelter 1808 * @param cfrc charge force to be added
1103 gezelter 1710 */
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 gezelter 1808 * @param cfrc charge force to be added
1111 gezelter 1710 * @param snapshotNo
1112 gezelter 1808 * @see #getFlucQFrc
1113 gezelter 1710 */
1114     void addflucQFrc(RealType cfrc, int snapshotNo) {
1115     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).flucQFrc[localIndex_] += cfrc;
1116     }
1117    
1118    
1119 gezelter 1714 /**
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 gezelter 1710
1135 gezelter 1714 /**
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 gezelter 1710
1144 gezelter 1714 /**
1145 gezelter 1839 * Sets the previous electric field of this stuntDouble
1146     * @param eField new electric field
1147 gezelter 1714 * @see #getElectricField
1148     */
1149 gezelter 1839 void setPrevElectricField(const Vector3d& eField) {
1150     ((snapshotMan_->getPrevSnapshot())->*storage_).electricField[localIndex_] = eField;
1151 gezelter 1714 }
1152    
1153     /**
1154 gezelter 1839 * Sets the current electric field of this stuntDouble
1155     * @param eField new electric field
1156 gezelter 1714 */
1157 gezelter 1839 void setElectricField(const Vector3d& eField) {
1158     ((snapshotMan_->getCurrentSnapshot())->*storage_).electricField[localIndex_] = eField;
1159 gezelter 1714 }
1160    
1161     /**
1162 gezelter 1839 * Sets the electric field of this stuntDouble in specified snapshot
1163     * @param eField electric field to be set
1164 gezelter 1714 * @param snapshotNo
1165     * @see #getElectricField
1166     */
1167 gezelter 1839 void setElectricField(const Vector3d& eField, int snapshotNo) {
1168     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).electricField[localIndex_] = eField;
1169     }
1170 gezelter 1714
1171 gezelter 1839 /**
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 gezelter 1714 }
1181 gezelter 1839
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 gezelter 1714
1190 gezelter 1839 /**
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 gezelter 1714
1201 gezelter 1839
1202 chuckv 1245 /** Set the force of this stuntDouble to zero */
1203 gezelter 507 void zeroForcesAndTorques();
1204     /**
1205 chuckv 1245 * Returns the inertia tensor of this stuntDouble
1206     * @return the inertia tensor of this stuntDouble
1207 gezelter 507 */
1208     virtual Mat3x3d getI() = 0;
1209 gezelter 246
1210 gezelter 507 /**
1211 chuckv 1245 * Returns the gradient of this stuntDouble
1212     * @return the gradient of this stuntDouble
1213 gezelter 507 */
1214 tim 963 virtual std::vector<RealType> getGrad() = 0;
1215 gezelter 246
1216 gezelter 507 /**
1217 chuckv 1245 * Tests the if this stuntDouble is a linear rigidbody
1218 gezelter 507 *
1219 chuckv 1245 * @return true if this stuntDouble is a linear rigidbody, otherwise return false
1220 gezelter 507 * @note atom and directional atom will always return false
1221     *
1222     * @see #linearAxis
1223     */
1224     bool isLinear() {
1225     return linear_;
1226     }
1227 gezelter 246
1228 gezelter 507 /**
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 gezelter 246
1239 chuckv 1245 /** Returns the mass of this stuntDouble */
1240 tim 963 RealType getMass() {
1241 gezelter 507 return mass_;
1242     }
1243 gezelter 246
1244 gezelter 507 /**
1245     * Sets the mass of this stuntdoulbe
1246     * @param mass the mass to be set
1247     */
1248 tim 963 void setMass(RealType mass) {
1249 gezelter 507 mass_ = mass;
1250     }
1251 gezelter 246
1252 chuckv 1245 /** Returns the name of this stuntDouble */
1253 gezelter 507 virtual std::string getType() = 0;
1254 gezelter 246
1255 chuckv 1245 /** Sets the name of this stuntDouble*/
1256 gezelter 507 virtual void setType(const std::string& name) {}
1257 gezelter 246
1258 gezelter 507 /**
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 gezelter 246
1267 gezelter 507 Vector3d lab2Body(const Vector3d& v, int frame) {
1268     return getA(frame) * v;
1269     }
1270 tim 334
1271 gezelter 507 /**
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 tim 334
1280 gezelter 507 Vector3d body2Lab(const Vector3d& v, int frame){
1281     return getA(frame).transpose() * v;
1282     }
1283 chuckv 1245
1284 gezelter 507 /**
1285     * <p>
1286 cli2 1360 * 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 gezelter 507 * </p>
1294     * @param v visitor
1295     */
1296     virtual void accept(BaseVisitor* v) = 0;
1297 gezelter 246
1298 gezelter 507 //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 gezelter 246
1305 gezelter 507 /**
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 gezelter 246
1311 gezelter 507 /**
1312     * clear all of the properties
1313     */
1314     void clearProperties();
1315 gezelter 246
1316 gezelter 507 /**
1317     * Returns all names of properties
1318     * @return all names of properties
1319     */
1320     std::vector<std::string> getPropertyNames();
1321 gezelter 246
1322 gezelter 507 /**
1323     * Returns all of the properties in PropertyMap
1324     * @return all of the properties in PropertyMap
1325     */
1326     std::vector<GenericData*> getProperties();
1327 gezelter 246
1328 gezelter 507 /**
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 gezelter 246
1336 gezelter 507 protected:
1337 gezelter 246
1338 gezelter 507 StuntDouble(ObjectType objType, DataStoragePointer storage);
1339 gezelter 246
1340 gezelter 507 StuntDouble(const StuntDouble& sd);
1341     StuntDouble& operator=(const StuntDouble& sd);
1342 gezelter 246
1343 gezelter 507 ObjectType objType_;
1344     DataStoragePointer storage_;
1345     SnapshotManager* snapshotMan_;
1346 gezelter 246
1347 gezelter 507 bool linear_;
1348     int linearAxis_;
1349 gezelter 246
1350    
1351 gezelter 507 int globalIndex_;
1352 tim 1024 int globalIntegrableObjectIndex_;
1353 gezelter 507 int localIndex_;
1354 gezelter 246
1355    
1356 tim 963 RealType mass_;
1357 gezelter 246
1358 gezelter 507 private:
1359 gezelter 246
1360 gezelter 507 PropertyMap properties_;
1361     };
1362 gezelter 2
1363 gezelter 1390 }//end namespace OpenMD
1364 gezelter 246 #endif //PRIMITIVES_STUNTDOUBLE_HPP

Properties

Name Value
svn:executable *
svn:keywords Author Id Revision Date