ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Integrator.hpp
Revision: 682
Committed: Tue Aug 12 17:51:33 2003 UTC (20 years, 10 months ago) by tim
File size: 9227 byte(s)
Log Message:
added harmonical potential to z-constraint method

File Contents

# Content
1 #ifndef _INTEGRATOR_H_
2 #define _INTEGRATOR_H_
3
4 #include <string>
5 #include <vector>
6 #include "Atom.hpp"
7 #include "Molecule.hpp"
8 #include "SRI.hpp"
9 #include "AbstractClasses.hpp"
10 #include "SimInfo.hpp"
11 #include "ForceFields.hpp"
12 #include "Thermo.hpp"
13 #include "ReadWrite.hpp"
14 #include "ZConsWriter.hpp"
15
16 using namespace std;
17 const double kB = 8.31451e-7;// boltzmann constant amu*Ang^2*fs^-2/K
18 const double eConvert = 4.184e-4; // converts kcal/mol -> amu*A^2/fs^2
19 const double p_convert = 1.63882576e8; //converts amu*fs^-2*Ang^-1 -> atm
20 const int maxIteration = 300;
21 const double tol = 1.0e-6;
22
23
24 template<typename T = BaseIntegrator> class Integrator : public T {
25
26 public:
27 Integrator( SimInfo *theInfo, ForceFields* the_ff );
28 virtual ~Integrator();
29 void integrate( void );
30
31
32 protected:
33
34 virtual void integrateStep( int calcPot, int calcStress );
35 virtual void preMove( void );
36 virtual void moveA( void );
37 virtual void moveB( void );
38 virtual void constrainA( void );
39 virtual void constrainB( void );
40 virtual int readyCheck( void ) { return 1; }
41
42 virtual void calcForce( int calcPot, int calcStress );
43 virtual void thermalize();
44
45 void checkConstraints( void );
46 void rotate( int axes1, int axes2, double angle, double j[3],
47 double A[3][3] );
48
49 ForceFields* myFF;
50
51 SimInfo *info; // all the info we'll ever need
52 int nAtoms; /* the number of atoms */
53 int oldAtoms;
54 Atom **atoms; /* array of atom pointers */
55 Molecule* molecules;
56 int nMols;
57
58 int isConstrained; // boolean to know whether the systems contains
59 // constraints.
60 int nConstrained; // counter for number of constraints
61 int *constrainedA; // the i of a constraint pair
62 int *constrainedB; // the j of a constraint pair
63 double *constrainedDsqr; // the square of the constraint distance
64
65 int* moving; // tells whether we are moving atom i
66 int* moved; // tells whether we have moved atom i
67 double* oldPos; // pre constrained positions
68
69 short isFirst; /*boolean for the first time integrate is called */
70
71 double dt;
72 double dt2;
73
74 Thermo *tStats;
75 StatWriter* statOut;
76 DumpWriter* dumpOut;
77
78 };
79
80 typedef Integrator<BaseIntegrator> RealIntegrator;
81
82 template<typename T> class NVE : public T {
83
84 public:
85 NVE ( SimInfo *theInfo, ForceFields* the_ff ):
86 T( theInfo, the_ff ){}
87 virtual ~NVE(){}
88 };
89
90
91 template<typename T> class NVT : public T {
92
93 public:
94
95 NVT ( SimInfo *theInfo, ForceFields* the_ff);
96 virtual ~NVT() {}
97
98 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
99 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
100
101 protected:
102
103 virtual void moveA( void );
104 virtual void moveB( void );
105
106 virtual int readyCheck();
107
108 // chi is a propagated degree of freedom.
109
110 double chi;
111
112 // targetTemp must be set. tauThermostat must also be set;
113
114 double targetTemp;
115 double tauThermostat;
116
117 short int have_tau_thermostat, have_target_temp;
118
119 };
120
121
122
123 template<typename T> class NPTi : public T{
124
125 public:
126
127 NPTi ( SimInfo *theInfo, ForceFields* the_ff);
128 virtual ~NPTi() {};
129
130 virtual void integrateStep( int calcPot, int calcStress ){
131 calcStress = 1;
132 T::integrateStep( calcPot, calcStress );
133 }
134
135 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
136 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
137 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
138 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
139
140 protected:
141
142 virtual void moveA( void );
143 virtual void moveB( void );
144
145 virtual int readyCheck();
146
147 // chi and eta are the propagated degrees of freedom
148
149 double chi;
150 double eta;
151 double NkBT;
152
153 // targetTemp, targetPressure, and tauBarostat must be set.
154 // One of qmass or tauThermostat must be set;
155
156 double targetTemp;
157 double targetPressure;
158 double tauThermostat;
159 double tauBarostat;
160
161 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
162 short int have_target_pressure;
163
164 };
165
166 template<typename T> class NPTim : public T{
167
168 public:
169
170 NPTim ( SimInfo *theInfo, ForceFields* the_ff);
171 virtual ~NPTim() {};
172
173 virtual void integrateStep( int calcPot, int calcStress ){
174 calcStress = 1;
175 T::integrateStep( calcPot, calcStress );
176 }
177
178 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
179 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
180 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
181 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
182
183 protected:
184
185 virtual void moveA( void );
186 virtual void moveB( void );
187
188 virtual int readyCheck();
189
190 Molecule* myMolecules;
191 Atom** myAtoms;
192
193 // chi and eta are the propagated degrees of freedom
194
195 double chi;
196 double eta;
197 double NkBT;
198
199 // targetTemp, targetPressure, and tauBarostat must be set.
200 // One of qmass or tauThermostat must be set;
201
202 double targetTemp;
203 double targetPressure;
204 double tauThermostat;
205 double tauBarostat;
206
207 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
208 short int have_target_pressure;
209
210 };
211
212 template<typename T> class NPTf : public T{
213
214 public:
215
216 NPTf ( SimInfo *theInfo, ForceFields* the_ff);
217 virtual ~NPTf() {};
218
219 virtual void integrateStep( int calcPot, int calcStress ){
220 calcStress = 1;
221 T::integrateStep( calcPot, calcStress );
222 }
223
224 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
225 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
226 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
227 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
228
229 protected:
230
231 virtual void moveA( void );
232 virtual void moveB( void );
233
234 virtual int readyCheck();
235
236 // chi and eta are the propagated degrees of freedom
237
238 double chi;
239 double eta[3][3];
240 double NkBT;
241
242 // targetTemp, targetPressure, and tauBarostat must be set.
243 // One of qmass or tauThermostat must be set;
244
245 double targetTemp;
246 double targetPressure;
247 double tauThermostat;
248 double tauBarostat;
249
250 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
251 short int have_target_pressure;
252
253 };
254
255 template<typename T> class NPTfm : public T{
256
257 public:
258
259 NPTfm ( SimInfo *theInfo, ForceFields* the_ff);
260 virtual ~NPTfm() {};
261
262 virtual void integrateStep( int calcPot, int calcStress ){
263 calcStress = 1;
264 T::integrateStep( calcPot, calcStress );
265 }
266
267 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
268 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
269 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
270 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
271
272 protected:
273
274 virtual void moveA( void );
275 virtual void moveB( void );
276
277 virtual int readyCheck();
278
279 Molecule* myMolecules;
280 Atom** myAtoms;
281
282 // chi and eta are the propagated degrees of freedom
283
284 double chi;
285 double eta[3][3];
286 double NkBT;
287
288 // targetTemp, targetPressure, and tauBarostat must be set.
289 // One of qmass or tauThermostat must be set;
290
291 double targetTemp;
292 double targetPressure;
293 double tauThermostat;
294 double tauBarostat;
295
296 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
297 short int have_target_pressure;
298
299 };
300
301 template<typename T> class ZConstraint : public T {
302
303 public:
304
305 ZConstraint( SimInfo *theInfo, ForceFields* the_ff);
306 ~ZConstraint();
307
308 void setZConsTime(double time) {this->zconsTime = time;}
309 void getZConsTime() {return zconsTime;}
310
311 void setIndexOfAllZConsMols(vector<int> index) {indexOfAllZConsMols = index;}
312 void getIndexOfAllZConsMols() {return indexOfAllZConsMols;}
313
314 void setZConsOutput(const char * fileName) {zconsOutput = fileName;}
315 string getZConsOutput() {return zconsOutput;}
316
317 virtual void integrate();
318
319
320 #ifdef IS_MPI
321 virtual void update(); //which is called to indicate the molecules' migration
322 #endif
323
324 protected:
325
326 enum ZConsState {zcsMoving, zcsFixed};
327
328
329
330 virtual void calcForce( int calcPot, int calcStress );
331 virtual void thermalize(void);
332
333 void zeroOutVel();
334 void doZconstraintForce();
335 void doHarmonic();
336 bool checkZConsState();
337
338 bool haveFixedZMols();
339 bool haveMovingZMols();
340
341 double calcZSys();
342
343 int isZConstraintMol(Molecule* mol);
344
345
346 double zconsTime;
347 double zconsTol;
348 double zForceConst;
349
350 vector<Molecule*> zconsMols;
351 vector<double> massOfZConsMols;
352 vector<double> kz;
353 vector<ZConsState> states;
354 vector<double> zPos;
355
356
357 vector<Molecule*> unconsMols;
358 vector<double> massOfUnconsMols;
359 double totalMassOfUncons;
360
361 vector<ZConsParaItem>* parameters;
362
363 vector<int> indexOfAllZConsMols; //index of All Z-Constraint Molecuels
364
365 int* indexOfZConsMols; //index of local Z-Constraint Molecules
366 double* fz;
367
368 int totNumOfUnconsAtoms;
369
370 int whichDirection; //constraint direction
371
372 private:
373
374 string zconsOutput;
375 ZConsWriter* fzOut;
376
377
378 };
379
380 #endif