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

# User Rev Content
1 mmeineke 377 #ifndef _ATOM_H_
2     #define _ATOM_H_
3    
4 gezelter 829 #include <string.h>
5     #include <stdlib.h>
6 mmeineke 377 #include <iostream>
7    
8 mmeineke 670 #include "SimState.hpp"
9    
10 mmeineke 377 class Atom{
11     public:
12    
13 mmeineke 670 Atom(int theIndex, SimState* theConfig );
14 gezelter 409 virtual ~Atom() {}
15 mmeineke 377
16 tim 689 virtual void setCoords(void);
17 mmeineke 377
18 mmeineke 599 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 mmeineke 377 virtual void zeroForces() = 0;
28    
29     double getMass() const {return c_mass;}
30     void setMass(double mass) {c_mass = mass;}
31 chuckv 669
32     double getEamRcut() const {return myEamRcut;}
33     void setEamRcut(double eamRcut) {myEamRcut = eamRcut;}
34 mmeineke 377
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 gezelter 409 void setIndex(int theIndex);
46 mmeineke 377 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 chrisfen 999 void setVDW( void ) { is_VDW = 1; is_LJ = 0; }
67 mmeineke 377 int isVDW( void ) { return is_VDW; }
68    
69 chuckv 631 void setEAM( void ) { is_EAM = 1; }
70     int isEAM( void ) { return is_EAM; }
71    
72 chrisfen 999 void setCharged( void ) { is_charged = 1; }
73     int isCharged( void ) { return is_charged; }
74    
75 mmeineke 377 virtual int isDirectional( void ) = 0;
76    
77    
78     protected:
79    
80 mmeineke 670 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 mmeineke 377 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 chuckv 669 double myEamRcut; // Atom rcut for eam defined by the forcefield.
96    
97 mmeineke 377 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 chrisfen 999 int is_VDW; // VDW boolean
112     int is_LJ; // LJ boolean
113     int is_EAM; // EAM boolean
114     int is_charged; // isCharge boolean
115 mmeineke 377
116 mmeineke 670 bool hasCoords;
117    
118 mmeineke 377 #ifdef IS_MPI
119     int myGlobalIndex;
120     #endif
121    
122     };
123    
124     class GeneralAtom : public Atom{
125    
126     public:
127 mmeineke 670 GeneralAtom(int theIndex, SimState* theConfig): Atom(theIndex, theConfig){}
128 mmeineke 377 virtual ~GeneralAtom(){}
129    
130     int isDirectional( void ){ return 0; }
131 mmeineke 670 void zeroForces( void );
132 mmeineke 377 };
133    
134     class DirectionalAtom : public Atom {
135    
136     public:
137 mmeineke 670 DirectionalAtom(int theIndex, SimState* theConfig) : Atom(theIndex,
138     theConfig)
139 mmeineke 377 {
140     ssdIdentity = 0;
141     sux = 0.0;
142     suy = 0.0;
143     suz = 0.0;
144 tim 689 myMu = 0.0;
145 mmeineke 377 }
146     virtual ~DirectionalAtom() {}
147    
148 tim 689 virtual void setCoords(void);
149    
150 mmeineke 597 void printAmatIndex( void );
151    
152 mmeineke 377 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 mmeineke 599
160     double getSUx( void ) { return sux; }
161     double getSUy( void ) { return suy; }
162     double getSUz( void ) { return suz; }
163 mmeineke 377
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 mmeineke 670 void zeroForces();
169 mmeineke 377
170     void getA( double the_A[3][3] ); // get the full rotation matrix
171 mmeineke 599 void setA( double the_A[3][3] );
172 mmeineke 377
173 mmeineke 599 void getU( double the_u[3] ); // get the unit vetor
174     void updateU( void );
175 mmeineke 377
176     void getQ( double the_q[4] ); // get the quanternions
177 mmeineke 599 void setQ( double the_q[4] );
178 mmeineke 377
179 mmeineke 599 void getJ( double theJ[3] );
180     void setJ( double theJ[3] );
181    
182 mmeineke 377 double getJx( void ) { return jx; }
183     double getJy( void ) { return jy; }
184     double getJz( void ) { return jz; }
185    
186 mmeineke 599 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 gezelter 611 // double getTx( void ) { return trq[offsetX];}
194     // double getTy( void ) { return trq[offsetY]; }
195     // double getTz( void ) { return trq[offsetZ]; }
196 mmeineke 377
197 mmeineke 599 void setI( double the_I[3][3] );
198     void getI( double the_I[3][3] );
199    
200 mmeineke 377 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 mmeineke 670 double getMu( void );
213     void setMu( double the_mu );
214 mmeineke 377
215     void lab2Body( double r[3] );
216     void body2Lab( double r[3] );
217    
218 mmeineke 599
219 gezelter 878 // 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 mmeineke 377 private:
230     int dIndex;
231    
232 tim 689 double myMu;
233    
234 mmeineke 377 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