ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-3.0/src/primitives/StuntDouble.hpp
Revision: 1692
Committed: Mon Nov 1 20:15:58 2004 UTC (19 years, 7 months ago) by tim
File size: 29614 byte(s)
Log Message:
break, break and break.....

File Contents

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

Properties

Name Value
svn:executable *