ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Integrator.hpp
Revision: 755
Committed: Tue Sep 9 20:35:25 2003 UTC (20 years, 10 months ago) by mmeineke
File size: 15752 byte(s)
Log Message:
updated the ChangeLog

added two new NPT integrators, they still need work.

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 resetIntegrator( void ) { }
43
44 virtual void calcForce( int calcPot, int calcStress );
45 virtual void thermalize();
46
47 void checkConstraints( void );
48 void rotate( int axes1, int axes2, double angle, double j[3],
49 double A[3][3] );
50
51 ForceFields* myFF;
52
53 SimInfo *info; // all the info we'll ever need
54 int nAtoms; /* the number of atoms */
55 int oldAtoms;
56 Atom **atoms; /* array of atom pointers */
57 Molecule* molecules;
58 int nMols;
59
60 int isConstrained; // boolean to know whether the systems contains
61 // constraints.
62 int nConstrained; // counter for number of constraints
63 int *constrainedA; // the i of a constraint pair
64 int *constrainedB; // the j of a constraint pair
65 double *constrainedDsqr; // the square of the constraint distance
66
67 int* moving; // tells whether we are moving atom i
68 int* moved; // tells whether we have moved atom i
69 double* oldPos; // pre constrained positions
70
71 short isFirst; /*boolean for the first time integrate is called */
72
73 double dt;
74 double dt2;
75
76 Thermo *tStats;
77 StatWriter* statOut;
78 DumpWriter* dumpOut;
79
80 };
81
82 typedef Integrator<BaseIntegrator> RealIntegrator;
83
84 template<typename T> class NVE : public T {
85
86 public:
87 NVE ( SimInfo *theInfo, ForceFields* the_ff ):
88 T( theInfo, the_ff ){}
89 virtual ~NVE(){}
90 };
91
92
93 template<typename T> class NVT : public T {
94
95 public:
96
97 NVT ( SimInfo *theInfo, ForceFields* the_ff);
98 virtual ~NVT() {}
99
100 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
101 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
102
103 protected:
104
105 virtual void moveA( void );
106 virtual void moveB( void );
107
108 virtual int readyCheck();
109
110 virtual void resetIntegrator( void );
111
112 // chi is a propagated degree of freedom.
113
114 double chi;
115
116 // targetTemp must be set. tauThermostat must also be set;
117
118 double targetTemp;
119 double tauThermostat;
120
121 short int have_tau_thermostat, have_target_temp;
122
123 };
124
125
126
127 template<typename T> class NPTi : public T{
128
129 public:
130
131 NPTi ( SimInfo *theInfo, ForceFields* the_ff);
132 virtual ~NPTi() {};
133
134 virtual void integrateStep( int calcPot, int calcStress ){
135 calcStress = 1;
136 T::integrateStep( calcPot, calcStress );
137 }
138
139 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
140 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
141 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
142 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
143
144 protected:
145
146 virtual void moveA( void );
147 virtual void moveB( void );
148
149 virtual int readyCheck();
150
151 virtual void resetIntegrator( void );
152
153 // chi and eta are the propagated degrees of freedom
154
155 double chi;
156 double eta;
157 double NkBT;
158
159 // targetTemp, targetPressure, and tauBarostat must be set.
160 // One of qmass or tauThermostat must be set;
161
162 double targetTemp;
163 double targetPressure;
164 double tauThermostat;
165 double tauBarostat;
166
167 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
168 short int have_target_pressure;
169
170 };
171
172 template<typename T> class NPTim : public T{
173
174 public:
175
176 NPTim ( SimInfo *theInfo, ForceFields* the_ff);
177 virtual ~NPTim() {};
178
179 virtual void integrateStep( int calcPot, int calcStress ){
180 calcStress = 1;
181 T::integrateStep( calcPot, calcStress );
182 }
183
184 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
185 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
186 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
187 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
188
189 protected:
190
191 virtual void moveA( void );
192 virtual void moveB( void );
193
194 virtual int readyCheck();
195
196 virtual void resetIntegrator( void );
197
198 Molecule* myMolecules;
199 Atom** myAtoms;
200
201 // chi and eta are the propagated degrees of freedom
202
203 double chi;
204 double eta;
205 double NkBT;
206
207 // targetTemp, targetPressure, and tauBarostat must be set.
208 // One of qmass or tauThermostat must be set;
209
210 double targetTemp;
211 double targetPressure;
212 double tauThermostat;
213 double tauBarostat;
214
215 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
216 short int have_target_pressure;
217
218 };
219
220 template<typename T> class NPTzm : public T{
221
222 public:
223
224 NPTzm ( SimInfo *theInfo, ForceFields* the_ff);
225 virtual ~NPTzm() {};
226
227 virtual void integrateStep( int calcPot, int calcStress ){
228 calcStress = 1;
229 T::integrateStep( calcPot, calcStress );
230 }
231
232 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
233 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
234 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
235 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
236
237 protected:
238
239 virtual void moveA( void );
240 virtual void moveB( void );
241
242 virtual int readyCheck();
243
244 virtual void resetIntegrator( void );
245
246 Molecule* myMolecules;
247 Atom** myAtoms;
248
249 // chi and eta are the propagated degrees of freedom
250
251 double chi;
252 double eta;
253 double etaZ;
254 double NkBT;
255
256 // targetTemp, targetPressure, and tauBarostat must be set.
257 // One of qmass or tauThermostat must be set;
258
259 double targetTemp;
260 double targetPressure;
261 double tauThermostat;
262 double tauBarostat;
263
264 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
265 short int have_target_pressure;
266
267 };
268
269 template<typename T> class NPTf : public T{
270
271 public:
272
273 NPTf ( SimInfo *theInfo, ForceFields* the_ff);
274 virtual ~NPTf() {};
275
276 virtual void integrateStep( int calcPot, int calcStress ){
277 calcStress = 1;
278 T::integrateStep( calcPot, calcStress );
279 }
280
281 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
282 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
283 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
284 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
285
286 protected:
287
288 virtual void moveA( void );
289 virtual void moveB( void );
290
291 virtual void resetIntegrator( void );
292
293 virtual int readyCheck();
294
295 // chi and eta are the propagated degrees of freedom
296
297 double chi;
298 double eta[3][3];
299 double NkBT;
300
301 // targetTemp, targetPressure, and tauBarostat must be set.
302 // One of qmass or tauThermostat must be set;
303
304 double targetTemp;
305 double targetPressure;
306 double tauThermostat;
307 double tauBarostat;
308
309 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
310 short int have_target_pressure;
311
312 };
313
314 template<typename T> class NPTxym : public T{
315
316 public:
317
318 NPTxym ( SimInfo *theInfo, ForceFields* the_ff);
319 virtual ~NPTxym() {};
320
321 virtual void integrateStep( int calcPot, int calcStress ){
322 calcStress = 1;
323 T::integrateStep( calcPot, calcStress );
324 }
325
326 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
327 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
328 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
329 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
330
331 protected:
332
333 virtual void moveA( void );
334 virtual void moveB( void );
335
336 virtual int readyCheck();
337
338 virtual void resetIntegrator( void );
339
340 Molecule* myMolecules;
341 Atom** myAtoms;
342
343 // chi and eta are the propagated degrees of freedom
344
345 double chi;
346 double eta;
347 double etaX;
348 double etaY;
349 double NkBT;
350
351 // targetTemp, targetPressure, and tauBarostat must be set.
352 // One of qmass or tauThermostat must be set;
353
354 double targetTemp;
355 double targetPressure;
356 double tauThermostat;
357 double tauBarostat;
358
359 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
360 short int have_target_pressure;
361
362 };
363
364
365 template<typename T> class NPTfm : public T{
366
367 public:
368
369 NPTfm ( SimInfo *theInfo, ForceFields* the_ff);
370 virtual ~NPTfm() {};
371
372 virtual void integrateStep( int calcPot, int calcStress ){
373 calcStress = 1;
374 T::integrateStep( calcPot, calcStress );
375 }
376
377 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
378 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
379 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
380 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
381
382 protected:
383
384 virtual void moveA( void );
385 virtual void moveB( void );
386
387 virtual void resetIntegrator( void );
388
389 virtual int readyCheck();
390
391 Molecule* myMolecules;
392 Atom** myAtoms;
393
394 // chi and eta are the propagated degrees of freedom
395
396 double chi;
397 double eta[3][3];
398 double NkBT;
399
400 // targetTemp, targetPressure, and tauBarostat must be set.
401 // One of qmass or tauThermostat must be set;
402
403 double targetTemp;
404 double targetPressure;
405 double tauThermostat;
406 double tauBarostat;
407
408 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
409 short int have_target_pressure;
410
411 };
412
413
414 template<typename T> class NPTpr : public T{
415
416 public:
417
418 NPTpr ( SimInfo *theInfo, ForceFields* the_ff);
419 virtual ~NPTpr() {};
420
421 virtual void integrateStep( int calcPot, int calcStress ){
422 calcStress = 1;
423 T::integrateStep( calcPot, calcStress );
424 }
425
426 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
427 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
428 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
429 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
430
431 protected:
432
433 virtual void moveA( void );
434 virtual void moveB( void );
435
436 virtual int readyCheck();
437
438 virtual void resetIntegrator( void );
439
440 // chi and eta are the propagated degrees of freedom
441
442 double chi;
443 double eta[3][3];
444 double NkBT;
445
446 // targetTemp, targetPressure, and tauBarostat must be set.
447 // One of qmass or tauThermostat must be set;
448
449 double targetTemp;
450 double targetPressure;
451 double tauThermostat;
452 double tauBarostat;
453
454 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
455 short int have_target_pressure;
456
457 };
458
459
460 template<typename T> class ZConstraint : public T {
461
462 public:
463 class ForceSubtractionPolicy{
464 public:
465 ForceSubtractionPolicy(ZConstraint<T>* integrator) {zconsIntegrator = integrator;}
466
467 virtual void update() = 0;
468 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
469 virtual double getZFOfMovingMols(Atom* atom, double totalForce) = 0;
470 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
471 virtual double getHFOfUnconsMols(Atom* atom, double totalForce) = 0;
472
473 protected:
474 ZConstraint<T>* zconsIntegrator;;
475 };
476
477 class PolicyByNumber : public ForceSubtractionPolicy{
478
479 public:
480 PolicyByNumber(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
481 virtual void update();
482 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
483 virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
484 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
485 virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
486
487 private:
488 int totNumOfMovingAtoms;
489 };
490
491 class PolicyByMass : public ForceSubtractionPolicy{
492
493 public:
494 PolicyByMass(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
495
496 virtual void update();
497 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
498 virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
499 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
500 virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
501
502 private:
503 double totMassOfMovingAtoms;
504 };
505
506 public:
507
508 ZConstraint( SimInfo *theInfo, ForceFields* the_ff);
509 ~ZConstraint();
510
511 void setZConsTime(double time) {this->zconsTime = time;}
512 void getZConsTime() {return zconsTime;}
513
514 void setIndexOfAllZConsMols(vector<int> index) {indexOfAllZConsMols = index;}
515 void getIndexOfAllZConsMols() {return indexOfAllZConsMols;}
516
517 void setZConsOutput(const char * fileName) {zconsOutput = fileName;}
518 string getZConsOutput() {return zconsOutput;}
519
520 virtual void integrate();
521
522
523 #ifdef IS_MPI
524 virtual void update(); //which is called to indicate the molecules' migration
525 #endif
526
527 protected:
528
529 enum ZConsState {zcsMoving, zcsFixed};
530
531 virtual void calcForce( int calcPot, int calcStress );
532 virtual void thermalize(void);
533
534 void zeroOutVel();
535 void doZconstraintForce();
536 void doHarmonic();
537 bool checkZConsState();
538
539 bool haveFixedZMols();
540 bool haveMovingZMols();
541
542 double calcZSys();
543
544 int isZConstraintMol(Molecule* mol);
545
546
547 double zconsTime; //sample time
548 double zconsTol; //tolerance of z-contratint
549 double zForceConst; //base force constant term
550 //which is estimate by OOPSE
551
552 vector<Molecule*> zconsMols; //z-constraint molecules array
553 vector<double> massOfZConsMols; //mass of z-constraint molecule
554 vector<double> kz; //force constant array
555 vector<ZConsState> states; //state of z-constraint molecules
556 vector<double> zPos; //
557
558
559 vector<Molecule*> unconsMols; //unconstraint molecules array
560 vector<double> massOfUnconsMols; //mass array of unconstraint molecules
561 double totalMassOfUncons; //total mas of unconstraint molecules
562
563 vector<ZConsParaItem>* parameters; //
564
565 vector<int> indexOfAllZConsMols; //index of All Z-Constraint Molecuels
566
567 int* indexOfZConsMols; //index of local Z-Constraint Molecules
568 double* fz;
569 double* curZPos;
570
571 int totNumOfUnconsAtoms; //total number of uncontraint atoms
572
573 int whichDirection; //constraint direction
574
575 private:
576
577 string zconsOutput; //filename of zconstraint output
578 ZConsWriter* fzOut; //z-constraint writer
579
580 double curZconsTime;
581
582 double calcMovingMolsCOMVel();
583 double calcSysCOMVel();
584 double calcTotalForce();
585
586 ForceSubtractionPolicy* forcePolicy; //force subtraction policy
587 friend class ForceSubtractionPolicy;
588
589 };
590
591 #endif