ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/primitives/StuntDouble.hpp
Revision: 1360
Committed: Mon Sep 7 16:31:51 2009 UTC (15 years, 8 months ago) by cli2
Original Path: trunk/src/primitives/StuntDouble.hpp
File size: 33540 byte(s)
Log Message:
Added new restraint infrastructure
Added MolecularRestraints
Added ObjectRestraints
Added RestraintStamp
Updated thermodynamic integration to use ObjectRestraints
Added Quaternion mathematics for twist swing decompositions
Significantly updated RestWriter and RestReader to use dump-like files
Added selections for x, y, and z coordinates of atoms
Removed monolithic Restraints class
Fixed a few bugs in gradients of Euler angles in DirectionalAtom and RigidBody
Added some rotational capabilities to prinicpalAxisCalculator

File Contents

# Content
1 /*
2 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3 *
4 * The University of Notre Dame grants you ("Licensee") a
5 * non-exclusive, royalty free, license to use, modify and
6 * redistribute this software in source and binary code form, provided
7 * that the following conditions are met:
8 *
9 * 1. Acknowledgement of the program authors must be made in any
10 * publication of scientific results based in part on use of the
11 * program. An acceptable form of acknowledgement is citation of
12 * the article in which the program was described (Matthew
13 * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 * Parallel Simulation Engine for Molecular Dynamics,"
16 * J. Comput. Chem. 26, pp. 252-271 (2005))
17 *
18 * 2. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 *
21 * 3. Redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the
24 * distribution.
25 *
26 * This software is provided "AS IS," without a warranty of any
27 * kind. All express or implied conditions, representations and
28 * warranties, including any implied warranty of merchantability,
29 * fitness for a particular purpose or non-infringement, are hereby
30 * excluded. The University of Notre Dame and its licensors shall not
31 * be liable for any damages suffered by licensee as a result of
32 * using, modifying or distributing the software or its
33 * derivatives. In no event will the University of Notre Dame or its
34 * licensors be liable for any lost revenue, profit or data, or for
35 * direct, indirect, special, consequential, incidental or punitive
36 * damages, however caused and regardless of the theory of liability,
37 * arising out of the use of or inability to use software, even if the
38 * University of Notre Dame has been advised of the possibility of
39 * such damages.
40 */
41
42 /**
43 * @file StuntDouble.hpp
44 * @author tlin
45 * @date 10/22/2004
46 * @version 1.0
47 */
48
49 #ifndef PRIMITIVES_STUNTDOUBLE_HPP
50 #define PRIMITIVES_STUNTDOUBLE_HPP
51
52 #include <vector>
53
54 #include "visitors/BaseVisitor.hpp"
55 #include "math/Quaternion.hpp"
56 #include "math/SquareMatrix3.hpp"
57 #include "math/Vector3.hpp"
58 #include "utils/PropertyMap.hpp"
59 #include "brains/Snapshot.hpp"
60 #include "brains/SnapshotManager.hpp"
61 namespace oopse{
62
63
64
65 /**
66 * @class StuntDouble StuntDouble.hpp "Primitives/StuntDouble.hpp"
67 * @brief
68 * "Don't move, or you're dead! Stand up! Captain, we've got them!"
69 *
70 * "Spectacular stunt, my friends, but all for naught. Turn around
71 * please. Ha. What a pity. What a pity. So, Princess, you thought
72 * you could outwit the imperious forces of...."
73 *
74 * "You idiots! These are not them. You've captured their stunt
75 * doubles! Search the area. Find them! Find them!"
76 *
77 * StuntDouble is a very strange idea. A StuntDouble stands in for
78 * some object that can be manipulated by the Integrators or
79 * Minimizers. Some of the manipulable objects are Atoms, some are
80 * DirectionalAtoms, and some are RigidBodies. StuntDouble
81 * provides an interface for the Integrators and Minimizers to use,
82 * and does some preliminary sanity checking so that the program
83 * doesn't try to do something stupid like torque an Atom (The
84 * quotes above are from Spaceballs...)
85 *
86 * @note the dynamic data of stuntDouble will be stored outside of the class
87 */
88 class StuntDouble{
89 public:
90
91 enum ObjectType{
92 otAtom,
93 otDAtom,
94 otRigidBody
95 };
96
97 virtual ~StuntDouble();
98
99 /**
100 * Returns the global index of this stuntDouble.
101 * @return the global index of this stuntDouble
102 */
103 int getGlobalIndex() {
104 return globalIndex_;
105 }
106
107 /**
108 * Sets the global index of this stuntDouble.
109 * @param new global index to be set
110 */
111 void setGlobalIndex(int index) {
112 globalIndex_ = index;
113 }
114
115 /**
116 * Returns the local index of this stuntDouble
117 * @return the local index of this stuntDouble
118 */
119 int getLocalIndex() {
120 return localIndex_;
121 }
122
123 /**
124 * Sets the local index of this stuntDouble
125 * @param index new index to be set
126 */
127 void setLocalIndex(int index) {
128 localIndex_ = index;
129 }
130
131 int getGlobalIntegrableObjectIndex(){
132 return globalIntegrableObjectIndex_;
133 }
134 void setGlobalIntegrableObjectIndex(int index) {
135 globalIntegrableObjectIndex_ = index;
136 }
137
138 /**
139 * Sets the Snapshot Manager of this stuntDouble
140 */
141 void setSnapshotManager(SnapshotManager* sman) {
142 snapshotMan_ = sman;
143 }
144
145 /**
146 * Tests if this stuntDouble is an atom
147 * @return true is this stuntDouble is an atom(or a directional atom), return false otherwise
148 */
149 bool isAtom(){
150 return objType_ == otAtom || objType_ == otDAtom;
151 }
152
153 /**
154 * Tests if this stuntDouble is an directional atom
155 * @return true if this stuntDouble is an directional atom, return false otherwise
156 */
157 bool isDirectionalAtom(){
158 return objType_ == otDAtom;
159 }
160
161 /**
162 * Tests if this stuntDouble is a rigid body.
163 * @return true if this stuntDouble is a rigid body, otherwise return false
164 */
165 bool isRigidBody(){
166 return objType_ == otRigidBody;
167 }
168
169 /**
170 * 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 */
173 bool isDirectional(){
174 return isDirectionalAtom() || isRigidBody();
175 }
176
177 /**
178 * 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 * Returns the previous position of this stuntDouble
202 * @return the position of this stuntDouble
203 */
204 Vector3d getPrevPos() {
205 return ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_];
206 }
207
208 /**
209 * Returns the current position of this stuntDouble
210 * @return the position of this stuntDouble
211 */
212 Vector3d getPos() {
213 return ((snapshotMan_->getCurrentSnapshot())->*storage_).position[localIndex_];
214 }
215
216 /**
217 * Returns the position of this stuntDouble in specified snapshot
218 * @return the position of this stuntDouble
219 * @param snapshotNo
220 */
221 Vector3d getPos(int snapshotNo) {
222 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_];
223 }
224
225 /**
226 * Sets the previous position of this stuntDouble
227 * @param pos new position
228 * @see #getPos
229 */
230 void setPrevPos(const Vector3d& pos) {
231 ((snapshotMan_->getPrevSnapshot())->*storage_).position[localIndex_] = pos;
232 }
233
234 /**
235 * Sets the current position of this stuntDouble
236 * @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
244 /**
245 * Sets the position of this stuntDouble in specified snapshot
246 * @param pos position to be set
247 * @param snapshotNo
248 * @see #getPos
249 */
250 void setPos(const Vector3d& pos, int snapshotNo) {
251
252 ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).position[localIndex_] = pos;
253
254 }
255
256 /**
257 * Returns the previous velocity of this stuntDouble
258 * @return the velocity of this stuntDouble
259 */
260 Vector3d getPrevVel() {
261 return ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_];
262 }
263
264 /**
265 * Returns the current velocity of this stuntDouble
266 * @return the velocity of this stuntDouble
267 */
268 Vector3d getVel() {
269 return ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_];
270 }
271
272 /**
273 * Returns the velocity of this stuntDouble in specified snapshot
274 * @return the velocity of this stuntDouble
275 * @param snapshotNo
276 */
277 Vector3d getVel(int snapshotNo) {
278 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).velocity[localIndex_];
279 }
280
281 /**
282 * Sets the previous velocity of this stuntDouble
283 * @param vel new velocity
284 * @see #getVel
285 */
286 void setPrevVel(const Vector3d& vel) {
287 ((snapshotMan_->getPrevSnapshot())->*storage_).velocity[localIndex_] = vel;
288 }
289
290 /**
291 * Sets the current velocity of this stuntDouble
292 * @param vel new velocity
293 */
294 void setVel(const Vector3d& vel) {
295 ((snapshotMan_->getCurrentSnapshot())->*storage_).velocity[localIndex_] = vel;
296 }
297
298 /**
299 * Sets the velocity of this stuntDouble in specified snapshot
300 * @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
308 /**
309 * Returns the previous rotation matrix of this stuntDouble
310 * @return the rotation matrix of this stuntDouble
311 */
312 RotMat3x3d getPrevA() {
313 return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_];
314 }
315
316 /**
317 * Returns the current rotation matrix of this stuntDouble
318 * @return the rotation matrix of this stuntDouble
319 */
320 RotMat3x3d getA() {
321 return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_];
322 }
323
324 /**
325 * Returns the rotation matrix of this stuntDouble in specified snapshot
326 *
327 * @return the rotation matrix of this stuntDouble
328 * @param snapshotNo
329 */
330 RotMat3x3d getA(int snapshotNo) {
331 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_];
332 }
333
334 /**
335 * Sets the previous rotation matrix of this stuntDouble
336 * @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
343 /**
344 * Sets the current rotation matrix of this stuntDouble
345 * @param a new rotation matrix
346 */
347 virtual void setA(const RotMat3x3d& a) {
348 ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = a;
349 }
350
351 /**
352 * Sets the rotation matrix of this stuntDouble in specified snapshot
353 * @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
361 /**
362 * Returns the previous angular momentum of this stuntDouble (body-fixed).
363 * @return the angular momentum of this stuntDouble
364 */
365 Vector3d getPrevJ() {
366 return ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_];
367 }
368
369 /**
370 * Returns the current angular momentum of this stuntDouble (body -fixed).
371 * @return the angular momentum of this stuntDouble
372 */
373 Vector3d getJ() {
374 return ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_];
375 }
376
377 /**
378 * Returns the angular momentum of this stuntDouble in specified snapshot (body-fixed).
379 * @return the angular momentum of this stuntDouble
380 * @param snapshotNo
381 */
382 Vector3d getJ(int snapshotNo) {
383 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).angularMomentum[localIndex_];
384 }
385
386 /**
387 * Sets the previous angular momentum of this stuntDouble (body-fixed).
388 * @param angMom new angular momentum
389 * @see #getJ
390 */
391 void setPrevJ(const Vector3d& angMom) {
392 ((snapshotMan_->getPrevSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
393 }
394
395 /**
396 * Sets the current angular momentum of this stuntDouble (body-fixed).
397 * @param angMom new angular momentum
398 */
399 void setJ(const Vector3d& angMom) {
400 ((snapshotMan_->getCurrentSnapshot())->*storage_).angularMomentum[localIndex_] = angMom;
401 }
402
403 /**
404 * Sets the angular momentum of this stuntDouble in specified snapshot(body-fixed).
405 * @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
413 /**
414 * Returns system Center of Mass for stuntDouble frame from snapshot
415 *
416 */
417 Vector3d getCOM(){
418 return (snapshotMan_->getCurrentSnapshot())->getCOM();
419 }
420
421 /**
422 * Returns system Center of Mass velocity for stuntDouble frame from snapshot
423 *
424 */
425
426 Vector3d getCOMvel(){
427 return (snapshotMan_->getCurrentSnapshot())->getCOMvel();
428 }
429
430 /**
431 * Returns system Center of Mass angular momentum for stuntDouble frame from snapshot
432 *
433 */
434 Vector3d getCOMw(){
435 return (snapshotMan_->getCurrentSnapshot())->getCOMw();
436 }
437
438 /**
439 * Returns system Center of Mass for stuntDouble frame from snapshot
440 *
441 */
442 Vector3d getCOM(int snapshotNo){
443 return (snapshotMan_->getSnapshot(snapshotNo))->getCOM();
444 }
445
446 /**
447 * Returns system Center of Mass velocity for stuntDouble frame from snapshot
448 *
449 */
450
451 Vector3d getCOMvel(int snapshotNo){
452 return (snapshotMan_->getSnapshot(snapshotNo))->getCOMvel();
453 }
454
455 /**
456 * Returns system Center of Mass angular momentum for stuntDouble frame from snapshot
457 *
458 */
459 Vector3d getCOMw(int snapshotNo){
460 return (snapshotMan_->getSnapshot(snapshotNo))->getCOMw();
461 }
462
463 /**
464 * Returns the previous quaternion of this stuntDouble
465 * @return the quaternion of this stuntDouble
466 */
467 Quat4d getPrevQ() {
468 return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
469 }
470
471 /**
472 * Returns the current quaternion of this stuntDouble
473 * @return the quaternion of this stuntDouble
474 */
475 Quat4d getQ() {
476 return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toQuaternion();
477 }
478
479 /**
480 * Returns the quaternion of this stuntDouble in specified snapshot
481 * @return the quaternion of this stuntDouble
482 * @param snapshotNo
483 */
484 Quat4d getQ(int snapshotNo) {
485 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toQuaternion();
486 }
487
488 /**
489 * Sets the previous quaternion of this stuntDouble
490 * @param q new quaternion
491 * @note actual storage data is rotation matrix
492 */
493 void setPrevQ(const Quat4d& q) {
494 setPrevA(q);
495 }
496
497 /**
498 * Sets the current quaternion of this stuntDouble
499 * @param q new quaternion
500 * @note actual storage data is rotation matrix
501 */
502 void setQ(const Quat4d& q) {
503 setA(q);
504 }
505
506 /**
507 * Sets the quaternion of this stuntDouble in specified snapshot
508 *
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
517 /**
518 * Returns the previous euler angles of this stuntDouble
519 * @return the euler angles of this stuntDouble
520 */
521 Vector3d getPrevEuler() {
522 return ((snapshotMan_->getPrevSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
523 }
524
525 /**
526 * Returns the current euler angles of this stuntDouble
527 * @return the euler angles of this stuntDouble
528 */
529 Vector3d getEuler() {
530 return ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_].toEulerAngles();
531 }
532
533 /**
534 * Returns the euler angles of this stuntDouble in specified snapshot.
535 * @return the euler angles of this stuntDouble
536 * @param snapshotNo
537 */
538 Vector3d getEuler(int snapshotNo) {
539 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).aMat[localIndex_].toEulerAngles();
540 }
541
542 /**
543 * Sets the previous euler angles of this stuntDouble.
544 * @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
552 /**
553 * Sets the current euler angles of this stuntDouble
554 * @param euler new euler angles
555 */
556 void setEuler(const Vector3d& euler) {
557 ((snapshotMan_->getCurrentSnapshot())->*storage_).aMat[localIndex_] = euler;
558 }
559
560 /**
561 * Sets the euler angles of this stuntDouble in specified snapshot
562 *
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
571 /**
572 * Returns the previous unit vectors of this stuntDouble
573 * @return the unit vectors of this stuntDouble
574 */
575 RotMat3x3d getPrevElectroFrame() {
576 return ((snapshotMan_->getPrevSnapshot())->*storage_).electroFrame[localIndex_];
577 }
578
579 /**
580 * Returns the current unit vectors of this stuntDouble
581 * @return the unit vectors of this stuntDouble
582 */
583 RotMat3x3d getElectroFrame() {
584 return ((snapshotMan_->getCurrentSnapshot())->*storage_).electroFrame[localIndex_];
585 }
586
587 /**
588 * Returns the unit vectors of this stuntDouble in specified snapshot
589 *
590 * @return the unit vectors of this stuntDouble
591 * @param snapshotNo
592 */
593 RotMat3x3d getElectroFrame(int snapshotNo) {
594 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).electroFrame[localIndex_];
595 }
596
597 /**
598 * Returns the previous force of this stuntDouble
599 * @return the force of this stuntDouble
600 */
601 Vector3d getPrevFrc() {
602 return ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_];
603 }
604
605 /**
606 * Returns the current force of this stuntDouble
607 * @return the force of this stuntDouble
608 */
609 Vector3d getFrc() {
610 return ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_];
611 }
612
613 /**
614 * Returns the force of this stuntDouble in specified snapshot
615 *
616 * @return the force of this stuntDouble
617 * @param snapshotNo
618 */
619 Vector3d getFrc(int snapshotNo) {
620 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).force[localIndex_];
621 }
622
623 /**
624 * Sets the previous force of this stuntDouble
625 *
626 * @param frc new force
627 * @see #getFrc
628 */
629 void setPrevFrc(const Vector3d& frc) {
630 ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] = frc;
631 }
632
633 /**
634 * Sets the current force of this stuntDouble
635 * @param frc new force
636 */
637 void setFrc(const Vector3d& frc) {
638 ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] = frc;
639 }
640
641 /**
642 * Sets the force of this stuntDouble in specified snapshot
643 *
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
652 /**
653 * Adds force into the previous force of this stuntDouble
654 *
655 * @param frc new force
656 * @see #getFrc
657 */
658 void addPrevFrc(const Vector3d& frc) {
659 ((snapshotMan_->getPrevSnapshot())->*storage_).force[localIndex_] += frc;
660 }
661
662 /**
663 * Adds force into the current force of this stuntDouble
664 * @param frc new force
665 */
666 void addFrc(const Vector3d& frc) {
667 ((snapshotMan_->getCurrentSnapshot())->*storage_).force[localIndex_] += frc;
668 }
669
670 /**
671 * Adds force into the force of this stuntDouble in specified snapshot
672 *
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
681 /**
682 * Returns the previous torque of this stuntDouble
683 * @return the torque of this stuntDouble
684 */
685 Vector3d getPrevTrq() {
686 return ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_];
687 }
688
689 /**
690 * Returns the current torque of this stuntDouble
691 * @return the torque of this stuntDouble
692 */
693 Vector3d getTrq() {
694 return ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_];
695 }
696
697 /**
698 * Returns the torque of this stuntDouble in specified snapshot
699 *
700 * @return the torque of this stuntDouble
701 * @param snapshotNo
702 */
703 Vector3d getTrq(int snapshotNo) {
704 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).torque[localIndex_];
705 }
706
707 /**
708 * Sets the previous torque of this stuntDouble
709 *
710 * @param trq new torque
711 * @see #getTrq
712 */
713 void setPrevTrq(const Vector3d& trq) {
714 ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] = trq;
715 }
716
717 /**
718 * Sets the current torque of this stuntDouble
719 * @param trq new torque
720 */
721 void setTrq(const Vector3d& trq) {
722 ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] = trq;
723 }
724
725 /**
726 * Sets the torque of this stuntDouble in specified snapshot
727 *
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
736 /**
737 * Adds torque into the previous torque of this stuntDouble
738 *
739 * @param trq new torque
740 * @see #getTrq
741 */
742 void addPrevTrq(const Vector3d& trq) {
743 ((snapshotMan_->getPrevSnapshot())->*storage_).torque[localIndex_] += trq;
744 }
745
746 /**
747 * Adds torque into the current torque of this stuntDouble
748 * @param trq new torque
749 */
750 void addTrq(const Vector3d& trq) {
751 ((snapshotMan_->getCurrentSnapshot())->*storage_).torque[localIndex_] += trq;
752 }
753
754 /**
755 * Adds torque into the torque of this stuntDouble in specified snapshot
756 *
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
765
766
767 /**
768 * 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 * Returns the previous z-angle of this stuntDouble
854 * @return the z-angle of this stuntDouble
855 */
856 RealType getPrevZangle() {
857 return ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_];
858 }
859
860 /**
861 * Returns the current z-angle of this stuntDouble
862 * @return the z-angle of this stuntDouble
863 */
864 RealType getZangle() {
865 return ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_];
866 }
867
868 /**
869 * Returns the z-angle of this stuntDouble in specified snapshot
870 * @return the z-angle of this stuntDouble
871 * @param snapshotNo
872 */
873 RealType getZangle(int snapshotNo) {
874 return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_];
875 }
876
877 /**
878 * Sets the previous z-angle of this stuntDouble
879 * @param angle new z-angle
880 * @see #getZangle
881 */
882 void setPrevZangle(RealType angle) {
883 ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_] = angle;
884 }
885
886 /**
887 * Sets the current z-angle of this stuntDouble
888 * @param angle new z-angle
889 */
890 void setZangle(RealType angle) {
891 ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_] = angle;
892 }
893
894 /**
895 * Sets the z-angle of this stuntDouble in specified snapshot
896 * @param angle z-angle to be set
897 * @param snapshotNo
898 * @see #getZangle
899 */
900 void setZangle(RealType angle, int snapshotNo) {
901 ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_] = angle;
902 }
903
904 /**
905 * Adds z-angle into the previous z-angle of this stuntDouble
906 * @param angle new z-angle
907 * @see #getZangle
908 */
909 void addPrevZangle(RealType angle) {
910 ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_] += angle;
911 }
912
913 /**
914 * Adds z-angle into the current z-angle of this stuntDouble
915 * @param angle new z-angle
916 */
917 void addZangle(RealType angle) {
918 ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_] += angle;
919 }
920
921 /**
922 * Adds z-angle into the z-angle of this stuntDouble in specified snapshot
923 * @param angle z-angle to be add
924 * @param snapshotNo
925 * @see #getZangle
926 */
927 void addZangle(RealType angle, int snapshotNo) {
928 ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_] += angle;
929 }
930
931 /** Set the force of this stuntDouble to zero */
932 void zeroForcesAndTorques();
933 /**
934 * Returns the inertia tensor of this stuntDouble
935 * @return the inertia tensor of this stuntDouble
936 */
937 virtual Mat3x3d getI() = 0;
938
939 /**
940 * Returns the gradient of this stuntDouble
941 * @return the gradient of this stuntDouble
942 */
943 virtual std::vector<RealType> getGrad() = 0;
944
945 /**
946 * Tests the if this stuntDouble is a linear rigidbody
947 *
948 * @return true if this stuntDouble is a linear rigidbody, otherwise return false
949 * @note atom and directional atom will always return false
950 *
951 * @see #linearAxis
952 */
953 bool isLinear() {
954 return linear_;
955 }
956
957 /**
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
968 /** Returns the mass of this stuntDouble */
969 RealType getMass() {
970 return mass_;
971 }
972
973 /**
974 * Sets the mass of this stuntdoulbe
975 * @param mass the mass to be set
976 */
977 void setMass(RealType mass) {
978 mass_ = mass;
979 }
980
981 /** Returns the name of this stuntDouble */
982 virtual std::string getType() = 0;
983
984 /** Sets the name of this stuntDouble*/
985 virtual void setType(const std::string& name) {}
986
987 /**
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
996 Vector3d lab2Body(const Vector3d& v, int frame) {
997 return getA(frame) * v;
998 }
999
1000 /**
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
1009 Vector3d body2Lab(const Vector3d& v, int frame){
1010 return getA(frame).transpose() * v;
1011 }
1012
1013 /**
1014 * <p>
1015 * 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 * </p>
1023 * @param v visitor
1024 */
1025 virtual void accept(BaseVisitor* v) = 0;
1026
1027 //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
1034 /**
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
1040 /**
1041 * clear all of the properties
1042 */
1043 void clearProperties();
1044
1045 /**
1046 * Returns all names of properties
1047 * @return all names of properties
1048 */
1049 std::vector<std::string> getPropertyNames();
1050
1051 /**
1052 * Returns all of the properties in PropertyMap
1053 * @return all of the properties in PropertyMap
1054 */
1055 std::vector<GenericData*> getProperties();
1056
1057 /**
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
1065 protected:
1066
1067 StuntDouble(ObjectType objType, DataStoragePointer storage);
1068
1069 StuntDouble(const StuntDouble& sd);
1070 StuntDouble& operator=(const StuntDouble& sd);
1071
1072 ObjectType objType_;
1073 DataStoragePointer storage_;
1074 SnapshotManager* snapshotMan_;
1075
1076 bool linear_;
1077 int linearAxis_;
1078
1079
1080 int globalIndex_;
1081 int globalIntegrableObjectIndex_;
1082 int localIndex_;
1083
1084
1085 RealType mass_;
1086
1087 private:
1088
1089 PropertyMap properties_;
1090 };
1091
1092 }//end namespace oopse
1093 #endif //PRIMITIVES_STUNTDOUBLE_HPP

Properties

Name Value
svn:executable *