ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/ConstraintElement.hpp
Revision: 1452
Committed: Mon Aug 23 15:11:36 2004 UTC (19 years, 10 months ago) by tim
File size: 7161 byte(s)
Log Message:
*** empty log message ***

File Contents

# Content
1 #ifndef _CONSTRAINTELEMENT_H_
2 #define _CONSTRAINTELEMENT_H_
3
4 #include "RigidBody.hpp"
5 #include "Atom.hpp"
6 #include "Vector3d.hpp"
7
8
9 class Vector3dData : public GenericData{
10 public:
11 Vector3d getData() {return vec;}
12 void setData(const Vector3d& rhs) { vec = rhs;}
13 private:
14 Vector3d vec;
15
16 };
17
18 //class ConstraintElement is designed to not only provide the interface of StuntDouble, but also
19 //neccessary functionality to retrieve old position, old velocity and etc.
20 //First of all, those old data should be stored inside StuntDouble. We decide to store it on StuntDouble's
21 //generic property.
22 ////////////////////////////////////////////////////////////////////////////////
23 //Declaration of ConstraintElement
24 ////////////////////////////////////////////////////////////////////////////////
25 class ConstraintElement{
26 public:
27
28 virtual ~ConstraintElement() {}
29
30 //Interface of stunt double
31 bool isAtom() {return refSd->isAtom();}
32 bool isDirectionalAtom() {return refSd->isDirectional();}
33 bool isRigidBody() {return refSd->isRigidBody();}
34
35 double getMass(void) {return refSd->getMass();}
36
37 void getPos(double pos[3]) {refSd->getPos(pos);}
38 void setPos(double pos[3]) {refSd->setPos(pos);}
39
40 void getVel(double vel[3]) {refSd->getVel(vel);}
41 void setVel(double vel[3]) {refSd->setVel(vel);}
42
43 void getFrc(double frc[3]) {refSd->getFrc(frc);}
44 void addFrc(double frc[3]) {refSd->addFrc(frc);}
45
46 void getA(double A[3][3]) {refSd->getA(A);}
47 void setA(double A[3][3]) {refSd->setA(A);}
48
49 void getJ(double j[3]) {refSd->getJ(j);}
50 void setJ(double j[3]) {refSd->setJ(j);}
51
52 void getQ( double q[4] ) {refSd->getQ(q);}
53 void setQ( double q[4] ) {refSd->setQ(q);}
54
55 void setType(char* type){refSd->setType(type);}
56 char* getType() {return refSd->getType();}
57
58 void getTrq(double trq[3]) {refSd->getTrq(trq);}
59 void addTrq(double trq[3]) {refSd->addTrq(trq);}
60
61 void getI(double I[3][3]) {refSd->getI(I);}
62 void lab2Body(double vec[3]) {refSd->lab2Body(vec);}
63
64 void getGrad(double grad[6]) {refSd->getGrad(grad);}
65 void setEuler(double phi, double theta, double psi) {refSd->setEuler(phi, theta, psi);}
66 void getEulerAngles(double eulers[3]) {refSd->getEulerAngles(eulers);}
67
68 bool isLinear() {return refSd->isLinear();}
69 int linearAxis() {return refSd->linearAxis();}
70
71 double getZangle() {return refSd->getZangle();}
72 void setZangle(double zAngle) {refSd->setZangle(zAngle);}
73 void addZangle(double zAngle) {refSd->addZangle(zAngle);}
74
75 StuntDouble* getStuntDouble() {return refSd;}
76
77 virtual void getOldPos(double pos[3])=0;
78 virtual void getOldVel(double vel[3])=0;
79 virtual void getOldJ(double j[3])=0;
80 virtual void getOldA(double a[3][3])=0;
81 virtual void getOldQ(double q[4])=0;
82
83 bool getMoved() {return movedData->getData();}
84 void setMoved(bool status) {movedData->setData(status);}
85
86 bool getMoving() {return movingData->getData();}
87 void setMoving(bool status) {movingData->setData(status);}
88
89 //constraint force
90 void addConsForce(const Vector3d& frc){
91 Vector3d tempFrc;
92 tempFrc = consForceData->getData();
93 tempFrc += frc;
94 consForceData->setData(tempFrc);
95 }
96 Vector3d getConsForce() { return consForceData->getData();}
97 void setConsTorque(const Vector3d& frc) {consForceData->setData(frc);}
98
99
100 //constraint torque
101 void addConsTorque(const Vector3d& trq){
102 Vector3d tempTrq;
103 tempTrq = consTorqueData->getData();
104 tempTrq += trq;
105 consTorqueData->setData(tempTrq);
106 }
107 Vector3d getConsTorque() { return consTorqueData->getData();}
108 void setConsForce(const Vector3d& trq) {consTorqueData->setData(trq);}
109
110
111 virtual void saveOldState() = 0;
112
113 protected:
114 ConstraintElement(StuntDouble* rhs);
115
116 StuntDouble* refSd;
117
118 private:
119 BoolData* movedData;
120 BoolData* movingData;
121 Vector3dData* consForceData;
122 Vector3dData* consTorqueData;
123 };
124
125
126 ////////////////////////////////////////////////////////////////////////////////
127 //Declaration of ConsAtomData
128 ////////////////////////////////////////////////////////////////////////////////
129 struct ConsAtomInfo{
130 double pos[3];
131 double vel[3];
132 double a[3][3];
133 double j[3];
134 double q[4];
135 double frc[3];
136 double trq[3];
137 };
138
139 class ConsAtomData : public GenericData{
140 public:
141 ConsAtomData() : data(NULL){}
142 ~ConsAtomData(){
143 if(data != NULL)
144 delete data;
145 }
146
147 ConsAtomInfo* getData() {return data;}
148 void setData(ConsAtomInfo* info) {
149 if (data != NULL)
150 delete data;
151
152 data = info;
153 }
154
155 private:
156 ConsAtomInfo* data;
157 };
158 ////////////////////////////////////////////////////////////////////////////////
159 //Declaration of ConstraintElement
160 ////////////////////////////////////////////////////////////////////////////////
161 class ConstraintAtom : public ConstraintElement{
162 public:
163 ConstraintAtom(Atom* rhs);
164
165 void getOldPos(double pos[3]);
166 void getOldVel(double vel[3]);
167 void getOldJ(double j[3]);
168 void getOldA(double a[3][3]);
169 void getOldQ(double q[4]);
170
171 Atom* getAtom() {return dynamic_cast<Atom*>(refSd);}
172
173 virtual void saveOldState();
174
175 protected:
176 ConsAtomInfo* oldConsAtomInfo;
177
178 };
179
180
181
182 ////////////////////////////////////////////////////////////////////////////////
183 //Declaration of ConsRbData
184 ////////////////////////////////////////////////////////////////////////////////
185 class ConsRbData : public GenericData{
186 public:
187 ConsRbData() : rb(NULL){}
188 ~ConsRbData(){
189 if (rb != NULL)
190 delete rb;
191 }
192
193 RigidBody* getData() {return rb;}
194 void setData(RigidBody* rhs) {
195 if (rb != NULL)
196 delete rb;
197 rb = rhs;
198 }
199
200 private:
201 RigidBody* rb;
202 };
203
204 ////////////////////////////////////////////////////////////////////////////////
205 //Declaration of ConstraintElement
206 ////////////////////////////////////////////////////////////////////////////////
207 class ConstraintRigidBody : public ConstraintElement{
208 public:
209 ConstraintRigidBody(RigidBody*rhs, int index);
210
211 void getOldPos(double pos[3]) {oldRb->getPos(pos);}
212 void getOldVel(double vel[3]) {oldRb->getVel(vel);}
213 void getOldJ(double j[3]) {oldRb->getJ(j);}
214 void getOldA(double a[3][3]) {oldRb->getA(a);}
215 void getOldQ(double q[4]) {oldRb->getQ(q);}
216
217 void getOldAtomPos(double pos[3]) {oldRb->getAtomPos(pos, consAtomIndex);}
218 void getCurAtomPos(double pos[3]) {((RigidBody*)refSd)->getAtomPos(pos, consAtomIndex);}
219
220 void getOldAtomVel(double vel[3]) {oldRb->getAtomVel(vel, consAtomIndex);};
221 void getCurAtomVel(double vel[3]) {((RigidBody*)refSd)->getAtomVel(vel, consAtomIndex);};
222
223 void getRefCoor(double pos[3]) {return ((RigidBody*)refSd)->getAtomRefCoor(pos, consAtomIndex);}
224 RigidBody* getRigidBody() { return dynamic_cast<RigidBody*>(refSd);}
225
226 virtual void saveOldState();
227
228 void restoreUnconsStatus();
229
230
231 private:
232 int consAtomIndex;
233 RigidBody* oldRb;
234
235 };
236 #endif // endif _CONSTRAINTELEMENT_H_

Properties

Name Value
svn:executable *