| 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 | 
| 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{ | 
| 97 |  | virtual ~StuntDouble(); | 
| 98 |  |  | 
| 99 |  | /** | 
| 100 | < | * Returns the global index of this stuntdouble. | 
| 100 | > | * Returns the global index of this stuntRealType. | 
| 101 |  | * @return  the global index of this stuntdouble | 
| 102 |  | */ | 
| 103 |  | int getGlobalIndex() { | 
| 105 |  | } | 
| 106 |  |  | 
| 107 |  | /** | 
| 108 | < | * Sets the global index of this stuntdouble. | 
| 108 | > | * Sets the global index of this stuntRealType. | 
| 109 |  | * @param new global index to be set | 
| 110 |  | */ | 
| 111 |  | void setGlobalIndex(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 |  | */ | 
| 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 |  | */ | 
| 409 |  | void setJ(const Vector3d& angMom, int snapshotNo) { | 
| 410 |  | ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).angularMomentum[localIndex_] = angMom; | 
| 411 |  | } | 
| 412 | < |  | 
| 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 | 
| 540 |  | } | 
| 541 |  |  | 
| 542 |  | /** | 
| 543 | < | * Sets  the previous euler angles of this stuntdouble. | 
| 543 | > | * Sets  the previous euler angles of this stuntRealType. | 
| 544 |  | * @param euler  new euler angles | 
| 545 |  | * @see #getEuler | 
| 546 |  | * @note actual storage data is rotation matrix | 
| 767 |  | * Returns the previous z-angle of this stuntdouble | 
| 768 |  | * @return the z-angle of this stuntdouble | 
| 769 |  | */ | 
| 770 | < | double getPrevZangle() { | 
| 770 | > | RealType getPrevZangle() { | 
| 771 |  | return ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_]; | 
| 772 |  | } | 
| 773 |  |  | 
| 775 |  | * Returns the current z-angle of this stuntdouble | 
| 776 |  | * @return the z-angle of this stuntdouble | 
| 777 |  | */ | 
| 778 | < | double getZangle() { | 
| 778 | > | RealType getZangle() { | 
| 779 |  | return ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_]; | 
| 780 |  | } | 
| 781 |  |  | 
| 784 |  | * @return the z-angle of this stuntdouble | 
| 785 |  | * @param snapshotNo | 
| 786 |  | */ | 
| 787 | < | double getZangle(int snapshotNo) { | 
| 787 | > | RealType getZangle(int snapshotNo) { | 
| 788 |  | return ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_]; | 
| 789 |  | } | 
| 790 |  |  | 
| 793 |  | * @param angle  new z-angle | 
| 794 |  | * @see #getZangle | 
| 795 |  | */ | 
| 796 | < | void setPrevZangle(double angle) { | 
| 796 | > | void setPrevZangle(RealType angle) { | 
| 797 |  | ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_] = angle; | 
| 798 |  | } | 
| 799 |  |  | 
| 801 |  | * Sets  the current z-angle of this stuntdouble | 
| 802 |  | * @param angle  new z-angle | 
| 803 |  | */ | 
| 804 | < | void setZangle(double angle) { | 
| 804 | > | void setZangle(RealType angle) { | 
| 805 |  | ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_] = angle; | 
| 806 |  | } | 
| 807 |  |  | 
| 811 |  | * @param snapshotNo | 
| 812 |  | * @see #getZangle | 
| 813 |  | */ | 
| 814 | < | void setZangle(double angle, int snapshotNo) { | 
| 814 | > | void setZangle(RealType angle, int snapshotNo) { | 
| 815 |  | ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_] = angle; | 
| 816 |  | } | 
| 817 |  |  | 
| 820 |  | * @param angle  new z-angle | 
| 821 |  | * @see #getZangle | 
| 822 |  | */ | 
| 823 | < | void addPrevZangle(double angle) { | 
| 823 | > | void addPrevZangle(RealType angle) { | 
| 824 |  | ((snapshotMan_->getPrevSnapshot())->*storage_).zAngle[localIndex_] += angle; | 
| 825 |  | } | 
| 826 |  |  | 
| 828 |  | * Adds z-angle into the current z-angle of this stuntdouble | 
| 829 |  | * @param angle  new z-angle | 
| 830 |  | */ | 
| 831 | < | void addZangle(double angle) { | 
| 831 | > | void addZangle(RealType angle) { | 
| 832 |  | ((snapshotMan_->getCurrentSnapshot())->*storage_).zAngle[localIndex_] += angle; | 
| 833 |  | } | 
| 834 |  |  | 
| 838 |  | * @param snapshotNo | 
| 839 |  | * @see #getZangle | 
| 840 |  | */ | 
| 841 | < | void addZangle(double angle, int snapshotNo) { | 
| 841 | > | void addZangle(RealType angle, int snapshotNo) { | 
| 842 |  | ((snapshotMan_->getSnapshot(snapshotNo))->*storage_).zAngle[localIndex_] += angle; | 
| 843 |  | } | 
| 844 |  |  | 
| 854 |  | * Returns the gradient of this stuntdouble | 
| 855 |  | * @return the gradient of this stuntdouble | 
| 856 |  | */ | 
| 857 | < | virtual std::vector<double> getGrad() = 0; | 
| 857 | > | virtual std::vector<RealType> getGrad() = 0; | 
| 858 |  |  | 
| 859 |  | /** | 
| 860 |  | * Tests the  if this stuntdouble is a  linear rigidbody | 
| 880 |  | } | 
| 881 |  |  | 
| 882 |  | /** Returns the mass of this stuntdouble */ | 
| 883 | < | double getMass() { | 
| 883 | > | RealType getMass() { | 
| 884 |  | return mass_; | 
| 885 |  | } | 
| 886 |  |  | 
| 888 |  | * Sets the mass of this stuntdoulbe | 
| 889 |  | * @param mass the mass to be set | 
| 890 |  | */ | 
| 891 | < | void setMass(double mass) { | 
| 891 | > | void setMass(RealType mass) { | 
| 892 |  | mass_ = mass; | 
| 893 |  | } | 
| 894 |  |  | 
| 895 |  | /** Returns the name of this stuntdouble */ | 
| 896 |  | virtual std::string getType() = 0; | 
| 897 |  |  | 
| 898 | < | /** Sets the name of this stuntdouble*/ | 
| 898 | > | /** Sets the name of this stuntRealType*/ | 
| 899 |  | virtual void setType(const std::string& name) {} | 
| 900 |  |  | 
| 901 |  | /** | 
| 989 |  |  | 
| 990 |  |  | 
| 991 |  | int globalIndex_; | 
| 992 | + | int globalIntegrableObjectIndex_; | 
| 993 |  | int localIndex_; | 
| 994 |  |  | 
| 995 |  |  | 
| 996 | < | double mass_; | 
| 996 | > | RealType mass_; | 
| 997 |  |  | 
| 998 |  | private: | 
| 999 |  |  |