ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Integrator.hpp
Revision: 1452
Committed: Mon Aug 23 15:11:36 2004 UTC (19 years, 10 months ago) by tim
File size: 14280 byte(s)
Log Message:
*** empty log message ***

File Contents

# Content
1 #ifndef _INTEGRATOR_H_
2 #define _INTEGRATOR_H_
3
4 #include <string>
5 #include <vector>
6 #include "Atom.hpp"
7 #include "StuntDouble.hpp"
8 #include "Molecule.hpp"
9 #include "SRI.hpp"
10 #include "AbstractClasses.hpp"
11 #include "SimInfo.hpp"
12 #include "ForceFields.hpp"
13 #include "Thermo.hpp"
14 #include "ReadWrite.hpp"
15 #include "ZConsWriter.hpp"
16 #include "Restraints.hpp"
17 #include "Quaternion.hpp"
18 #include "Mat4x4d.hpp"
19
20 using namespace std;
21 const double kB = 8.31451e-7;// boltzmann constant amu*Ang^2*fs^-2/K
22 const double eConvert = 4.184e-4; // converts kcal/mol -> amu*A^2/fs^2
23 const double p_convert = 1.63882576e8; //converts amu*fs^-2*Ang^-1 -> atm
24 const int maxIteration = 300;
25 const double tol = 1.0e-6;
26
27 class VelVerletConsFramework;
28 template<typename T = BaseIntegrator> class Integrator : public T {
29
30 public:
31 Integrator( SimInfo *theInfo, ForceFields* the_ff );
32 virtual ~Integrator();
33 void integrate( void );
34 virtual double getConservedQuantity(void);
35 virtual string getAdditionalParameters(void);
36
37 protected:
38
39 virtual void integrateStep( int calcPot, int calcStress );
40 //virtual void preMove( void );
41 virtual void moveA( void );
42 virtual void moveB( void );
43 //virtual void constrainA( void );
44 //virtual void constrainB( void );
45 virtual int readyCheck( void ) { return 1; }
46
47 virtual void resetIntegrator( void ) { }
48
49 virtual void calcForce( int calcPot, int calcStress );
50 virtual void thermalize();
51
52 virtual bool stopIntegrator() {return false;}
53
54 virtual void rotationPropagation( StuntDouble* sd, double ji[3] );
55
56 //void checkConstraints( void );
57 void rotate( int axes1, int axes2, double angle, double j[3],
58 double A[3][3] );
59
60 void printQuaternion(StuntDouble* sd);
61 Mat4x4d getS(const Quaternion& q);
62
63 ForceFields* myFF;
64
65 SimInfo *info; // all the info we'll ever need
66 vector<StuntDouble*> integrableObjects;
67 int nAtoms; /* the number of atoms */
68 int oldAtoms;
69 Atom **atoms; /* array of atom pointers */
70 Molecule* molecules;
71 int nMols;
72
73 VelVerletConsFramework* consFramework;
74
75 //int isConstrained; // boolean to know whether the systems contains constraints.
76 //int nConstrained; // counter for number of constraints
77 //int *constrainedA; // the i of a constraint pair
78 //int *constrainedB; // the j of a constraint pair
79 //double *constrainedDsqr; // the square of the constraint distance
80
81 //int* moving; // tells whether we are moving atom i
82 //int* moved; // tells whether we have moved atom i
83 //double* oldPos; // pre constrained positions
84
85 short isFirst; /*boolean for the first time integrate is called */
86
87 double dt;
88 double dt2;
89
90 Thermo *tStats;
91 StatWriter* statOut;
92 DumpWriter* dumpOut;
93
94 };
95
96 typedef Integrator<BaseIntegrator> RealIntegrator;
97
98 // ansi instantiation
99 // template class Integrator<BaseIntegrator>;
100
101
102 template<typename T> class NVE : public T {
103
104 public:
105 NVE ( SimInfo *theInfo, ForceFields* the_ff ):
106 T( theInfo, the_ff ){}
107 virtual ~NVE(){}
108 };
109
110
111 template<typename T> class NVT : public T {
112
113 public:
114
115 NVT ( SimInfo *theInfo, ForceFields* the_ff);
116 virtual ~NVT();
117
118 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
119 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
120 void setChiTolerance(double tol) {chiTolerance = tol;}
121 virtual double getConservedQuantity(void);
122 virtual string getAdditionalParameters(void);
123
124 protected:
125
126 virtual void moveA( void );
127 virtual void moveB( void );
128
129 virtual int readyCheck();
130
131 virtual void resetIntegrator( void );
132
133 // chi is a propagated degree of freedom.
134
135 double chi;
136
137 //integral of chi(t)dt
138 double integralOfChidt;
139
140 // targetTemp must be set. tauThermostat must also be set;
141
142 double targetTemp;
143 double tauThermostat;
144
145 short int have_tau_thermostat, have_target_temp;
146
147 double *oldVel;
148 double *oldJi;
149
150 double chiTolerance;
151 short int have_chi_tolerance;
152
153 };
154
155
156
157 template<typename T> class NPT : public T{
158
159 public:
160
161 NPT ( SimInfo *theInfo, ForceFields* the_ff);
162 virtual ~NPT();
163
164 virtual void integrateStep( int calcPot, int calcStress ){
165 calcStress = 1;
166 T::integrateStep( calcPot, calcStress );
167 }
168
169 virtual double getConservedQuantity(void) = 0;
170 virtual string getAdditionalParameters(void) = 0;
171
172 double myTauThermo( void ) { return tauThermostat; }
173 double myTauBaro( void ) { return tauBarostat; }
174
175 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
176 void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
177 void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
178 void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
179 void setChiTolerance(double tol) {chiTolerance = tol; have_chi_tolerance = 1;}
180 void setPosIterTolerance(double tol) {posIterTolerance = tol; have_pos_iter_tolerance = 1;}
181 void setEtaTolerance(double tol) {etaTolerance = tol; have_eta_tolerance = 1;}
182
183 protected:
184
185 virtual void moveA( void );
186 virtual void moveB( void );
187
188 virtual int readyCheck();
189
190 virtual void resetIntegrator( void );
191
192 virtual void getVelScaleA( double sc[3], double vel[3] ) = 0;
193 virtual void getVelScaleB( double sc[3], int index ) = 0;
194 virtual void getPosScale(double pos[3], double COM[3],
195 int index, double sc[3]) = 0;
196
197 virtual void calcVelScale( void ) = 0;
198
199 virtual bool chiConverged( void );
200 virtual bool etaConverged( void ) = 0;
201
202 virtual void evolveChiA( void );
203 virtual void evolveEtaA( void ) = 0;
204 virtual void evolveChiB( void );
205 virtual void evolveEtaB( void ) = 0;
206
207 virtual void scaleSimBox( void ) = 0;
208
209 void accIntegralOfChidt(void) { integralOfChidt += dt * chi;}
210
211 // chi and eta are the propagated degrees of freedom
212
213 double oldChi;
214 double prevChi;
215 double chi;
216 double NkBT;
217 double fkBT;
218
219 double tt2, tb2;
220 double instaTemp, instaPress, instaVol;
221 double press[3][3];
222
223 int Nparticles;
224
225 double integralOfChidt;
226
227 // targetTemp, targetPressure, and tauBarostat must be set.
228 // One of qmass or tauThermostat must be set;
229
230 double targetTemp;
231 double targetPressure;
232 double tauThermostat;
233 double tauBarostat;
234
235 short int have_tau_thermostat, have_tau_barostat, have_target_temp;
236 short int have_target_pressure;
237
238 double *oldPos;
239 double *oldVel;
240 double *oldJi;
241
242 double chiTolerance;
243 short int have_chi_tolerance;
244 double posIterTolerance;
245 short int have_pos_iter_tolerance;
246 double etaTolerance;
247 short int have_eta_tolerance;
248
249 };
250
251 template<typename T> class NPTi : public T{
252
253 public:
254 NPTi( SimInfo *theInfo, ForceFields* the_ff);
255 ~NPTi();
256
257 virtual double getConservedQuantity(void);
258 virtual void resetIntegrator(void);
259 virtual string getAdditionalParameters(void);
260 protected:
261
262
263
264 virtual void evolveEtaA(void);
265 virtual void evolveEtaB(void);
266
267 virtual bool etaConverged( void );
268
269 virtual void scaleSimBox( void );
270
271 virtual void getVelScaleA( double sc[3], double vel[3] );
272 virtual void getVelScaleB( double sc[3], int index );
273 virtual void getPosScale(double pos[3], double COM[3],
274 int index, double sc[3]);
275
276 virtual void calcVelScale( void );
277
278 double eta, oldEta, prevEta;
279 double vScale;
280 };
281
282 template<typename T> class NPTf : public T{
283
284 public:
285
286 NPTf ( SimInfo *theInfo, ForceFields* the_ff);
287 virtual ~NPTf();
288
289 virtual double getConservedQuantity(void);
290 virtual string getAdditionalParameters(void);
291 virtual void resetIntegrator(void);
292
293 protected:
294
295 virtual void evolveEtaA(void);
296 virtual void evolveEtaB(void);
297
298 virtual bool etaConverged( void );
299
300 virtual void scaleSimBox( void );
301
302 virtual void getVelScaleA( double sc[3], double vel[3] );
303 virtual void getVelScaleB( double sc[3], int index );
304 virtual void getPosScale(double pos[3], double COM[3],
305 int index, double sc[3]);
306
307 virtual void calcVelScale( void );
308
309 double eta[3][3];
310 double oldEta[3][3];
311 double prevEta[3][3];
312 double vScale[3][3];
313 };
314
315 template<typename T> class NPTxyz : public T{
316
317 public:
318
319 NPTxyz ( SimInfo *theInfo, ForceFields* the_ff);
320 virtual ~NPTxyz();
321
322 virtual double getConservedQuantity(void);
323 virtual string getAdditionalParameters(void);
324 virtual void resetIntegrator(void);
325
326 protected:
327
328 virtual void evolveEtaA(void);
329 virtual void evolveEtaB(void);
330
331 virtual bool etaConverged( void );
332
333 virtual void scaleSimBox( void );
334
335 virtual void getVelScaleA( double sc[3], double vel[3] );
336 virtual void getVelScaleB( double sc[3], int index );
337 virtual void getPosScale(double pos[3], double COM[3],
338 int index, double sc[3]);
339
340 virtual void calcVelScale( void );
341
342 double eta[3][3];
343 double oldEta[3][3];
344 double prevEta[3][3];
345 double vScale[3][3];
346 };
347
348
349 template<typename T> class ZConstraint : public T {
350
351 public:
352 class ForceSubtractionPolicy{
353 public:
354 ForceSubtractionPolicy(ZConstraint<T>* integrator) {zconsIntegrator = integrator;}
355
356 virtual void update() = 0;
357 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
358 virtual double getZFOfMovingMols(Atom* atom, double totalForce) = 0;
359 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
360 virtual double getHFOfUnconsMols(Atom* atom, double totalForce) = 0;
361
362 protected:
363 ZConstraint<T>* zconsIntegrator;
364 };
365
366 class PolicyByNumber : public ForceSubtractionPolicy{
367
368 public:
369 PolicyByNumber(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
370 virtual void update();
371 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
372 virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
373 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
374 virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
375
376 private:
377 int totNumOfMovingAtoms;
378 };
379
380 class PolicyByMass : public ForceSubtractionPolicy{
381
382 public:
383 PolicyByMass(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
384
385 virtual void update();
386 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
387 virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
388 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
389 virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
390
391 private:
392 double totMassOfMovingAtoms;
393 };
394
395 public:
396
397 ZConstraint( SimInfo *theInfo, ForceFields* the_ff);
398 ~ZConstraint();
399
400 void setZConsTime(double time) {this->zconsTime = time;}
401 void getZConsTime() {return zconsTime;}
402
403 void setIndexOfAllZConsMols(vector<int> index) {indexOfAllZConsMols = index;}
404 void getIndexOfAllZConsMols() {return indexOfAllZConsMols;}
405
406 void setZConsOutput(const char * fileName) {zconsOutput = fileName;}
407 string getZConsOutput() {return zconsOutput;}
408
409 virtual void integrate();
410
411
412 #ifdef IS_MPI
413 virtual void update(); //which is called to indicate the molecules' migration
414 #endif
415
416 enum ZConsState {zcsMoving, zcsFixed};
417
418 vector<Molecule*> zconsMols; //z-constraint molecules array
419 vector<ZConsState> states; //state of z-constraint molecules
420
421
422
423 int totNumOfUnconsAtoms; //total number of uncontraint atoms
424 double totalMassOfUncons; //total mas of unconstraint molecules
425
426
427 protected:
428
429
430
431 virtual void calcForce( int calcPot, int calcStress );
432 virtual void thermalize(void);
433
434 void zeroOutVel();
435 void doZconstraintForce();
436 void doHarmonic(vector<double>& resPos);
437 bool checkZConsState();
438
439 bool haveFixedZMols();
440 bool haveMovingZMols();
441
442 double calcZSys();
443
444 int isZConstraintMol(Molecule* mol);
445
446
447 double zconsTime; //sample time
448 double zconsTol; //tolerance of z-contratint
449 double zForceConst; //base force constant term
450 //which is estimate by OOPSE
451
452
453 vector<double> massOfZConsMols; //mass of z-constraint molecule
454 vector<double> kz; //force constant array
455
456 vector<double> zPos; //
457
458
459 vector<Molecule*> unconsMols; //unconstraint molecules array
460 vector<double> massOfUnconsMols; //mass array of unconstraint molecules
461
462
463 vector<ZConsParaItem>* parameters; //
464
465 vector<int> indexOfAllZConsMols; //index of All Z-Constraint Molecuels
466
467 vector<int> indexOfZConsMols; //index of local Z-Constraint Molecules
468 vector<double> fz;
469 vector<double> curZPos;
470
471 bool usingSMD;
472 vector<double> prevCantPos;
473 vector<double> cantPos;
474 vector<double> cantVel;
475
476 double zconsFixTime;
477 double zconsGap;
478 bool hasZConsGap;
479 vector<double> endFixTime;
480
481 int whichDirection; //constraint direction
482
483 private:
484
485 string zconsOutput; //filename of zconstraint output
486 ZConsWriter* fzOut; //z-constraint writer
487
488 double curZconsTime;
489
490 double calcMovingMolsCOMVel();
491 double calcSysCOMVel();
492 double calcTotalForce();
493 void updateZPos();
494 void updateCantPos();
495
496 ForceSubtractionPolicy* forcePolicy; //force subtraction policy
497 friend class ForceSubtractionPolicy;
498
499 };
500
501
502 //Sympletic quaternion Scheme Integrator
503 //Reference:
504 // T.F. Miller, M. Eleftheriou, P. Pattnaik, A. Ndirango, D. Newns and G.J. Martyna
505 //Symplectic quaternion Scheme for biophysical molecular dynamics
506 //116(20), 8649, J. Chem. Phys. (2002)
507 template<typename T> class SQSIntegrator : public T{
508 public:
509 SQSIntegrator( SimInfo *theInfo, ForceFields* the_ff );
510 virtual void moveA();
511 virtual void moveB();
512 protected:
513 void freeRotor(double dt, Quaternion& q, Vector4d& qdot, Vector3d& I);
514 void rotate(int k, double dt, Quaternion& q, Vector4d& qdot, double Ik);
515 private:
516 Quaternion getPk(int i, const Vector4d& q);
517 Mat4x4d getS(const Quaternion& q);
518 vector<Quaternion> q;
519 vector<Vector4d> p_qua;
520 vector<double> I0;
521
522 Vector4d p2j(const Vector4d& p, Mat4x4d& m);
523 Vector4d j2p(const Vector4d& j, Mat4x4d& m);
524 };
525 #endif