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

# 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. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the
15 * distribution.
16 *
17 * This software is provided "AS IS," without a warranty of any
18 * kind. All express or implied conditions, representations and
19 * warranties, including any implied warranty of merchantability,
20 * fitness for a particular purpose or non-infringement, are hereby
21 * excluded. The University of Notre Dame and its licensors shall not
22 * be liable for any damages suffered by licensee as a result of
23 * using, modifying or distributing the software or its
24 * derivatives. In no event will the University of Notre Dame or its
25 * licensors be liable for any lost revenue, profit or data, or for
26 * direct, indirect, special, consequential, incidental or punitive
27 * damages, however caused and regardless of the theory of liability,
28 * arising out of the use of or inability to use software, even if the
29 * University of Notre Dame has been advised of the possibility of
30 * such damages.
31 *
32 * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
33 * research, please cite the appropriate papers when you publish your
34 * work. Good starting points are:
35 *
36 * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
37 * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
38 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).
39 * [4] Vardeman & Gezelter, in progress (2009).
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 OpenMD{
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 OpenMD
1093 #endif //PRIMITIVES_STUNTDOUBLE_HPP

Properties

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