ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Integrator.hpp
Revision: 746
Committed: Thu Sep 4 21:48:35 2003 UTC (20 years, 10 months ago) by mmeineke
File size: 13351 byte(s)
Log Message:
added resetTime to the Global namespace.

added ability to reset the integrators in the NVT and NPT family.

File Contents

# User Rev Content
1 mmeineke 377 #ifndef _INTEGRATOR_H_
2     #define _INTEGRATOR_H_
3    
4 tim 658 #include <string>
5     #include <vector>
6 mmeineke 377 #include "Atom.hpp"
7 gezelter 604 #include "Molecule.hpp"
8 mmeineke 377 #include "SRI.hpp"
9     #include "AbstractClasses.hpp"
10     #include "SimInfo.hpp"
11     #include "ForceFields.hpp"
12 mmeineke 540 #include "Thermo.hpp"
13     #include "ReadWrite.hpp"
14 tim 658 #include "ZConsWriter.hpp"
15 mmeineke 377
16 tim 658 using namespace std;
17 mmeineke 561 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 mmeineke 586 const double p_convert = 1.63882576e8; //converts amu*fs^-2*Ang^-1 -> atm
20 mmeineke 561 const int maxIteration = 300;
21     const double tol = 1.0e-6;
22    
23 mmeineke 377
24 tim 645 template<typename T = BaseIntegrator> class Integrator : public T {
25    
26 mmeineke 377 public:
27 mmeineke 561 Integrator( SimInfo *theInfo, ForceFields* the_ff );
28 mmeineke 548 virtual ~Integrator();
29 mmeineke 377 void integrate( void );
30    
31    
32 mmeineke 540 protected:
33 mmeineke 377
34 mmeineke 540 virtual void integrateStep( int calcPot, int calcStress );
35 mmeineke 548 virtual void preMove( void );
36 mmeineke 540 virtual void moveA( void );
37     virtual void moveB( void );
38     virtual void constrainA( void );
39     virtual void constrainB( void );
40 mmeineke 559 virtual int readyCheck( void ) { return 1; }
41 tim 677
42 mmeineke 746 virtual void resetIntegrator( void ) { }
43    
44 tim 677 virtual void calcForce( int calcPot, int calcStress );
45     virtual void thermalize();
46 mmeineke 377
47 mmeineke 540 void checkConstraints( void );
48 mmeineke 377 void rotate( int axes1, int axes2, double angle, double j[3],
49 tim 701 double A[3][3] );
50    
51 mmeineke 377 ForceFields* myFF;
52    
53 mmeineke 540 SimInfo *info; // all the info we'll ever need
54     int nAtoms; /* the number of atoms */
55 mmeineke 548 int oldAtoms;
56 mmeineke 540 Atom **atoms; /* array of atom pointers */
57 mmeineke 423 Molecule* molecules;
58     int nMols;
59    
60 mmeineke 548 int isConstrained; // boolean to know whether the systems contains
61 tim 701 // constraints.
62 mmeineke 548 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 mmeineke 561 double* oldPos; // pre constrained positions
70 mmeineke 548
71 mmeineke 540 short isFirst; /*boolean for the first time integrate is called */
72    
73     double dt;
74 mmeineke 541 double dt2;
75 gezelter 560
76 mmeineke 540 Thermo *tStats;
77     StatWriter* statOut;
78     DumpWriter* dumpOut;
79 mmeineke 377
80     };
81    
82 tim 645 typedef Integrator<BaseIntegrator> RealIntegrator;
83 mmeineke 540
84 tim 645 template<typename T> class NVE : public T {
85    
86 mmeineke 561 public:
87     NVE ( SimInfo *theInfo, ForceFields* the_ff ):
88 tim 645 T( theInfo, the_ff ){}
89     virtual ~NVE(){}
90     };
91 mmeineke 555
92    
93 tim 645 template<typename T> class NVT : public T {
94 mmeineke 555
95 gezelter 560 public:
96    
97 mmeineke 561 NVT ( SimInfo *theInfo, ForceFields* the_ff);
98     virtual ~NVT() {}
99 mmeineke 540
100 gezelter 560 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
101     void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
102    
103 mmeineke 540 protected:
104 gezelter 560
105 mmeineke 561 virtual void moveA( void );
106     virtual void moveB( void );
107 mmeineke 540
108 mmeineke 561 virtual int readyCheck();
109 gezelter 560
110 mmeineke 746 virtual void resetIntegrator( void );
111    
112 gezelter 565 // chi is a propagated degree of freedom.
113 gezelter 560
114 gezelter 565 double chi;
115 gezelter 560
116 gezelter 565 // targetTemp must be set. tauThermostat must also be set;
117 gezelter 560
118     double targetTemp;
119     double tauThermostat;
120 mmeineke 561
121 gezelter 565 short int have_tau_thermostat, have_target_temp;
122 gezelter 560
123 mmeineke 540 };
124    
125    
126    
127 tim 645 template<typename T> class NPTi : public T{
128    
129 gezelter 560 public:
130    
131 gezelter 574 NPTi ( SimInfo *theInfo, ForceFields* the_ff);
132     virtual ~NPTi() {};
133 gezelter 560
134 mmeineke 594 virtual void integrateStep( int calcPot, int calcStress ){
135     calcStress = 1;
136 tim 645 T::integrateStep( calcPot, calcStress );
137 mmeineke 594 }
138    
139 gezelter 560 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 mmeineke 561 virtual void moveA( void );
147     virtual void moveB( void );
148 gezelter 560
149 mmeineke 561 virtual int readyCheck();
150 gezelter 560
151 mmeineke 746 virtual void resetIntegrator( void );
152    
153 gezelter 565 // chi and eta are the propagated degrees of freedom
154 gezelter 560
155 gezelter 565 double chi;
156     double eta;
157 gezelter 574 double NkBT;
158 gezelter 560
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 gezelter 565 short int have_target_pressure;
169 gezelter 560
170     };
171    
172 tim 645 template<typename T> class NPTim : public T{
173 gezelter 596
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 tim 645 T::integrateStep( calcPot, calcStress );
182 gezelter 596 }
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 gezelter 604 virtual void moveA( void );
192 gezelter 596 virtual void moveB( void );
193    
194     virtual int readyCheck();
195    
196 mmeineke 746 virtual void resetIntegrator( void );
197    
198 gezelter 604 Molecule* myMolecules;
199     Atom** myAtoms;
200    
201 gezelter 596 // 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 tim 645 template<typename T> class NPTf : public T{
221 gezelter 576
222     public:
223    
224     NPTf ( SimInfo *theInfo, ForceFields* the_ff);
225     virtual ~NPTf() {};
226    
227 mmeineke 594 virtual void integrateStep( int calcPot, int calcStress ){
228     calcStress = 1;
229 tim 645 T::integrateStep( calcPot, calcStress );
230 mmeineke 594 }
231    
232 gezelter 576 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 mmeineke 746 virtual void resetIntegrator( void );
243    
244 gezelter 576 virtual int readyCheck();
245    
246     // chi and eta are the propagated degrees of freedom
247    
248     double chi;
249 gezelter 588 double eta[3][3];
250 gezelter 576 double NkBT;
251    
252     // targetTemp, targetPressure, and tauBarostat must be set.
253     // One of qmass or tauThermostat must be set;
254    
255     double targetTemp;
256     double targetPressure;
257     double tauThermostat;
258     double tauBarostat;
259    
260     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
261     short int have_target_pressure;
262    
263     };
264    
265 tim 645 template<typename T> class NPTfm : public T{
266 gezelter 596
267     public:
268    
269     NPTfm ( SimInfo *theInfo, ForceFields* the_ff);
270     virtual ~NPTfm() {};
271    
272     virtual void integrateStep( int calcPot, int calcStress ){
273     calcStress = 1;
274 tim 645 T::integrateStep( calcPot, calcStress );
275 gezelter 596 }
276    
277     void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
278     void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
279     void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
280     void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
281    
282     protected:
283    
284     virtual void moveA( void );
285     virtual void moveB( void );
286    
287 mmeineke 746 virtual void resetIntegrator( void );
288    
289 gezelter 596 virtual int readyCheck();
290    
291 gezelter 605 Molecule* myMolecules;
292     Atom** myAtoms;
293    
294 gezelter 596 // chi and eta are the propagated degrees of freedom
295    
296     double chi;
297     double eta[3][3];
298     double NkBT;
299    
300     // targetTemp, targetPressure, and tauBarostat must be set.
301     // One of qmass or tauThermostat must be set;
302    
303     double targetTemp;
304     double targetPressure;
305     double tauThermostat;
306     double tauBarostat;
307    
308     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
309     short int have_target_pressure;
310    
311     };
312    
313 gezelter 718
314     template<typename T> class NPTpr : public T{
315    
316     public:
317    
318     NPTpr ( SimInfo *theInfo, ForceFields* the_ff);
319     virtual ~NPTpr() {};
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 mmeineke 746 virtual void resetIntegrator( void );
339    
340 gezelter 718 // chi and eta are the propagated degrees of freedom
341    
342     double chi;
343     double eta[3][3];
344     double NkBT;
345    
346     // targetTemp, targetPressure, and tauBarostat must be set.
347     // One of qmass or tauThermostat must be set;
348    
349     double targetTemp;
350     double targetPressure;
351     double tauThermostat;
352     double tauBarostat;
353    
354     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
355     short int have_target_pressure;
356    
357     };
358    
359    
360 tim 658 template<typename T> class ZConstraint : public T {
361 tim 701
362     public:
363 tim 738 class ForceSubtractionPolicy{
364 tim 699 public:
365 tim 738 ForceSubtractionPolicy(ZConstraint<T>* integrator) {zconsIntegrator = integrator;}
366 tim 658
367 tim 701 virtual void update() = 0;
368 tim 699 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
369     virtual double getZFOfMovingMols(Atom* atom, double totalForce) = 0;
370 tim 701 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
371     virtual double getHFOfUnconsMols(Atom* atom, double totalForce) = 0;
372    
373     protected:
374     ZConstraint<T>* zconsIntegrator;;
375 tim 699 };
376    
377 tim 738 class PolicyByNumber : public ForceSubtractionPolicy{
378 tim 699 public:
379 tim 738 PolicyByNumber(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
380 tim 701 virtual void update();
381 tim 699 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
382     virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
383 tim 701 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
384     virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
385    
386 tim 699 private:
387 tim 701 int totNumOfMovingAtoms;
388 tim 699 };
389    
390 tim 738 class PolicyByMass : public ForceSubtractionPolicy{
391 tim 699 public:
392 tim 738 PolicyByMass(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
393 tim 701
394     virtual void update();
395 tim 699 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
396     virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
397 tim 701 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
398     virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
399 tim 699
400 tim 701 private:
401     double totMassOfMovingAtoms;
402 tim 699 };
403    
404 tim 658 public:
405    
406     ZConstraint( SimInfo *theInfo, ForceFields* the_ff);
407     ~ZConstraint();
408 tim 677
409 tim 658 void setZConsTime(double time) {this->zconsTime = time;}
410     void getZConsTime() {return zconsTime;}
411    
412 tim 701 void setIndexOfAllZConsMols(vector<int> index) {indexOfAllZConsMols = index;}
413     void getIndexOfAllZConsMols() {return indexOfAllZConsMols;}
414 tim 658
415 tim 701 void setZConsOutput(const char * fileName) {zconsOutput = fileName;}
416 tim 658 string getZConsOutput() {return zconsOutput;}
417 tim 677
418     virtual void integrate();
419    
420 tim 658
421     #ifdef IS_MPI
422 tim 701 virtual void update(); //which is called to indicate the molecules' migration
423 mmeineke 377 #endif
424 tim 658
425     protected:
426    
427 tim 701 enum ZConsState {zcsMoving, zcsFixed};
428 tim 677
429     virtual void calcForce( int calcPot, int calcStress );
430     virtual void thermalize(void);
431    
432     void zeroOutVel();
433     void doZconstraintForce();
434 tim 682 void doHarmonic();
435 tim 677 bool checkZConsState();
436    
437     bool haveFixedZMols();
438     bool haveMovingZMols();
439    
440     double calcZSys();
441    
442     int isZConstraintMol(Molecule* mol);
443    
444    
445 tim 701 double zconsTime; //sample time
446     double zconsTol; //tolerance of z-contratint
447     double zForceConst; //base force constant term
448     //which is estimate by OOPSE
449 tim 658
450 tim 701 vector<Molecule*> zconsMols; //z-constraint molecules array
451     vector<double> massOfZConsMols; //mass of z-constraint molecule
452     vector<double> kz; //force constant array
453     vector<ZConsState> states; //state of z-constraint molecules
454     vector<double> zPos; //
455 tim 658
456 tim 677
457 tim 701 vector<Molecule*> unconsMols; //unconstraint molecules array
458     vector<double> massOfUnconsMols; //mass array of unconstraint molecules
459     double totalMassOfUncons; //total mas of unconstraint molecules
460 tim 682
461 tim 701 vector<ZConsParaItem>* parameters; //
462 tim 658
463     vector<int> indexOfAllZConsMols; //index of All Z-Constraint Molecuels
464 tim 677
465     int* indexOfZConsMols; //index of local Z-Constraint Molecules
466 tim 658 double* fz;
467 tim 699 double* curZPos;
468 tim 658
469 tim 701 int totNumOfUnconsAtoms; //total number of uncontraint atoms
470 tim 677
471     int whichDirection; //constraint direction
472    
473 tim 658 private:
474 tim 677
475 tim 701 string zconsOutput; //filename of zconstraint output
476     ZConsWriter* fzOut; //z-constraint writer
477 tim 677
478 tim 701 double curZconsTime;
479 tim 699
480 tim 696 double calcMovingMolsCOMVel();
481     double calcSysCOMVel();
482     double calcTotalForce();
483 tim 701
484 tim 738 ForceSubtractionPolicy* forcePolicy; //force substration policy
485     friend class ForceSubtractionPolicy;
486 tim 677
487 tim 658 };
488    
489     #endif