ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/RigidBody.hpp
Revision: 1100
Committed: Mon Apr 12 21:02:01 2004 UTC (20 years, 2 months ago) by gezelter
File size: 2573 byte(s)
Log Message:
Adding RigidBody code

File Contents

# User Rev Content
1 gezelter 1100 #ifndef __RIGIDBODY_HPP__
2     #define __RIGIDBODY_HPP__
3    
4     #include <vector>
5     //#include "Atom.hpp"
6     //#include "AtomStamp.hpp"
7     #include "RigidBodyStamp.hpp"
8     #include "StuntDouble.hpp"
9     using namespace std;
10    
11     class Atom;
12     class AtomStamp;
13    
14     typedef struct {
15     double vec[3];
16     double& operator[](int index) {return vec[index];}
17     } vec3;
18    
19     typedef struct {
20     double mat[3][3];
21     double* operator[](int index) {return mat[index];}
22     } mat3x3;
23    
24     class RigidBody : public StuntDouble {
25    
26     public:
27    
28     RigidBody();
29     virtual ~RigidBody();
30    
31     void addAtom(Atom* at, AtomStamp* ats);
32    
33     void getPos( double theP[3] );
34     void setPos( double theP[3] );
35    
36     void getVel( double theV[3] );
37     void setVel( double theV[3] );
38    
39     void getFrc( double theF[3] );
40     void addFrc( double theF[3] );
41     void zeroForces();
42    
43     double getMass( void ) { return mass; }
44    
45     void printAmatIndex( void );
46     void setEulerAngles( double phi, double theta, double psi );
47     void getQ( double the_q[4] ); // get the quanternions
48     void setQ( double the_q[4] );
49    
50     void getA( double the_A[3][3] ); // get the full rotation matrix
51     void setA( double the_A[3][3] );
52    
53     void getJ( double theJ[3] );
54     void setJ( double theJ[3] );
55    
56     void getTrq( double theT[3] );
57     void addTrq( double theT[3] );
58    
59     void getI( double the_I[3][3] );
60     void lab2Body( double r[3] );
61     void body2Lab( double r[3] );
62    
63     void calcRefCoords( void );
64     void doEulerToRotMat(vec3 &euler, mat3x3 &myA );
65     void calcForcesAndTorques( void );
66     void updateAtoms( void );
67    
68     //void yourAtomsHaveMoved( void );
69    
70     // Four functions added for derivatives with respect to Euler Angles:
71     // (Needed for minimization routines):
72    
73     void getGrad(double gradient[6] );
74     void getEulerAngles( double myEuler[3] );
75    
76     double max(double x, double y);
77     double min(double x, double y);
78    
79    
80     // utility routines
81    
82     void findCOM( void );
83     void findOrient( void );
84    
85     protected:
86    
87     double mass; // the total mass
88     double pos[3]; // the position array (center of mass)
89     double vel[3]; // the velocity array (center of mass)
90     double frc[3]; // the force array (center of mass)
91     double trq[3]; // the torque vector ( space fixed )
92     double ji[3]; // the angular momentum vector (body fixed)
93     double A[3][3]; // the rotation matrix
94     double I[3][3]; // the inertial tensor (body fixed)
95     double sU[3][3]; // the standard unit vectors (body fixed)
96    
97     vector<Atom*> myAtoms; // the vector of atoms
98     vector<vec3> refCoords;
99     vector<mat3x3> refOrients;
100    
101     bool com_good;
102     bool forces_good;
103     bool precalc_done;
104     bool orient_good;
105     };
106    
107     #endif