ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Atom.hpp
Revision: 999
Committed: Fri Jan 30 15:01:09 2004 UTC (20 years, 5 months ago) by chrisfen
File size: 6338 byte(s)
Log Message:
Substantial changes. OOPSE now has a working WATER.cpp forcefield and parser.
This involved changes to WATER.cpp and ForceFields amoung other files. One important
note: a hardwiring of LJ_rcut was made in calc_LJ_FF.F90. This will be removed on
the next commit...

File Contents

# Content
1 #ifndef _ATOM_H_
2 #define _ATOM_H_
3
4 #include <string.h>
5 #include <stdlib.h>
6 #include <iostream>
7
8 #include "SimState.hpp"
9
10 class Atom{
11 public:
12
13 Atom(int theIndex, SimState* theConfig );
14 virtual ~Atom() {}
15
16 virtual void setCoords(void);
17
18 void getPos( double theP[3] );
19 void setPos( double theP[3] );
20
21 void getVel( double theV[3] );
22 void setVel( double theV[3] );
23
24 void getFrc( double theF[3] );
25 void addFrc( double theF[3] );
26
27 virtual void zeroForces() = 0;
28
29 double getMass() const {return c_mass;}
30 void setMass(double mass) {c_mass = mass;}
31
32 double getEamRcut() const {return myEamRcut;}
33 void setEamRcut(double eamRcut) {myEamRcut = eamRcut;}
34
35 double getSigma() const {return c_sigma;}
36 void setSigma(double sigma) {c_sigma = sigma;}
37
38 double getEpslon() const {return c_epslon;}
39 void setEpslon(double epslon) {c_epslon = epslon;}
40
41 double getCovalent() const {return c_covalent;}
42 void setCovalent(double covalent) {c_covalent = covalent;}
43
44 int getIndex() const {return index;}
45 void setIndex(int theIndex);
46 char *getType() {return c_name;}
47 void setType(char * name) {strcpy(c_name,name);}
48
49 int getIdent( void ) { return ident; }
50 void setIdent( int info ) { ident = info; }
51
52 #ifdef IS_MPI
53 int getGlobalIndex( void ) { return myGlobalIndex; }
54 void setGlobalIndex( int info ) { myGlobalIndex = info; }
55 #endif // is_mpi
56
57 void set_n_hydrogens( int n_h ) {c_n_hyd = n_h;}
58 int get_n_hydrogens() const {return c_n_hyd;}
59
60 void setHasDipole( int value ) { has_dipole = value; }
61 int hasDipole( void ) { return has_dipole; }
62
63 void setLJ( void ) { is_LJ = 1; is_VDW = 0; }
64 int isLJ( void ) { return is_LJ; }
65
66 void setVDW( void ) { is_VDW = 1; is_LJ = 0; }
67 int isVDW( void ) { return is_VDW; }
68
69 void setEAM( void ) { is_EAM = 1; }
70 int isEAM( void ) { return is_EAM; }
71
72 void setCharged( void ) { is_charged = 1; }
73 int isCharged( void ) { return is_charged; }
74
75 virtual int isDirectional( void ) = 0;
76
77
78 protected:
79
80 SimState* myConfig;
81
82 double* pos; // the position array
83 double* vel; // the velocity array
84 double* frc; // the forc array
85 double* trq; // the torque vector ( space fixed )
86 double* Amat; // the rotation matrix
87 double* mu; // the array of dipole moments
88 double* ul; // the lab frame unit directional vector
89
90 double c_mass; /* the mass of the atom in amu */
91 double c_sigma; /* the sigma parameter for van der walls interactions */
92 double c_epslon; /* the esplon parameter for VDW interactions */
93 double c_covalent; // The covalent radius of the atom.
94
95 double myEamRcut; // Atom rcut for eam defined by the forcefield.
96
97 int index; /* set the atom's index */
98 int offset; // the atom's offset in the storage array
99 int offsetX, offsetY, offsetZ;
100
101 int Axx, Axy, Axz; // the rotational matrix indices
102 int Ayx, Ayy, Ayz;
103 int Azx, Azy, Azz;
104
105 char c_name[100]; /* it's name */
106 int ident; // it's unique numeric identity.
107
108 int c_n_hyd; // the number of hydrogens bonded to the atom
109
110 int has_dipole; // dipole boolean
111 int is_VDW; // VDW boolean
112 int is_LJ; // LJ boolean
113 int is_EAM; // EAM boolean
114 int is_charged; // isCharge boolean
115
116 bool hasCoords;
117
118 #ifdef IS_MPI
119 int myGlobalIndex;
120 #endif
121
122 };
123
124 class GeneralAtom : public Atom{
125
126 public:
127 GeneralAtom(int theIndex, SimState* theConfig): Atom(theIndex, theConfig){}
128 virtual ~GeneralAtom(){}
129
130 int isDirectional( void ){ return 0; }
131 void zeroForces( void );
132 };
133
134 class DirectionalAtom : public Atom {
135
136 public:
137 DirectionalAtom(int theIndex, SimState* theConfig) : Atom(theIndex,
138 theConfig)
139 {
140 ssdIdentity = 0;
141 sux = 0.0;
142 suy = 0.0;
143 suz = 0.0;
144 myMu = 0.0;
145 }
146 virtual ~DirectionalAtom() {}
147
148 virtual void setCoords(void);
149
150 void printAmatIndex( void );
151
152 int isDirectional(void) { return 1; }
153
154 void setSSD( int value) { ssdIdentity = value; }
155 int isSSD(void) {return ssdIdentity; }
156
157
158 void setEuler( double phi, double theta, double psi );
159
160 double getSUx( void ) { return sux; }
161 double getSUy( void ) { return suy; }
162 double getSUz( void ) { return suz; }
163
164 void setSUx( double the_sux ) { sux = the_sux; }
165 void setSUy( double the_suy ) { suy = the_suy; }
166 void setSUz( double the_suz ) { suz = the_suz; }
167
168 void zeroForces();
169
170 void getA( double the_A[3][3] ); // get the full rotation matrix
171 void setA( double the_A[3][3] );
172
173 void getU( double the_u[3] ); // get the unit vetor
174 void updateU( void );
175
176 void getQ( double the_q[4] ); // get the quanternions
177 void setQ( double the_q[4] );
178
179 void getJ( double theJ[3] );
180 void setJ( double theJ[3] );
181
182 double getJx( void ) { return jx; }
183 double getJy( void ) { return jy; }
184 double getJz( void ) { return jz; }
185
186 void setJx( double the_jx ) { jx = the_jx; }
187 void setJy( double the_jy ) { jy = the_jy; }
188 void setJz( double the_jz ) { jz = the_jz; }
189
190 void getTrq( double theT[3] );
191 void addTrq( double theT[3] );
192
193 // double getTx( void ) { return trq[offsetX];}
194 // double getTy( void ) { return trq[offsetY]; }
195 // double getTz( void ) { return trq[offsetZ]; }
196
197 void setI( double the_I[3][3] );
198 void getI( double the_I[3][3] );
199
200 double getIxx( void ) { return Ixx; }
201 double getIxy( void ) { return Ixy; }
202 double getIxz( void ) { return Ixz; }
203
204 double getIyx( void ) { return Iyx; }
205 double getIyy( void ) { return Iyy; }
206 double getIyz( void ) { return Iyz; }
207
208 double getIzx( void ) { return Izx; }
209 double getIzy( void ) { return Izy; }
210 double getIzz( void ) { return Izz; }
211
212 double getMu( void );
213 void setMu( double the_mu );
214
215 void lab2Body( double r[3] );
216 void body2Lab( double r[3] );
217
218
219 // Four functions added for derivatives with respect to Euler Angles:
220 // (Needed for minimization routines):
221
222 void getGrad(double gradient[6] );
223 void getEulerAngles( double myEuler[3] );
224
225 double max(double x, double y);
226 double min(double x, double y);
227
228
229 private:
230 int dIndex;
231
232 double myMu;
233
234 double sux, suy, suz; // the standard unit vector ( body fixed )
235 double jx, jy, jz; // the angular momentum vector ( body fixed )
236
237 double Ixx, Ixy, Ixz; // the inertial tensor matrix ( body fixed )
238 double Iyx, Iyy, Iyz;
239 double Izx, Izy, Izz;
240
241 int ssdIdentity; // boolean of whether atom is ssd
242
243 };
244
245 #endif