ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/constraints/ConstraintElem.hpp
Revision: 2204
Committed: Fri Apr 15 22:04:00 2005 UTC (19 years, 2 months ago) by gezelter
File size: 23819 byte(s)
Log Message:
xemacs has been drafted to perform our indentation services

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 #ifndef CONSTRAINTS_CONTRAINTELEM_HPP
43 #define CONSTRAINTS_CONTRAINTELEM_HPP
44
45 #include "primitives/StuntDouble.hpp"
46 #include "utils/GenericData.hpp"
47 #include "utils/simError.h"
48 namespace oopse {
49
50 /**
51 * @class ConstraintElem ConstraintElem.hpp "constraints/ConstraintElem.hpp"
52 * An adapter class of StuntDouble which is used at constraint algorithm
53 */
54
55 class ConstraintElem{
56 public:
57 ConstraintElem(StuntDouble* sd) : sd_(sd) {
58 GenericData* movedData = sd_->getPropertyByName("Moved");
59 if (movedData !=NULL) { //if generic data with keyword "moved" exists, assign it to moved_
60 moved_ = dynamic_cast<BoolGenericData*>(movedData);
61 if (moved_ == NULL) {
62 sprintf(painCave.errMsg,
63 "Generic Data with keyword Moved exists, however, it can not be casted to a BoolGenericData.\n");
64 painCave.isFatal = 1;;
65 simError();
66 }
67 }else { //if generic data with keyword "moved" does not exist, create it
68 moved_ = new BoolGenericData("Moved");
69 sd_->addProperty(moved_);
70 }
71
72 GenericData* movingData = sd_->getPropertyByName("Moving");
73 if (movingData !=NULL) {
74 moving_ = dynamic_cast<BoolGenericData*>(movingData);
75 if (moving_ == NULL) {
76 sprintf(painCave.errMsg,
77 "Generic Data with keyword Moving exists, however, it can not be casted to a BoolGenericData.\n");
78 painCave.isFatal = 1;;
79 simError();
80 }
81 }else {
82 moving_ = new BoolGenericData("Moving");
83 sd_->addProperty(moving_);
84 }
85
86 }
87
88 bool getMoved() { return moved_->getData(); }
89 void setMoved(bool moved) { moved_->setData(moved);}
90
91 bool getMoving() { return moving_->getData(); }
92 void setMoving(bool moving) { moving_->setData(moving); }
93
94 StuntDouble* getStuntDouble() { return sd_; }
95
96 /**
97 * Returns the global index of this stuntdouble.
98 * @return the global index of this stuntdouble
99 */
100 int getGlobalIndex() {
101 return sd_->getGlobalIndex();
102 }
103
104 /**
105 * Sets the global index of this stuntdouble.
106 * @param new global index to be set
107 */
108 void setGlobalIndex(int index) {
109 sd_->setGlobalIndex(index);
110 }
111
112 /**
113 * Returns the local index of this stuntdouble
114 * @return the local index of this stuntdouble
115 */
116 int getLocalIndex() {
117 return sd_->getLocalIndex();
118 }
119
120 /**
121 * Sets the local index of this stuntdouble
122 * @param index new index to be set
123 */
124 void setLocalIndex(int index) {
125 sd_->setLocalIndex(index);
126 }
127
128 /**
129 * Sets the Snapshot Manager of this stuntdouble
130 */
131 void setSnapshotManager(SnapshotManager* sman) {
132 sd_->setSnapshotManager(sman);
133 }
134
135 /**
136 * Tests if this stuntdouble is an atom
137 * @return true is this stuntdouble is an atom(or a directional atom), return false otherwise
138 */
139 bool isAtom(){
140 return sd_->isAtom();
141 }
142
143 /**
144 * Tests if this stuntdouble is an directional atom
145 * @return true if this stuntdouble is an directional atom, return false otherwise
146 */
147 bool isDirectionalAtom(){
148 return sd_->isDirectional();
149 }
150
151 /**
152 * Tests if this stuntdouble is a rigid body.
153 * @return true if this stuntdouble is a rigid body, otherwise return false
154 */
155 bool isRigidBody(){
156 return sd_->isRigidBody();
157 }
158
159 /**
160 * Tests if this stuntdouble is a directional one.
161 * @return true is this stuntdouble is a directional atom or a rigid body, return false otherwise
162 */
163 bool isDirectional(){
164 return sd_->isDirectional();
165 }
166
167 /**
168 * Returns the previous position of this stuntdouble
169 * @return the position of this stuntdouble
170 */
171 Vector3d getPrevPos() {
172 return sd_->getPrevPos();
173 }
174
175 /**
176 * Returns the current position of this stuntdouble
177 * @return the position of this stuntdouble
178 */
179 Vector3d getPos() {
180 return sd_->getPos();
181 }
182
183 /**
184 * Returns the position of this stuntdouble in specified snapshot
185 * @return the position of this stuntdouble
186 * @param snapshotNo
187 */
188 Vector3d getPos(int snapshotNo) {
189 return sd_->getPos(snapshotNo);
190 }
191
192 /**
193 * Sets the previous position of this stuntdouble
194 * @param pos new position
195 * @see #getPos
196 */
197 void setPrevPos(const Vector3d& pos) {
198 sd_->setPrevPos(pos);
199 }
200
201 /**
202 * Sets the current position of this stuntdouble
203 * @param pos new position
204 */
205 void setPos(const Vector3d& pos) {
206 sd_->setPos(pos);
207 }
208
209 /**
210 * Sets the position of this stuntdouble in specified snapshot
211 * @param pos position to be set
212 * @param snapshotNo
213 * @see #getPos
214 */
215 void setPos(const Vector3d& pos, int snapshotNo) {
216 sd_->setPos(pos, snapshotNo);
217 }
218
219 /**
220 * Returns the previous velocity of this stuntdouble
221 * @return the velocity of this stuntdouble
222 */
223 Vector3d getPrevVel() {
224 return sd_->getPrevVel();
225 }
226
227 /**
228 * Returns the current velocity of this stuntdouble
229 * @return the velocity of this stuntdouble
230 */
231 Vector3d getVel() {
232 return sd_->getVel();
233 }
234
235 /**
236 * Returns the velocity of this stuntdouble in specified snapshot
237 * @return the velocity of this stuntdouble
238 * @param snapshotNo
239 */
240
241 Vector3d getVel(int snapshotNo) {
242 return sd_->getVel(snapshotNo);
243 }
244
245 /**
246 * Sets the previous velocity of this stuntdouble
247 * @param vel new velocity
248 * @see #getVel
249 */
250 void setPrevVel(const Vector3d& vel) {
251 sd_->setPrevVel(vel);
252 }
253
254 /**
255 * Sets the current velocity of this stuntdouble
256 * @param vel new velocity
257 */
258 void setVel(const Vector3d& vel) {
259 sd_->setVel(vel);
260 }
261
262 /**
263 * Sets the velocity of this stuntdouble in specified snapshot
264 * @param vel velocity to be set
265 * @param snapshotNo
266 * @see #getVel
267 */
268 void setVel(const Vector3d& vel, int snapshotNo) {
269 sd_->setVel(vel, snapshotNo);
270 }
271
272 /**
273 * Returns the previous rotation matrix of this stuntdouble
274 * @return the rotation matrix of this stuntdouble
275 */
276 RotMat3x3d getPrevA() {
277 return sd_->getPrevA();
278 }
279
280 /**
281 * Returns the current rotation matrix of this stuntdouble
282 * @return the rotation matrix of this stuntdouble
283 */
284 RotMat3x3d getA() {
285 return sd_->getA();
286 }
287
288 /**
289 * Returns the rotation matrix of this stuntdouble in specified snapshot
290 *
291 * @return the rotation matrix of this stuntdouble
292 * @param snapshotNo
293 */
294 RotMat3x3d getA(int snapshotNo) {
295 return sd_->getA(snapshotNo);
296 }
297
298 /**
299 * Sets the previous rotation matrix of this stuntdouble
300 * @param a new rotation matrix
301 * @see #getA
302 */
303 void setPrevA(const RotMat3x3d& a) {
304 sd_->setPrevA(a);
305 }
306
307 /**
308 * Sets the current rotation matrix of this stuntdouble
309 * @param a new rotation matrix
310 */
311 void setA(const RotMat3x3d& a) {
312 sd_->setA(a);
313 }
314
315 /**
316 * Sets the rotation matrix of this stuntdouble in specified snapshot
317 * @param a rotation matrix to be set
318 * @param snapshotNo
319 * @see #getA
320 */
321 void setA(const RotMat3x3d& a, int snapshotNo) {
322 sd_->setA(a, snapshotNo);
323 }
324
325 /**
326 * Returns the previous angular momentum of this stuntdouble (body-fixed).
327 * @return the angular momentum of this stuntdouble
328 */
329 Vector3d getPrevJ() {
330 return sd_->getPrevJ();
331 }
332
333 /**
334 * Returns the current angular momentum of this stuntdouble (body -fixed).
335 * @return the angular momentum of this stuntdouble
336 */
337 Vector3d getJ() {
338 return sd_->getJ();
339 }
340
341 /**
342 * Returns the angular momentum of this stuntdouble in specified snapshot (body-fixed).
343 * @return the angular momentum of this stuntdouble
344 * @param snapshotNo
345 */
346 Vector3d getJ(int snapshotNo) {
347 return sd_->getJ(snapshotNo);
348 }
349
350 /**
351 * Sets the previous angular momentum of this stuntdouble (body-fixed).
352 * @param angMom new angular momentum
353 * @see #getJ
354 */
355 void setPrevJ(const Vector3d& angMom) {
356 sd_->setPrevJ(angMom);
357 }
358
359 /**
360 * Sets the current angular momentum of this stuntdouble (body-fixed).
361 * @param angMom new angular momentum
362 */
363 void setJ(const Vector3d& angMom) {
364 sd_->setJ(angMom);
365 }
366
367 /**
368 * Sets the angular momentum of this stuntdouble in specified snapshot(body-fixed).
369 * @param angMom angular momentum to be set
370 * @param snapshotNo
371 * @see #getJ
372 */
373 void setJ(const Vector3d& angMom, int snapshotNo) {
374 sd_->setJ(angMom, snapshotNo);
375 }
376
377 /**
378 * Returns the previous quaternion of this stuntdouble
379 * @return the quaternion of this stuntdouble
380 */
381 Quat4d getPrevQ() {
382 return sd_->getPrevQ();
383 }
384
385 /**
386 * Returns the current quaternion of this stuntdouble
387 * @return the quaternion of this stuntdouble
388 */
389 Quat4d getQ() {
390 return sd_->getQ();
391 }
392
393 /**
394 * Returns the quaternion of this stuntdouble in specified snapshot
395 * @return the quaternion of this stuntdouble
396 * @param snapshotNo
397 */
398 Quat4d getQ(int snapshotNo) {
399 return sd_->getQ(snapshotNo);
400 }
401
402 /**
403 * Sets the previous quaternion of this stuntdouble
404 * @param q new quaternion
405 * @note actual storage data is rotation matrix
406 */
407 void setPrevQ(const Quat4d& q) {
408 sd_->setPrevQ(q);
409 }
410
411 /**
412 * Sets the current quaternion of this stuntdouble
413 * @param q new quaternion
414 * @note actual storage data is rotation matrix
415 */
416 void setQ(const Quat4d& q) {
417 sd_->setQ(q);
418 }
419
420 /**
421 * Sets the quaternion of this stuntdouble in specified snapshot
422 *
423 * @param q quaternion to be set
424 * @param snapshotNo
425 * @note actual storage data is rotation matrix
426 */
427 void setQ(const Quat4d& q, int snapshotNo) {
428 sd_->setQ(q, snapshotNo);
429 }
430
431 /**
432 * Returns the previous euler angles of this stuntdouble
433 * @return the euler angles of this stuntdouble
434 */
435 Vector3d getPrevEuler() {
436 return sd_->getPrevEuler();
437 }
438
439 /**
440 * Returns the current euler angles of this stuntdouble
441 * @return the euler angles of this stuntdouble
442 */
443 Vector3d getEuler() {
444 return sd_->getEuler();
445 }
446
447 /**
448 * Returns the euler angles of this stuntdouble in specified snapshot.
449 * @return the euler angles of this stuntdouble
450 * @param snapshotNo
451 */
452 Vector3d getEuler(int snapshotNo) {
453 return sd_->getEuler(snapshotNo);
454 }
455
456 /**
457 * Sets the previous euler angles of this stuntdouble.
458 * @param euler new euler angles
459 * @see #getEuler
460 * @note actual storage data is rotation matrix
461 */
462 void setPrevEuler(const Vector3d& euler) {
463 sd_->setPrevEuler(euler);
464 }
465
466 /**
467 * Sets the current euler angles of this stuntdouble
468 * @param euler new euler angles
469 */
470 void setEuler(const Vector3d& euler) {
471 sd_->setEuler(euler);
472 }
473
474 /**
475 * Sets the euler angles of this stuntdouble in specified snapshot
476 *
477 * @param euler euler angles to be set
478 * @param snapshotNo
479 * @note actual storage data is rotation matrix
480 */
481 void setEuler(const Vector3d& euler, int snapshotNo) {
482 sd_->setEuler(euler, snapshotNo);
483 }
484
485 /**
486 * Returns the previous unit vectors of this stuntdouble
487 * @return the unit vectors of this stuntdouble
488 */
489 RotMat3x3d getPrevElectroFrame() {
490 return sd_->getPrevElectroFrame();
491 }
492
493 /**
494 * Returns the current unit vectors of this stuntdouble
495 * @return the unit vectors of this stuntdouble
496 */
497 RotMat3x3d getElectroFrame() {
498 return sd_->getElectroFrame();
499 }
500
501 /**
502 * Returns the unit vectors of this stuntdouble in specified snapshot
503 *
504 * @return the unit vectors of this stuntdouble
505 * @param snapshotNo
506 */
507 RotMat3x3d getElectroFrame(int snapshotNo) {
508 return sd_->getElectroFrame(snapshotNo);
509 }
510
511 /**
512 * Returns the previous force of this stuntdouble
513 * @return the force of this stuntdouble
514 */
515 Vector3d getPrevFrc() {
516 return sd_->getPrevFrc();
517 }
518
519 /**
520 * Returns the current force of this stuntdouble
521 * @return the force of this stuntdouble
522 */
523 Vector3d getFrc() {
524 return sd_->getFrc();
525 }
526
527 /**
528 * Returns the force of this stuntdouble in specified snapshot
529 *
530 * @return the force of this stuntdouble
531 * @param snapshotNo
532 */
533 Vector3d getFrc(int snapshotNo) {
534 return sd_->getFrc(snapshotNo);
535 }
536
537 /**
538 * Sets the previous force of this stuntdouble
539 *
540 * @param frc new force
541 * @see #getFrc
542 */
543 void setPrevFrc(const Vector3d& frc) {
544 sd_->setPrevFrc(frc);
545 }
546
547 /**
548 * Sets the current force of this stuntdouble
549 * @param frc new force
550 */
551 void setFrc(const Vector3d& frc) {
552 sd_->setFrc(frc);
553 }
554
555 /**
556 * Sets the force of this stuntdouble in specified snapshot
557 *
558 * @param frc force to be set
559 * @param snapshotNo
560 * @see #getFrc
561 */
562 void setFrc(const Vector3d& frc, int snapshotNo) {
563 sd_->setFrc(frc, snapshotNo);
564 }
565
566 /**
567 * Adds force into the previous force of this stuntdouble
568 *
569 * @param frc new force
570 * @see #getFrc
571 */
572 void addPrevFrc(const Vector3d& frc) {
573 sd_->addPrevFrc(frc);
574 }
575
576 /**
577 * Adds force into the current force of this stuntdouble
578 * @param frc new force
579 */
580 void addFrc(const Vector3d& frc) {
581 sd_->addFrc(frc);
582 }
583
584 /**
585 * Adds force into the force of this stuntdouble in specified snapshot
586 *
587 * @param frc force to be set
588 * @param snapshotNo
589 * @see #getFrc
590 */
591 void addFrc(const Vector3d& frc, int snapshotNo) {
592 sd_->addFrc(frc, snapshotNo);
593 }
594
595 /**
596 * Returns the previous torque of this stuntdouble
597 * @return the torque of this stuntdouble
598 */
599 Vector3d getPrevTrq() {
600 return sd_->getPrevTrq();
601 }
602
603 /**
604 * Returns the current torque of this stuntdouble
605 * @return the torque of this stuntdouble
606 */
607 Vector3d getTrq() {
608 return sd_->getTrq();
609 }
610
611 /**
612 * Returns the torque of this stuntdouble in specified snapshot
613 *
614 * @return the torque of this stuntdouble
615 * @param snapshotNo
616 */
617 Vector3d getTrq(int snapshotNo) {
618 return sd_->getTrq(snapshotNo);
619 }
620
621 /**
622 * Sets the previous torque of this stuntdouble
623 *
624 * @param trq new torque
625 * @see #getTrq
626 */
627 void setPrevTrq(const Vector3d& trq) {
628 sd_->setPrevTrq(trq);
629 }
630
631 /**
632 * Sets the current torque of this stuntdouble
633 * @param trq new torque
634 */
635 void setTrq(const Vector3d& trq) {
636 sd_->setTrq(trq);
637 }
638
639 /**
640 * Sets the torque of this stuntdouble in specified snapshot
641 *
642 * @param trq torque to be set
643 * @param snapshotNo
644 * @see #getTrq
645 */
646 void setTrq(const Vector3d& trq, int snapshotNo) {
647 sd_->setTrq(trq, snapshotNo);
648 }
649
650 /**
651 * Adds torque into the previous torque of this stuntdouble
652 *
653 * @param trq new torque
654 * @see #getTrq
655 */
656 void addPrevTrq(const Vector3d& trq) {
657 sd_->addPrevTrq(trq);
658 }
659
660 /**
661 * Adds torque into the current torque of this stuntdouble
662 * @param trq new torque
663 */
664 void addTrq(const Vector3d& trq) {
665 sd_->addTrq(trq);
666 }
667
668 /**
669 * Adds torque into the torque of this stuntdouble in specified snapshot
670 *
671 * @param trq torque to be add
672 * @param snapshotNo
673 * @see #getTrq
674 */
675 void addTrq(const Vector3d& trq, int snapshotNo) {
676 sd_->addTrq(trq, snapshotNo);
677 }
678
679 /** Set the force of this stuntdouble to zero */
680 void zeroForcesAndTorques() {
681 sd_->zeroForcesAndTorques();
682 }
683 /**
684 * Returns the inertia tensor of this stuntdouble
685 * @return the inertia tensor of this stuntdouble
686 */
687 Mat3x3d getI() {
688 return sd_->getI();
689 }
690
691 /**
692 * Returns the gradient of this stuntdouble
693 * @return the gradient of this stuntdouble
694 */
695 std::vector<double> getGrad() {
696 return sd_->getGrad();
697 }
698
699 /**
700 * Tests the if this stuntdouble is a linear rigidbody
701 *
702 * @return true if this stuntdouble is a linear rigidbody, otherwise return false
703 * @note atom and directional atom will always return false
704 *
705 * @see #linearAxis
706 */
707 bool isLinear() {
708 return sd_->isLinear();
709 }
710
711 /**
712 * Returns the linear axis of the rigidbody, atom and directional atom will always return -1
713 *
714 * @return the linear axis of the rigidbody
715 *
716 * @see #isLinear
717 */
718 int linearAxis() {
719 return sd_->linearAxis();
720 }
721
722 /** Returns the mass of this stuntdouble */
723 double getMass() {
724 return sd_->getMass();
725 }
726
727 /**
728 * Sets the mass of this stuntdoulbe
729 * @param mass the mass to be set
730 */
731 void setMass(double mass) {
732 sd_->setMass(mass);
733 }
734
735 /** Returns the name of this stuntdouble */
736 std::string getType() {
737 return sd_->getType();
738 }
739
740 /** Sets the name of this stuntdouble*/
741 void setType(const std::string& name) {
742 sd_->setType(name);
743 }
744
745 /**
746 * Converts a lab fixed vector to a body fixed vector.
747 * @return body fixed vector
748 * @param v lab fixed vector
749 */
750 Vector3d lab2Body(const Vector3d& v) {
751 return sd_->lab2Body(v);
752 }
753
754 /**
755 * Converts a body fixed vector to a lab fixed vector.
756 * @return corresponding lab fixed vector
757 * @param v body fixed vector
758 */
759 Vector3d body2Lab(const Vector3d& v){
760 return sd_->body2Lab(v);
761 }
762 /**
763 * <p>
764 * The purpose of the Visitor Pattern is to encapsulate an operation that you want to perform on
765 * the elements of a data structure. In this way, you can change the operation being performed
766 * on a structure without the need of changing the classes of the elements that you are operating
767 * on. Using a Visitor pattern allows you to decouple the classes for the data structure and the
768 * algorithms used upon them
769 * </p>
770 * @param v visitor
771 */
772 void accept(BaseVisitor* v) {
773 sd_->accept(v);
774 }
775
776 //below functions are just forward functions
777 /**
778 * Adds property into property map
779 * @param genData GenericData to be added into PropertyMap
780 */
781 void addProperty(GenericData* genData){
782 sd_->addProperty(genData);
783 }
784
785 /**
786 * Removes property from PropertyMap by name
787 * @param propName the name of property to be removed
788 */
789 void removeProperty(const std::string& propName) {
790 sd_->removeProperty(propName);
791 }
792
793 /**
794 * clear all of the properties
795 */
796 void clearProperties() {
797 sd_->clearProperties();
798 }
799
800 /**
801 * Returns all names of properties
802 * @return all names of properties
803 */
804 std::vector<std::string> getPropertyNames() {
805 return sd_->getPropertyNames();
806 }
807
808 /**
809 * Returns all of the properties in PropertyMap
810 * @return all of the properties in PropertyMap
811 */
812 std::vector<GenericData*> getProperties() {
813 return sd_->getProperties();
814 }
815
816 /**
817 * Returns property
818 * @param propName name of property
819 * @return a pointer point to property with propName. If no property named propName
820 * exists, return NULL
821 */
822 GenericData* getPropertyByName(const std::string& propName) {
823 return sd_->getPropertyByName(propName);
824 }
825
826 private:
827 StuntDouble* sd_;
828 BoolGenericData* moved_;
829 BoolGenericData* moving_;
830 };
831
832 }
833
834 #endif

Properties

Name Value
svn:executable *