ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Atom.hpp
Revision: 393
Committed: Mon Mar 24 18:33:51 2003 UTC (21 years, 3 months ago) by mmeineke
File size: 8651 byte(s)
Log Message:
little bug fixes here and there

File Contents

# Content
1 #ifndef _ATOM_H_
2 #define _ATOM_H_
3
4 #include <cstring>
5 #include <cstdlib>
6 #include <iostream>
7
8 class Atom{
9 public:
10 Atom(int theIndex) {
11 c_n_hyd = 0;
12 has_dipole = 0;
13 is_VDW = 0;
14 is_LJ = 0;
15
16 index = theIndex;
17 offset = 3 * index;
18 offsetX = offset;
19 offsetY = offset+1;
20 offsetZ = offset+2;
21
22 Axx = index*9;
23 Axy = Axx+1;
24 Axz = Axx+2;
25
26 Ayx = Axx+3;
27 Ayy = Axx+4;
28 Ayz = Axx+5;
29
30 Azx = Axx+6;
31 Azy = Axx+7;
32 Azz = Axx+8;
33 }
34 virtual ~Atom() {}
35
36 static void createArrays (int nElements) {
37 int i;
38
39 pos = new double[nElements*3];
40 vel = new double[nElements*3];
41 frc = new double[nElements*3];
42 trq = new double[nElements*3];
43 Amat = new double[nElements*9];
44 mu = new double[nElements];
45 ul = new double[nElements*3];
46
47 // init directional values to zero
48
49 for( i=0; i<nElements; i++){
50 trq[i] = 0.0;
51 trq[i+1] = 0.0;
52 trq[i+2] = 0.0;
53
54 Amat[i] = 1.0;
55 Amat[i+1] = 0.0;
56 Amat[i+2] = 0.0;
57
58 Amat[i+3] = 0.0;
59 Amat[i+4] = 1.0;
60 Amat[i+5] = 0.0;
61
62 Amat[i+6] = 0.0;
63 Amat[i+7] = 0.0;
64 Amat[i+8] = 1.0;
65
66 mu[i] = 0.0;
67
68 ul[i] = 1.0;
69 ul[i+1] = 0.0;
70 ul[i+2] = 0.0;
71 }
72 }
73 static void destroyArrays(void) {
74 delete[] pos;
75 delete[] vel;
76 delete[] frc;
77 delete[] trq;
78 delete[] Amat;
79 delete[] mu;
80 }
81
82 static double* getPosArray( void ) { return pos; }
83 static double* getVelArray( void ) { return vel; }
84 static double* getFrcArray( void ) { return frc; }
85 static double* getTrqArray( void ) { return trq; }
86 static double* getAmatArray( void ) { return Amat; }
87 static double* getMuArray( void ) { return mu; }
88 static double* getUlArray( void ) { return ul; }
89
90 double getX() const {return pos[offsetX];}
91 double getY() const {return pos[offsetY];}
92 double getZ() const {return pos[offsetZ];}
93 void setX(double x) {pos[offsetX] = x;}
94 void setY(double y) {pos[offsetY] = y;}
95 void setZ(double z) {pos[offsetZ] = z;}
96
97 double get_vx() const {return vel[offsetX];}
98 double get_vy() const {return vel[offsetY];}
99 double get_vz() const {return vel[offsetZ];}
100 void set_vx(double vx) {vel[offsetX] = vx;}
101 void set_vy(double vy) {vel[offsetY] = vy;}
102 void set_vz(double vz) {vel[offsetZ] = vz;}
103
104 double getFx() const {return frc[offsetX];}
105 double getFy() const {return frc[offsetY];}
106 double getFz() const {return frc[offsetZ];}
107 void addFx(double add) {frc[offsetX] += add;}
108 void addFy(double add) {frc[offsetY] += add;}
109 void addFz(double add) {frc[offsetZ] += add;}
110 virtual void zeroForces() = 0;
111
112 double getMass() const {return c_mass;}
113 void setMass(double mass) {c_mass = mass;}
114
115 double getSigma() const {return c_sigma;}
116 void setSigma(double sigma) {c_sigma = sigma;}
117
118 double getEpslon() const {return c_epslon;}
119 void setEpslon(double epslon) {c_epslon = epslon;}
120
121 double getCovalent() const {return c_covalent;}
122 void setCovalent(double covalent) {c_covalent = covalent;}
123
124 int getIndex() const {return index;}
125 void setIndex(int theIndex) {
126 index = theIndex;
127 offset = index*3;
128 offsetX = offset;
129 offsetY = offset+1;
130 offsetZ = offset+2;
131
132 Axx = index*9;
133 Axy = Axx+1;
134 Axz = Axx+2;
135
136 Ayx = Axx+3;
137 Ayy = Axx+4;
138 Ayz = Axx+5;
139
140 Azx = Axx+6;
141 Azy = Axx+7;
142 Azz = Axx+8;
143 }
144
145 char *getType() {return c_name;}
146 void setType(char * name) {strcpy(c_name,name);}
147
148 int getIdent( void ) { return ident; }
149 void setIdent( int info ) { ident = info; }
150
151 #ifdef IS_MPI
152 int getGlobalIndex( void ) { return myGlobalIndex; }
153 void setGlobalIndex( int info ) { myGlobalIndex = info; }
154 #endif // is_mpi
155
156 void set_n_hydrogens( int n_h ) {c_n_hyd = n_h;}
157 int get_n_hydrogens() const {return c_n_hyd;}
158
159 void setHasDipole( int value ) { has_dipole = value; }
160 int hasDipole( void ) { return has_dipole; }
161
162 void setLJ( void ) { is_LJ = 1; is_VDW = 0; }
163 int isLJ( void ) { return is_LJ; }
164
165 void seVDW( void ) { is_VDW = 1; is_LJ = 0; }
166 int isVDW( void ) { return is_VDW; }
167
168 virtual int isDirectional( void ) = 0;
169
170 static double* pos; // the position array
171 static double* vel; // the velocity array
172 static double* frc; // the forc array
173 static double* trq; // the torque vector ( space fixed )
174 static double* Amat; // the rotation matrix
175 static double* mu; // the dipole moment array
176 static double* ul; // the lab frame unit directional vector
177
178 protected:
179
180 double c_mass; /* the mass of the atom in amu */
181 double c_sigma; /* the sigma parameter for van der walls interactions */
182 double c_epslon; /* the esplon parameter for VDW interactions */
183 double c_covalent; // The covalent radius of the atom.
184
185 int index; /* set the atom's index */
186 int offset; // the atom's offset in the storage array
187 int offsetX, offsetY, offsetZ;
188
189 int Axx, Axy, Axz; // the rotational matrix indices
190 int Ayx, Ayy, Ayz;
191 int Azx, Azy, Azz;
192
193 char c_name[100]; /* it's name */
194 int ident; // it's unique numeric identity.
195
196 int c_n_hyd; // the number of hydrogens bonded to the atom
197
198 int has_dipole; // dipole boolean
199 int is_VDW; // VDW boolean
200 int is_LJ; // LJ boolean
201
202 #ifdef IS_MPI
203 int myGlobalIndex;
204 #endif
205
206 };
207
208
209
210 class GeneralAtom : public Atom{
211
212 public:
213 GeneralAtom(int theIndex): Atom(theIndex){}
214 virtual ~GeneralAtom(){}
215
216 int isDirectional( void ){ return 0; }
217 void zeroForces() {
218 frc[offsetX] = 0.0;
219 frc[offsetY] = 0.0;
220 frc[offsetZ] = 0.0;
221 }
222 };
223
224 class DirectionalAtom : public Atom {
225
226 public:
227 DirectionalAtom(int theIndex) : Atom(theIndex)
228 {
229 ssdIdentity = 0;
230 sux = 0.0;
231 suy = 0.0;
232 suz = 0.0;
233 }
234 virtual ~DirectionalAtom() {}
235
236 int isDirectional(void) { return 1; }
237
238 void setSSD( int value) { ssdIdentity = value; }
239 int isSSD(void) {return ssdIdentity; }
240
241 void setA( double the_A[3][3] );
242
243 void setI( double the_I[3][3] );
244
245 void setQ( double the_q[4] );
246
247 void setEuler( double phi, double theta, double psi );
248
249 void setSUx( double the_sux ) { sux = the_sux; }
250 void setSUy( double the_suy ) { suy = the_suy; }
251 void setSUz( double the_suz ) { suz = the_suz; }
252
253 void setJx( double the_jx ) { jx = the_jx; }
254 void setJy( double the_jy ) { jy = the_jy; }
255 void setJz( double the_jz ) { jz = the_jz; }
256
257 void addTx( double the_tx ) { trq[offsetX] += the_tx;}
258 void addTy( double the_ty ) { trq[offsetY] += the_ty;}
259 void addTz( double the_tz ) { trq[offsetZ] += the_tz;}
260
261 void zeroForces() {
262 frc[offsetX] = 0.0;
263 frc[offsetY] = 0.0;
264 frc[offsetZ] = 0.0;
265
266 trq[offsetX] = 0.0;
267 trq[offsetY] = 0.0;
268 trq[offsetZ] = 0.0;
269 }
270
271 double getAxx( void ) { return Amat[Axx]; }
272 double getAxy( void ) { return Amat[Axy]; }
273 double getAxz( void ) { return Amat[Axz]; }
274
275 double getAyx( void ) { return Amat[Ayx]; }
276 double getAyy( void ) { return Amat[Ayy]; }
277 double getAyz( void ) { return Amat[Ayz]; }
278
279 double getAzx( void ) { return Amat[Azx]; }
280 double getAzy( void ) { return Amat[Azy]; }
281 double getAzz( void ) { return Amat[Azz]; }
282
283 void getA( double the_A[3][3] ); // get the full rotation matrix
284
285 double getSUx( void ) { return sux; }
286 double getSUy( void ) { return suy; }
287 double getSUz( void ) { return suz; }
288
289 void getU( double the_u[3] ); // get the unit vetor
290 void getQ( double the_q[4] ); // get the quanternions
291
292 double getJx( void ) { return jx; }
293 double getJy( void ) { return jy; }
294 double getJz( void ) { return jz; }
295
296 double getTx( void ) { return trq[offsetX];}
297 double getTy( void ) { return trq[offsetY]; }
298 double getTz( void ) { return trq[offsetZ]; }
299
300 double getIxx( void ) { return Ixx; }
301 double getIxy( void ) { return Ixy; }
302 double getIxz( void ) { return Ixz; }
303
304 double getIyx( void ) { return Iyx; }
305 double getIyy( void ) { return Iyy; }
306 double getIyz( void ) { return Iyz; }
307
308 double getIzx( void ) { return Izx; }
309 double getIzy( void ) { return Izy; }
310 double getIzz( void ) { return Izz; }
311
312 double getMu( void ) { return mu[index]; }
313 void setMu( double the_mu ) { mu[index] = the_mu; }
314
315 void lab2Body( double r[3] );
316 void body2Lab( double r[3] );
317 void updateU( void );
318
319 private:
320 int dIndex;
321
322 double sux, suy, suz; // the standard unit vector ( body fixed )
323 double jx, jy, jz; // the angular momentum vector ( body fixed )
324
325 double Ixx, Ixy, Ixz; // the inertial tensor matrix ( body fixed )
326 double Iyx, Iyy, Iyz;
327 double Izx, Izy, Izz;
328
329 int ssdIdentity; // boolean of whether atom is ssd
330
331 };
332
333 #endif