ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/primitives/StuntDouble.hpp
Revision: 1627
Committed: Tue Sep 13 22:05:04 2011 UTC (13 years, 7 months ago) by gezelter
File size: 33583 byte(s)
Log Message:
Splitting out ifstrstream into a header and an implementation.  This
means that much of the code that depends on it can be compiled only
once and the parallel I/O is concentrated into a few files.  To do
this, a number of files that relied on basic_ifstrstream to load the
mpi header had to be modified to manage their own headers.


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     * [4] Vardeman & Gezelter, in progress (2009).
40 gezelter 246 */
41    
42     /**
43     * @file StuntDouble.hpp
44     * @author tlin
45     * @date 10/22/2004
46     * @version 1.0
47     */
48    
49 gezelter 507 #ifndef PRIMITIVES_STUNTDOUBLE_HPP
50     #define PRIMITIVES_STUNTDOUBLE_HPP
51 gezelter 2
52 gezelter 246 #include <vector>
53 gezelter 2
54 gezelter 246 #include "visitors/BaseVisitor.hpp"
55     #include "math/Quaternion.hpp"
56     #include "math/SquareMatrix3.hpp"
57     #include "math/Vector3.hpp"
58     #include "utils/PropertyMap.hpp"
59     #include "brains/Snapshot.hpp"
60     #include "brains/SnapshotManager.hpp"
61 gezelter 1390 namespace OpenMD{
62 gezelter 2
63 tim 132
64 gezelter 246
65     /**
66     * @class StuntDouble StuntDouble.hpp "Primitives/StuntDouble.hpp"
67     * @brief
68 gezelter 573 * "Don't move, or you're dead! Stand up! Captain, we've got them!"
69     *
70     * "Spectacular stunt, my friends, but all for naught. Turn around
71     * please. Ha. What a pity. What a pity. So, Princess, you thought
72     * you could outwit the imperious forces of...."
73     *
74     * "You idiots! These are not them. You've captured their stunt
75     * doubles! Search the area. Find them! Find them!"
76     *
77 gezelter 246 * StuntDouble is a very strange idea. A StuntDouble stands in for
78     * some object that can be manipulated by the Integrators or
79     * Minimizers. Some of the manipulable objects are Atoms, some are
80     * DirectionalAtoms, and some are RigidBodies. StuntDouble
81     * provides an interface for the Integrators and Minimizers to use,
82     * and does some preliminary sanity checking so that the program
83 gezelter 573 * doesn't try to do something stupid like torque an Atom (The
84     * quotes above are from Spaceballs...)
85     *
86 chuckv 1245 * @note the dynamic data of stuntDouble will be stored outside of the class
87 gezelter 246 */
88 gezelter 507 class StuntDouble{
89     public:
90 gezelter 2
91 gezelter 507 enum ObjectType{
92     otAtom,
93     otDAtom,
94     otRigidBody
95     };
96 gezelter 2
97 gezelter 507 virtual ~StuntDouble();
98 gezelter 246
99 gezelter 507 /**
100 chuckv 1245 * Returns the global index of this stuntDouble.
101     * @return the global index of this stuntDouble
102 gezelter 507 */
103     int getGlobalIndex() {
104     return globalIndex_;
105     }
106 gezelter 2
107 gezelter 507 /**
108 chuckv 1245 * Sets the global index of this stuntDouble.
109 gezelter 507 * @param new global index to be set
110     */
111     void setGlobalIndex(int index) {
112     globalIndex_ = index;
113     }
114 chuckv 1245
115 gezelter 507 /**
116 chuckv 1245 * Returns the local index of this stuntDouble
117     * @return the local index of this stuntDouble
118 gezelter 507 */
119     int getLocalIndex() {
120     return localIndex_;
121     }
122 gezelter 2
123 gezelter 507 /**
124 chuckv 1245 * Sets the local index of this stuntDouble
125 gezelter 507 * @param index new index to be set
126     */
127     void setLocalIndex(int index) {
128     localIndex_ = index;
129     }
130 chuckv 1245
131     int getGlobalIntegrableObjectIndex(){
132     return globalIntegrableObjectIndex_;
133     }
134     void setGlobalIntegrableObjectIndex(int index) {
135     globalIntegrableObjectIndex_ = index;
136     }
137 gezelter 2
138 gezelter 507 /**
139 chuckv 1245 * Sets the Snapshot Manager of this stuntDouble
140 gezelter 507 */
141     void setSnapshotManager(SnapshotManager* sman) {
142     snapshotMan_ = sman;
143     }
144 gezelter 2
145 gezelter 507 /**
146 chuckv 1245 * Tests if this stuntDouble is an atom
147     * @return true is this stuntDouble is an atom(or a directional atom), return false otherwise
148 gezelter 507 */
149     bool isAtom(){
150     return objType_ == otAtom || objType_ == otDAtom;
151     }
152 gezelter 2
153 gezelter 507 /**
154 chuckv 1245 * Tests if this stuntDouble is an directional atom
155     * @return true if this stuntDouble is an directional atom, return false otherwise
156 gezelter 507 */
157     bool isDirectionalAtom(){
158     return objType_ == otDAtom;
159     }
160 gezelter 2
161 gezelter 507 /**
162 chuckv 1245 * Tests if this stuntDouble is a rigid body.
163     * @return true if this stuntDouble is a rigid body, otherwise return false
164 gezelter 507 */
165     bool isRigidBody(){
166     return objType_ == otRigidBody;
167     }
168 gezelter 2
169 gezelter 507 /**
170 chuckv 1245 * Tests if this stuntDouble is a directional one.
171     * @return true is this stuntDouble is a directional atom or a rigid body, return false otherwise
172 gezelter 507 */
173     bool isDirectional(){
174     return isDirectionalAtom() || isRigidBody();
175     }
176 gezelter 2
177 gezelter 507 /**
178 gezelter 945 * Freezes out all velocity, angular velocity, forces and torques
179     * on this StuntDouble. Also computes the number of frozen degrees
180     * of freedom.
181     * @return the total number of frozen degrees of freedom
182     */
183     int freeze() {
184    
185     int fdf = 3;
186    
187     setVel(V3Zero);
188     setFrc(V3Zero);
189     if (isDirectional()){
190     setJ(V3Zero);
191     setTrq(V3Zero);
192     if (isLinear())
193     fdf +=2;
194     else
195     fdf +=3;
196     }
197     return fdf;
198     }
199    
200     /**
201 chuckv 1245 * Returns the previous position of this stuntDouble
202     * @return the position of this stuntDouble
203 gezelter 507 */
204     Vector3d getPrevPos() {
205     return ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_];
206     }
207 gezelter 246
208 gezelter 507 /**
209 chuckv 1245 * Returns the current position of this stuntDouble
210     * @return the position of this stuntDouble
211 gezelter 507 */
212     Vector3d getPos() {
213     return ((snapshotMan_->getCurrentSnapshot())->*storage_).position[localIndex_];
214     }
215 gezelter 2
216 gezelter 507 /**
217 chuckv 1245 * Returns the position of this stuntDouble in specified snapshot
218     * @return the position of this stuntDouble
219 gezelter 507 * @param snapshotNo
220     */
221     Vector3d getPos(int snapshotNo) {
222     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_];
223     }
224 gezelter 2
225 gezelter 507 /**
226 chuckv 1245 * Sets the previous position of this stuntDouble
227 gezelter 507 * @param pos new position
228     * @see #getPos
229     */
230     void setPrevPos(const Vector3d& pos) {
231     ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_] = pos;
232     }
233 gezelter 246
234 gezelter 507 /**
235 chuckv 1245 * Sets the current position of this stuntDouble
236 gezelter 507 * @param pos new position
237     */
238     void setPos(const Vector3d& pos) {
239     DataStorage& data = snapshotMan_->getCurrentSnapshot()->*storage_;
240     data.position[localIndex_] = pos;
241     //((snapshotMan_->getCurrentSnapshot())->*storage_).position[localIndex_] = pos;
242     }
243 gezelter 2
244 gezelter 507 /**
245 chuckv 1245 * Sets the position of this stuntDouble in specified snapshot
246 gezelter 507 * @param pos position to be set
247     * @param snapshotNo
248     * @see #getPos
249     */
250     void setPos(const Vector3d& pos, int snapshotNo) {
251 gezelter 2
252 gezelter 507 ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_] = pos;
253 gezelter 2
254 gezelter 507 }
255 gezelter 246
256 gezelter 507 /**
257 chuckv 1245 * Returns the previous velocity of this stuntDouble
258     * @return the velocity of this stuntDouble
259 gezelter 507 */
260     Vector3d getPrevVel() {
261     return ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_];
262     }
263 gezelter 246
264 gezelter 507 /**
265 chuckv 1245 * Returns the current velocity of this stuntDouble
266     * @return the velocity of this stuntDouble
267 gezelter 507 */
268     Vector3d getVel() {
269     return ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_];
270     }
271 gezelter 2
272 gezelter 507 /**
273 chuckv 1245 * Returns the velocity of this stuntDouble in specified snapshot
274     * @return the velocity of this stuntDouble
275 gezelter 507 * @param snapshotNo
276     */
277     Vector3d getVel(int snapshotNo) {
278     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).velocity[localIndex_];
279     }
280 gezelter 2
281 gezelter 507 /**
282 chuckv 1245 * Sets the previous velocity of this stuntDouble
283 gezelter 507 * @param vel new velocity
284     * @see #getVel
285     */
286     void setPrevVel(const Vector3d& vel) {
287     ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_] = vel;
288     }
289 gezelter 246
290 gezelter 507 /**
291 chuckv 1245 * Sets the current velocity of this stuntDouble
292 gezelter 507 * @param vel new velocity
293     */
294     void setVel(const Vector3d& vel) {
295     ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_] = vel;
296     }
297 gezelter 246
298 gezelter 507 /**
299 chuckv 1245 * Sets the velocity of this stuntDouble in specified snapshot
300 gezelter 507 * @param vel velocity to be set
301     * @param snapshotNo
302     * @see #getVel
303     */
304     void setVel(const Vector3d& vel, int snapshotNo) {
305     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).velocity[localIndex_] = vel;
306     }
307 gezelter 246
308 gezelter 507 /**
309 chuckv 1245 * Returns the previous rotation matrix of this stuntDouble
310     * @return the rotation matrix of this stuntDouble
311 gezelter 507 */
312     RotMat3x3d getPrevA() {
313     return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_];
314     }
315 gezelter 246
316 gezelter 507 /**
317 chuckv 1245 * Returns the current rotation matrix of this stuntDouble
318     * @return the rotation matrix of this stuntDouble
319 gezelter 507 */
320     RotMat3x3d getA() {
321     return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_];
322     }
323 gezelter 246
324 gezelter 507 /**
325 chuckv 1245 * Returns the rotation matrix of this stuntDouble in specified snapshot
326 gezelter 507 *
327 chuckv 1245 * @return the rotation matrix of this stuntDouble
328 gezelter 507 * @param snapshotNo
329     */
330     RotMat3x3d getA(int snapshotNo) {
331     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_];
332     }
333 gezelter 246
334 gezelter 507 /**
335 chuckv 1245 * Sets the previous rotation matrix of this stuntDouble
336 gezelter 507 * @param a new rotation matrix
337     * @see #getA
338     */
339     virtual void setPrevA(const RotMat3x3d& a) {
340     ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_] = a;
341     }
342 gezelter 246
343 gezelter 507 /**
344 chuckv 1245 * Sets the current rotation matrix of this stuntDouble
345 gezelter 507 * @param a new rotation matrix
346     */
347     virtual void setA(const RotMat3x3d& a) {
348     ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = a;
349     }
350 gezelter 246
351 gezelter 507 /**
352 chuckv 1245 * Sets the rotation matrix of this stuntDouble in specified snapshot
353 gezelter 507 * @param a rotation matrix to be set
354     * @param snapshotNo
355     * @see #getA
356     */
357     virtual void setA(const RotMat3x3d& a, int snapshotNo) {
358     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_] = a;
359     }
360 gezelter 246
361 gezelter 507 /**
362 chuckv 1245 * Returns the previous angular momentum of this stuntDouble (body-fixed).
363     * @return the angular momentum of this stuntDouble
364 gezelter 507 */
365     Vector3d getPrevJ() {
366     return ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_];
367     }
368 gezelter 246
369 gezelter 507 /**
370 chuckv 1245 * Returns the current angular momentum of this stuntDouble (body -fixed).
371     * @return the angular momentum of this stuntDouble
372 gezelter 507 */
373     Vector3d getJ() {
374     return ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_];
375     }
376 gezelter 246
377 gezelter 507 /**
378 chuckv 1245 * Returns the angular momentum of this stuntDouble in specified snapshot (body-fixed).
379     * @return the angular momentum of this stuntDouble
380 gezelter 507 * @param snapshotNo
381     */
382     Vector3d getJ(int snapshotNo) {
383     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).angularMomentum[localIndex_];
384     }
385 gezelter 246
386 gezelter 507 /**
387 chuckv 1245 * Sets the previous angular momentum of this stuntDouble (body-fixed).
388 gezelter 507 * @param angMom new angular momentum
389     * @see #getJ
390     */
391     void setPrevJ(const Vector3d& angMom) {
392     ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
393     }
394 gezelter 246
395 gezelter 507 /**
396 chuckv 1245 * Sets the current angular momentum of this stuntDouble (body-fixed).
397 gezelter 507 * @param angMom new angular momentum
398     */
399     void setJ(const Vector3d& angMom) {
400     ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
401     }
402 gezelter 246
403 gezelter 507 /**
404 chuckv 1245 * Sets the angular momentum of this stuntDouble in specified snapshot(body-fixed).
405 gezelter 507 * @param angMom angular momentum to be set
406     * @param snapshotNo
407     * @see #getJ
408     */
409     void setJ(const Vector3d& angMom, int snapshotNo) {
410     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).angularMomentum[localIndex_] = angMom;
411     }
412 chuckv 1112
413 gezelter 507 /**
414 chuckv 1245 * Returns system Center of Mass for stuntDouble frame from snapshot
415 chuckv 1112 *
416     */
417     Vector3d getCOM(){
418     return (snapshotMan_->getCurrentSnapshot())->getCOM();
419     }
420    
421     /**
422 chuckv 1245 * Returns system Center of Mass velocity for stuntDouble frame from snapshot
423 chuckv 1112 *
424     */
425    
426     Vector3d getCOMvel(){
427     return (snapshotMan_->getCurrentSnapshot())->getCOMvel();
428     }
429    
430     /**
431 chuckv 1245 * Returns system Center of Mass angular momentum for stuntDouble frame from snapshot
432 chuckv 1112 *
433     */
434     Vector3d getCOMw(){
435     return (snapshotMan_->getCurrentSnapshot())->getCOMw();
436     }
437    
438     /**
439 chuckv 1245 * Returns system Center of Mass for stuntDouble frame from snapshot
440 chuckv 1112 *
441     */
442     Vector3d getCOM(int snapshotNo){
443     return (snapshotMan_->getSnapshot(snapshotNo))->getCOM();
444     }
445    
446     /**
447 chuckv 1245 * Returns system Center of Mass velocity for stuntDouble frame from snapshot
448 chuckv 1112 *
449     */
450    
451     Vector3d getCOMvel(int snapshotNo){
452     return (snapshotMan_->getSnapshot(snapshotNo))->getCOMvel();
453     }
454    
455     /**
456 chuckv 1245 * Returns system Center of Mass angular momentum for stuntDouble frame from snapshot
457 chuckv 1112 *
458     */
459     Vector3d getCOMw(int snapshotNo){
460     return (snapshotMan_->getSnapshot(snapshotNo))->getCOMw();
461     }
462    
463     /**
464 chuckv 1245 * Returns the previous quaternion of this stuntDouble
465     * @return the quaternion of this stuntDouble
466 gezelter 507 */
467     Quat4d getPrevQ() {
468     return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
469     }
470 gezelter 246
471 gezelter 507 /**
472 chuckv 1245 * Returns the current quaternion of this stuntDouble
473     * @return the quaternion of this stuntDouble
474 gezelter 507 */
475     Quat4d getQ() {
476     return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
477     }
478 gezelter 246
479 gezelter 507 /**
480 chuckv 1245 * Returns the quaternion of this stuntDouble in specified snapshot
481     * @return the quaternion of this stuntDouble
482 gezelter 507 * @param snapshotNo
483     */
484     Quat4d getQ(int snapshotNo) {
485     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toQuaternion();
486     }
487 gezelter 246
488 gezelter 507 /**
489 chuckv 1245 * Sets the previous quaternion of this stuntDouble
490 gezelter 507 * @param q new quaternion
491     * @note actual storage data is rotation matrix
492     */
493     void setPrevQ(const Quat4d& q) {
494     setPrevA(q);
495     }
496 gezelter 246
497 gezelter 507 /**
498 chuckv 1245 * Sets the current quaternion of this stuntDouble
499 gezelter 507 * @param q new quaternion
500     * @note actual storage data is rotation matrix
501     */
502     void setQ(const Quat4d& q) {
503     setA(q);
504     }
505 gezelter 246
506 gezelter 507 /**
507 chuckv 1245 * Sets the quaternion of this stuntDouble in specified snapshot
508 gezelter 507 *
509     * @param q quaternion to be set
510     * @param snapshotNo
511     * @note actual storage data is rotation matrix
512     */
513     void setQ(const Quat4d& q, int snapshotNo) {
514     setA(q, snapshotNo);
515     }
516 gezelter 246
517 gezelter 507 /**
518 chuckv 1245 * Returns the previous euler angles of this stuntDouble
519     * @return the euler angles of this stuntDouble
520 gezelter 507 */
521     Vector3d getPrevEuler() {
522     return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
523     }
524 gezelter 246
525 gezelter 507 /**
526 chuckv 1245 * Returns the current euler angles of this stuntDouble
527     * @return the euler angles of this stuntDouble
528 gezelter 507 */
529     Vector3d getEuler() {
530     return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
531     }
532 gezelter 246
533 gezelter 507 /**
534 chuckv 1245 * Returns the euler angles of this stuntDouble in specified snapshot.
535     * @return the euler angles of this stuntDouble
536 gezelter 507 * @param snapshotNo
537     */
538     Vector3d getEuler(int snapshotNo) {
539     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toEulerAngles();
540     }
541 gezelter 246
542 gezelter 507 /**
543 chuckv 1245 * Sets the previous euler angles of this stuntDouble.
544 gezelter 507 * @param euler new euler angles
545     * @see #getEuler
546     * @note actual storage data is rotation matrix
547     */
548     void setPrevEuler(const Vector3d& euler) {
549     ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_] = euler;
550     }
551 gezelter 246
552 gezelter 507 /**
553 chuckv 1245 * Sets the current euler angles of this stuntDouble
554 gezelter 507 * @param euler new euler angles
555     */
556     void setEuler(const Vector3d& euler) {
557     ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = euler;
558     }
559 gezelter 246
560 gezelter 507 /**
561 chuckv 1245 * Sets the euler angles of this stuntDouble in specified snapshot
562 gezelter 507 *
563     * @param euler euler angles to be set
564     * @param snapshotNo
565     * @note actual storage data is rotation matrix
566     */
567     void setEuler(const Vector3d& euler, int snapshotNo) {
568     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_] = euler;
569     }
570 gezelter 246
571 gezelter 507 /**
572 chuckv 1245 * Returns the previous unit vectors of this stuntDouble
573     * @return the unit vectors of this stuntDouble
574 gezelter 507 */
575     RotMat3x3d getPrevElectroFrame() {
576     return ((snapshotMan_->getPrevSnapshot())->*storage_).electroFrame[localIndex_];
577     }
578 gezelter 246
579 gezelter 507 /**
580 chuckv 1245 * Returns the current unit vectors of this stuntDouble
581     * @return the unit vectors of this stuntDouble
582 gezelter 507 */
583     RotMat3x3d getElectroFrame() {
584     return ((snapshotMan_->getCurrentSnapshot())->*storage_).electroFrame[localIndex_];
585     }
586 gezelter 246
587 gezelter 507 /**
588 chuckv 1245 * Returns the unit vectors of this stuntDouble in specified snapshot
589 gezelter 507 *
590 chuckv 1245 * @return the unit vectors of this stuntDouble
591 gezelter 507 * @param snapshotNo
592     */
593     RotMat3x3d getElectroFrame(int snapshotNo) {
594     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).electroFrame[localIndex_];
595     }
596 gezelter 246
597 gezelter 507 /**
598 chuckv 1245 * Returns the previous force of this stuntDouble
599     * @return the force of this stuntDouble
600 gezelter 507 */
601     Vector3d getPrevFrc() {
602     return ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_];
603     }
604 gezelter 246
605 gezelter 507 /**
606 chuckv 1245 * Returns the current force of this stuntDouble
607     * @return the force of this stuntDouble
608 gezelter 507 */
609     Vector3d getFrc() {
610     return ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_];
611     }
612 gezelter 246
613 gezelter 507 /**
614 chuckv 1245 * Returns the force of this stuntDouble in specified snapshot
615 gezelter 507 *
616 chuckv 1245 * @return the force of this stuntDouble
617 gezelter 507 * @param snapshotNo
618     */
619     Vector3d getFrc(int snapshotNo) {
620     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_];
621     }
622 gezelter 246
623 gezelter 507 /**
624 chuckv 1245 * Sets the previous force of this stuntDouble
625 gezelter 507 *
626     * @param frc new force
627     * @see #getFrc
628     */
629     void setPrevFrc(const Vector3d& frc) {
630     ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] = frc;
631     }
632 gezelter 246
633 gezelter 507 /**
634 chuckv 1245 * Sets the current force of this stuntDouble
635 gezelter 507 * @param frc new force
636     */
637     void setFrc(const Vector3d& frc) {
638     ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] = frc;
639     }
640 gezelter 246
641 gezelter 507 /**
642 chuckv 1245 * Sets the force of this stuntDouble in specified snapshot
643 gezelter 507 *
644     * @param frc force to be set
645     * @param snapshotNo
646     * @see #getFrc
647     */
648     void setFrc(const Vector3d& frc, int snapshotNo) {
649     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_] = frc;
650     }
651 gezelter 246
652 gezelter 507 /**
653 chuckv 1245 * Adds force into the previous force of this stuntDouble
654 gezelter 507 *
655     * @param frc new force
656     * @see #getFrc
657     */
658     void addPrevFrc(const Vector3d& frc) {
659     ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] += frc;
660     }
661 gezelter 246
662 gezelter 507 /**
663 chuckv 1245 * Adds force into the current force of this stuntDouble
664 gezelter 507 * @param frc new force
665     */
666     void addFrc(const Vector3d& frc) {
667     ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] += frc;
668     }
669 gezelter 246
670 gezelter 507 /**
671 chuckv 1245 * Adds force into the force of this stuntDouble in specified snapshot
672 gezelter 507 *
673     * @param frc force to be set
674     * @param snapshotNo
675     * @see #getFrc
676     */
677     void addFrc(const Vector3d& frc, int snapshotNo) {
678     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_] += frc;
679     }
680 gezelter 246
681 gezelter 507 /**
682 chuckv 1245 * Returns the previous torque of this stuntDouble
683     * @return the torque of this stuntDouble
684 gezelter 507 */
685     Vector3d getPrevTrq() {
686     return ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_];
687     }
688 gezelter 246
689 gezelter 507 /**
690 chuckv 1245 * Returns the current torque of this stuntDouble
691     * @return the torque of this stuntDouble
692 gezelter 507 */
693     Vector3d getTrq() {
694     return ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_];
695     }
696 gezelter 246
697 gezelter 507 /**
698 chuckv 1245 * Returns the torque of this stuntDouble in specified snapshot
699 gezelter 507 *
700 chuckv 1245 * @return the torque of this stuntDouble
701 gezelter 507 * @param snapshotNo
702     */
703     Vector3d getTrq(int snapshotNo) {
704     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_];
705     }
706 gezelter 246
707 gezelter 507 /**
708 chuckv 1245 * Sets the previous torque of this stuntDouble
709 gezelter 507 *
710     * @param trq new torque
711     * @see #getTrq
712     */
713     void setPrevTrq(const Vector3d& trq) {
714     ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] = trq;
715     }
716 gezelter 246
717 gezelter 507 /**
718 chuckv 1245 * Sets the current torque of this stuntDouble
719 gezelter 507 * @param trq new torque
720     */
721     void setTrq(const Vector3d& trq) {
722     ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] = trq;
723     }
724 gezelter 246
725 gezelter 507 /**
726 chuckv 1245 * Sets the torque of this stuntDouble in specified snapshot
727 gezelter 507 *
728     * @param trq torque to be set
729     * @param snapshotNo
730     * @see #getTrq
731     */
732     void setTrq(const Vector3d& trq, int snapshotNo) {
733     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_] = trq;
734     }
735 gezelter 246
736 gezelter 507 /**
737 chuckv 1245 * Adds torque into the previous torque of this stuntDouble
738 gezelter 507 *
739     * @param trq new torque
740     * @see #getTrq
741     */
742     void addPrevTrq(const Vector3d& trq) {
743     ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] += trq;
744     }
745 gezelter 246
746 gezelter 507 /**
747 chuckv 1245 * Adds torque into the current torque of this stuntDouble
748 gezelter 507 * @param trq new torque
749     */
750     void addTrq(const Vector3d& trq) {
751     ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] += trq;
752     }
753 gezelter 246
754 gezelter 507 /**
755 chuckv 1245 * Adds torque into the torque of this stuntDouble in specified snapshot
756 gezelter 507 *
757     * @param trq torque to be add
758     * @param snapshotNo
759     * @see #getTrq
760     */
761     void addTrq(const Vector3d& trq, int snapshotNo) {
762     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_] += trq;
763     }
764 gezelter 246
765    
766 gezelter 1309
767 gezelter 507 /**
768 gezelter 1309 * Returns the previous particlePot of this stuntDouble
769     * @return the particlePot of this stuntDouble
770     */
771     RealType getPrevParticlePot() {
772     return ((snapshotMan_->getPrevSnapshot())->*storage_).particlePot[localIndex_];
773     }
774    
775     /**
776     * Returns the current particlePot of this stuntDouble
777     * @return the particlePot of this stuntDouble
778     */
779     RealType getParticlePot() {
780     return ((snapshotMan_->getCurrentSnapshot())->*storage_).particlePot[localIndex_];
781     }
782    
783     /**
784     * Returns the particlePot of this stuntDouble in specified snapshot
785     *
786     * @return the particlePot of this stuntDouble
787     * @param snapshotNo
788     */
789     RealType getParticlePot(int snapshotNo) {
790     return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).particlePot[localIndex_];
791     }
792    
793     /**
794     * Sets the previous particlePot of this stuntDouble
795     *
796     * @param particlePot new particlePot
797     * @see #getParticlePot
798     */
799     void setPrevParticlePot(const RealType& particlePot) {
800     ((snapshotMan_->getPrevSnapshot())->*storage_).particlePot[localIndex_] = particlePot;
801     }
802    
803     /**
804     * Sets the current particlePot of this stuntDouble
805     * @param particlePot new particlePot
806     */
807     void setParticlePot(const RealType& particlePot) {
808     ((snapshotMan_->getCurrentSnapshot())->*storage_).particlePot[localIndex_] = particlePot;
809     }
810    
811     /**
812     * Sets the particlePot of this stuntDouble in specified snapshot
813     *
814     * @param particlePot particlePot to be set
815     * @param snapshotNo
816     * @see #getParticlePot
817     */
818     void setParticlePot(const RealType& particlePot, int snapshotNo) {
819     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).particlePot[localIndex_] = particlePot;
820     }
821    
822     /**
823     * Adds particlePot into the previous particlePot of this stuntDouble
824     *
825     * @param particlePot new particlePot
826     * @see #getParticlePot
827     */
828     void addPrevParticlePot(const RealType& particlePot) {
829     ((snapshotMan_->getPrevSnapshot())->*storage_).particlePot[localIndex_] += particlePot;
830     }
831    
832     /**
833     * Adds particlePot into the current particlePot of this stuntDouble
834     * @param particlePot new particlePot
835     */
836     void addParticlePot(const RealType& particlePot) {
837     ((snapshotMan_->getCurrentSnapshot())->*storage_).particlePot[localIndex_] += particlePot;
838     }
839    
840     /**
841     * Adds particlePot into the particlePot of this stuntDouble in specified snapshot
842     *
843     * @param particlePot particlePot to be add
844     * @param snapshotNo
845     * @see #getParticlePot
846     */
847     void addParticlePot(const RealType& particlePot, int snapshotNo) {
848     ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).particlePot[localIndex_] += particlePot;
849     }
850    
851    
852     /**
853 chuckv 1245 * Returns the previous z-angle of this stuntDouble
854     * @return the z-angle of this stuntDouble
855 gezelter 507 */
856 tim 963 RealType getPrevZangle() {
857 gezelter 507 return ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_];
858     }
859 gezelter 246
860 gezelter 507 /**
861 chuckv 1245 * Returns the current z-angle of this stuntDouble
862     * @return the z-angle of this stuntDouble
863 gezelter 507 */
864 tim 963 RealType getZangle() {
865 gezelter 507 return ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_];
866     }
867 gezelter 246
868 gezelter 507 /**
869 chuckv 1245 * Returns the z-angle of this stuntDouble in specified snapshot
870     * @return the z-angle of this stuntDouble
871 gezelter 507 * @param snapshotNo
872     */
873 tim 963 RealType getZangle(int snapshotNo) {
874 gezelter 507 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_];
875     }
876 gezelter 246
877 gezelter 507 /**
878 chuckv 1245 * Sets the previous z-angle of this stuntDouble
879 gezelter 507 * @param angle new z-angle
880     * @see #getZangle
881     */
882 tim 963 void setPrevZangle(RealType angle) {
883 gezelter 507 ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_] = angle;
884     }
885 gezelter 246
886 gezelter 507 /**
887 chuckv 1245 * Sets the current z-angle of this stuntDouble
888 gezelter 507 * @param angle new z-angle
889     */
890 tim 963 void setZangle(RealType angle) {
891 gezelter 507 ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_] = angle;
892     }
893 gezelter 246
894 gezelter 507 /**
895 chuckv 1245 * Sets the z-angle of this stuntDouble in specified snapshot
896 gezelter 507 * @param angle z-angle to be set
897     * @param snapshotNo
898     * @see #getZangle
899     */
900 tim 963 void setZangle(RealType angle, int snapshotNo) {
901 gezelter 507 ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_] = angle;
902     }
903 gezelter 246
904 gezelter 507 /**
905 chuckv 1245 * Adds z-angle into the previous z-angle of this stuntDouble
906 gezelter 507 * @param angle new z-angle
907     * @see #getZangle
908     */
909 tim 963 void addPrevZangle(RealType angle) {
910 gezelter 507 ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_] += angle;
911     }
912 gezelter 246
913 gezelter 507 /**
914 chuckv 1245 * Adds z-angle into the current z-angle of this stuntDouble
915 gezelter 507 * @param angle new z-angle
916     */
917 tim 963 void addZangle(RealType angle) {
918 gezelter 507 ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_] += angle;
919     }
920 gezelter 246
921 gezelter 507 /**
922 chuckv 1245 * Adds z-angle into the z-angle of this stuntDouble in specified snapshot
923 gezelter 507 * @param angle z-angle to be add
924     * @param snapshotNo
925     * @see #getZangle
926     */
927 tim 963 void addZangle(RealType angle, int snapshotNo) {
928 gezelter 507 ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_] += angle;
929     }
930 gezelter 246
931 chuckv 1245 /** Set the force of this stuntDouble to zero */
932 gezelter 507 void zeroForcesAndTorques();
933     /**
934 chuckv 1245 * Returns the inertia tensor of this stuntDouble
935     * @return the inertia tensor of this stuntDouble
936 gezelter 507 */
937     virtual Mat3x3d getI() = 0;
938 gezelter 246
939 gezelter 507 /**
940 chuckv 1245 * Returns the gradient of this stuntDouble
941     * @return the gradient of this stuntDouble
942 gezelter 507 */
943 tim 963 virtual std::vector<RealType> getGrad() = 0;
944 gezelter 246
945 gezelter 507 /**
946 chuckv 1245 * Tests the if this stuntDouble is a linear rigidbody
947 gezelter 507 *
948 chuckv 1245 * @return true if this stuntDouble is a linear rigidbody, otherwise return false
949 gezelter 507 * @note atom and directional atom will always return false
950     *
951     * @see #linearAxis
952     */
953     bool isLinear() {
954     return linear_;
955     }
956 gezelter 246
957 gezelter 507 /**
958     * Returns the linear axis of the rigidbody, atom and directional atom will always return -1
959     *
960     * @return the linear axis of the rigidbody
961     *
962     * @see #isLinear
963     */
964     int linearAxis() {
965     return linearAxis_;
966     }
967 gezelter 246
968 chuckv 1245 /** Returns the mass of this stuntDouble */
969 tim 963 RealType getMass() {
970 gezelter 507 return mass_;
971     }
972 gezelter 246
973 gezelter 507 /**
974     * Sets the mass of this stuntdoulbe
975     * @param mass the mass to be set
976     */
977 tim 963 void setMass(RealType mass) {
978 gezelter 507 mass_ = mass;
979     }
980 gezelter 246
981 chuckv 1245 /** Returns the name of this stuntDouble */
982 gezelter 507 virtual std::string getType() = 0;
983 gezelter 246
984 chuckv 1245 /** Sets the name of this stuntDouble*/
985 gezelter 507 virtual void setType(const std::string& name) {}
986 gezelter 246
987 gezelter 507 /**
988     * Converts a lab fixed vector to a body fixed vector.
989     * @return body fixed vector
990     * @param v lab fixed vector
991     */
992     Vector3d lab2Body(const Vector3d& v) {
993     return getA() * v;
994     }
995 gezelter 246
996 gezelter 507 Vector3d lab2Body(const Vector3d& v, int frame) {
997     return getA(frame) * v;
998     }
999 tim 334
1000 gezelter 507 /**
1001     * Converts a body fixed vector to a lab fixed vector.
1002     * @return corresponding lab fixed vector
1003     * @param v body fixed vector
1004     */
1005     Vector3d body2Lab(const Vector3d& v){
1006     return getA().transpose() * v;
1007     }
1008 tim 334
1009 gezelter 507 Vector3d body2Lab(const Vector3d& v, int frame){
1010     return getA(frame).transpose() * v;
1011     }
1012 chuckv 1245
1013 gezelter 507 /**
1014     * <p>
1015 cli2 1360 * The purpose of the Visitor Pattern is to encapsulate an
1016     * operation that you want to perform on the elements of a data
1017     * structure. In this way, you can change the operation being
1018     * performed on a structure without the need of changing the
1019     * classes of the elements that you are operating on. Using a
1020     * Visitor pattern allows you to decouple the classes for the data
1021     * structure and the algorithms used upon them
1022 gezelter 507 * </p>
1023     * @param v visitor
1024     */
1025     virtual void accept(BaseVisitor* v) = 0;
1026 gezelter 246
1027 gezelter 507 //below functions are just forward functions
1028     /**
1029     * Adds property into property map
1030     * @param genData GenericData to be added into PropertyMap
1031     */
1032     void addProperty(GenericData* genData);
1033 gezelter 246
1034 gezelter 507 /**
1035     * Removes property from PropertyMap by name
1036     * @param propName the name of property to be removed
1037     */
1038     void removeProperty(const std::string& propName);
1039 gezelter 246
1040 gezelter 507 /**
1041     * clear all of the properties
1042     */
1043     void clearProperties();
1044 gezelter 246
1045 gezelter 507 /**
1046     * Returns all names of properties
1047     * @return all names of properties
1048     */
1049     std::vector<std::string> getPropertyNames();
1050 gezelter 246
1051 gezelter 507 /**
1052     * Returns all of the properties in PropertyMap
1053     * @return all of the properties in PropertyMap
1054     */
1055     std::vector<GenericData*> getProperties();
1056 gezelter 246
1057 gezelter 507 /**
1058     * Returns property
1059     * @param propName name of property
1060     * @return a pointer point to property with propName. If no property named propName
1061     * exists, return NULL
1062     */
1063     GenericData* getPropertyByName(const std::string& propName);
1064 gezelter 246
1065 gezelter 507 protected:
1066 gezelter 246
1067 gezelter 507 StuntDouble(ObjectType objType, DataStoragePointer storage);
1068 gezelter 246
1069 gezelter 507 StuntDouble(const StuntDouble& sd);
1070     StuntDouble& operator=(const StuntDouble& sd);
1071 gezelter 246
1072 gezelter 507 ObjectType objType_;
1073     DataStoragePointer storage_;
1074     SnapshotManager* snapshotMan_;
1075 gezelter 246
1076 gezelter 507 bool linear_;
1077     int linearAxis_;
1078 gezelter 246
1079    
1080 gezelter 507 int globalIndex_;
1081 tim 1024 int globalIntegrableObjectIndex_;
1082 gezelter 507 int localIndex_;
1083 gezelter 246
1084    
1085 tim 963 RealType mass_;
1086 gezelter 246
1087 gezelter 507 private:
1088 gezelter 246
1089 gezelter 507 PropertyMap properties_;
1090     };
1091 gezelter 2
1092 gezelter 1390 }//end namespace OpenMD
1093 gezelter 246 #endif //PRIMITIVES_STUNTDOUBLE_HPP

Properties

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