--- trunk/OOPSE/libmdtools/ConstraintElement.hpp 2004/06/03 21:51:55 1232 +++ trunk/OOPSE/libmdtools/ConstraintElement.hpp 2004/08/23 15:11:36 1452 @@ -3,8 +3,18 @@ #include "RigidBody.hpp" #include "Atom.hpp" +#include "Vector3d.hpp" +class Vector3dData : public GenericData{ + public: + Vector3d getData() {return vec;} + void setData(const Vector3d& rhs) { vec = rhs;} + private: + Vector3d vec; + +}; + //class ConstraintElement is designed to not only provide the interface of StuntDouble, but also //neccessary functionality to retrieve old position, old velocity and etc. //First of all, those old data should be stored inside StuntDouble. We decide to store it on StuntDouble's @@ -62,6 +72,7 @@ class ConstraintElement{ void setZangle(double zAngle) {refSd->setZangle(zAngle);} void addZangle(double zAngle) {refSd->addZangle(zAngle);} + StuntDouble* getStuntDouble() {return refSd;} virtual void getOldPos(double pos[3])=0; virtual void getOldVel(double vel[3])=0; @@ -75,6 +86,28 @@ class ConstraintElement{ bool getMoving() {return movingData->getData();} void setMoving(bool status) {movingData->setData(status);} + //constraint force + void addConsForce(const Vector3d& frc){ + Vector3d tempFrc; + tempFrc = consForceData->getData(); + tempFrc += frc; + consForceData->setData(tempFrc); + } + Vector3d getConsForce() { return consForceData->getData();} + void setConsTorque(const Vector3d& frc) {consForceData->setData(frc);} + + + //constraint torque + void addConsTorque(const Vector3d& trq){ + Vector3d tempTrq; + tempTrq = consTorqueData->getData(); + tempTrq += trq; + consTorqueData->setData(tempTrq); + } + Vector3d getConsTorque() { return consTorqueData->getData();} + void setConsForce(const Vector3d& trq) {consTorqueData->setData(trq);} + + virtual void saveOldState() = 0; protected: @@ -85,7 +118,8 @@ class ConstraintElement{ private: BoolData* movedData; BoolData* movingData; - + Vector3dData* consForceData; + Vector3dData* consTorqueData; }; @@ -98,6 +132,8 @@ struct ConsAtomInfo{ double a[3][3]; double j[3]; double q[4]; + double frc[3]; + double trq[3]; }; class ConsAtomData : public GenericData{ @@ -180,13 +216,21 @@ class ConstraintRigidBody : public ConstraintElement{ void getOldAtomPos(double pos[3]) {oldRb->getAtomPos(pos, consAtomIndex);} void getCurAtomPos(double pos[3]) {((RigidBody*)refSd)->getAtomPos(pos, consAtomIndex);} - + + void getOldAtomVel(double vel[3]) {oldRb->getAtomVel(vel, consAtomIndex);}; + void getCurAtomVel(double vel[3]) {((RigidBody*)refSd)->getAtomVel(vel, consAtomIndex);}; + + void getRefCoor(double pos[3]) {return ((RigidBody*)refSd)->getAtomRefCoor(pos, consAtomIndex);} RigidBody* getRigidBody() { return dynamic_cast(refSd);} virtual void saveOldState(); + + void restoreUnconsStatus(); + private: int consAtomIndex; RigidBody* oldRb; + }; #endif // endif _CONSTRAINTELEMENT_H_