ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/integrators/Integrator.hpp
(Generate patch)

Comparing trunk/OOPSE-4/src/integrators/Integrator.hpp (file contents):
Revision 1490 by gezelter, Fri Sep 24 04:16:43 2004 UTC vs.
Revision 2243 by tim, Sun May 29 00:06:14 2005 UTC

# Line 1 | Line 1
1 < #ifndef _INTEGRATOR_H_
2 < #define _INTEGRATOR_H_
1 > /*
2 > * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3 > *
4 > * The University of Notre Dame grants you ("Licensee") a
5 > * non-exclusive, royalty free, license to use, modify and
6 > * redistribute this software in source and binary code form, provided
7 > * that the following conditions are met:
8 > *
9 > * 1. Acknowledgement of the program authors must be made in any
10 > *    publication of scientific results based in part on use of the
11 > *    program.  An acceptable form of acknowledgement is citation of
12 > *    the article in which the program was described (Matthew
13 > *    A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14 > *    J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15 > *    Parallel Simulation Engine for Molecular Dynamics,"
16 > *    J. Comput. Chem. 26, pp. 252-271 (2005))
17 > *
18 > * 2. Redistributions of source code must retain the above copyright
19 > *    notice, this list of conditions and the following disclaimer.
20 > *
21 > * 3. Redistributions in binary form must reproduce the above copyright
22 > *    notice, this list of conditions and the following disclaimer in the
23 > *    documentation and/or other materials provided with the
24 > *    distribution.
25 > *
26 > * This software is provided "AS IS," without a warranty of any
27 > * kind. All express or implied conditions, representations and
28 > * warranties, including any implied warranty of merchantability,
29 > * fitness for a particular purpose or non-infringement, are hereby
30 > * excluded.  The University of Notre Dame and its licensors shall not
31 > * be liable for any damages suffered by licensee as a result of
32 > * using, modifying or distributing the software or its
33 > * derivatives. In no event will the University of Notre Dame or its
34 > * licensors be liable for any lost revenue, profit or data, or for
35 > * direct, indirect, special, consequential, incidental or punitive
36 > * damages, however caused and regardless of the theory of liability,
37 > * arising out of the use of or inability to use software, even if the
38 > * University of Notre Dame has been advised of the possibility of
39 > * such damages.
40 > */
41 >
42 > /**
43 > * @file Integrator.hpp
44 > * @author tlin
45 > * @date 11/08/2004
46 > * @time 13:25am
47 > * @version 1.0
48 > */
49  
50 < #include <string>
51 < #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"
50 > #ifndef INTEGRATORS_INTEGRATOR_HPP
51 > #define INTEGRATORS_INTEGRATOR_HPP
52  
53 < using namespace std;
54 < const double kB = 8.31451e-7;// boltzmann constant amu*Ang^2*fs^-2/K
55 < const double eConvert = 4.184e-4; // converts kcal/mol -> amu*A^2/fs^2
56 < const double p_convert = 1.63882576e8; //converts amu*fs^-2*Ang^-1 -> atm
57 < const int maxIteration = 300;
58 < const double tol = 1.0e-6;
53 > #include "brains/ForceManager.hpp"
54 > #include "restraints/ThermoIntegrationForceManager.hpp"
55 > #include "io/DumpWriter.hpp"
56 > #include "io/StatWriter.hpp"
57 > #include "io/RestWriter.hpp"
58 > #include "integrators/Velocitizer.hpp"
59  
60 < class VelVerletConsFramework;
26 < template<typename T = BaseIntegrator> class Integrator : public T {
60 > namespace oopse {
61  
28 public:
29  Integrator( SimInfo *theInfo, ForceFields* the_ff );
30  virtual ~Integrator();
31  void integrate( void );
32  virtual double  getConservedQuantity(void);
33  virtual string getAdditionalParameters(void);
62  
63 < protected:
63 >  /**
64 >   * @class Integrator Integrator.hpp "integrators/Integrator.hpp"
65 >   * @brief Base class of Integrator
66 >   * @todo document
67 >   */
68 >  class Integrator {
69 >  public:
70  
71 <  virtual void integrateStep( int calcPot, int calcStress );
38 <  virtual void preMove( void );
39 <  virtual void moveA( void );
40 <  virtual void moveB( void );
41 <  virtual void constrainA( void );
42 <  virtual void constrainB( void );
43 <  virtual int  readyCheck( void ) { return 1; }
71 >    virtual ~Integrator();
72  
73 <  virtual void resetIntegrator( void ) { }
73 >    //avoid public virtual function        
74 >    void integrate() {
75 >      doIntegrate();
76 >    }
77  
78 <  virtual void calcForce( int calcPot, int calcStress );
79 <  virtual void thermalize();
78 >    void update() {
79 >      doUpdate();
80 >    }
81  
82 <  virtual bool stopIntegrator() {return false;}
82 >    void setForceManager(ForceManager* forceMan) {
83 >      if (forceMan_ != forceMan && forceMan_  != NULL) {
84 >        delete forceMan_;
85 >      }
86 >      forceMan_ = forceMan;
87 >    }
88  
89 <  virtual void rotationPropagation( StuntDouble* sd, double ji[3] );
89 >    void setVelocitizer(Velocitizer* velocitizer) {
90 >      if (velocitizer_ != velocitizer && velocitizer_  != NULL) {
91 >        delete velocitizer_;
92 >      }
93 >      velocitizer_  = velocitizer;
94 >    }
95 >        
96 >  protected:
97  
98 <  void checkConstraints( void );
55 <  void rotate( int axes1, int axes2, double angle, double j[3],
56 <         double A[3][3] );
98 >    Integrator(SimInfo* info);
99  
100 <  ForceFields* myFF;
100 >    virtual void doIntegrate() = 0;
101  
102 <  SimInfo *info; // all the info we'll ever need
103 <  vector<StuntDouble*> integrableObjects;
104 <  int nAtoms;  /* the number of atoms */
105 <  int oldAtoms;
106 <  Atom **atoms; /* array of atom pointers */
107 <  Molecule* molecules;
108 <  int nMols;
102 >    virtual void doUpdate() {}
103 >        
104 >    void saveConservedQuantity() {
105 >      currentSnapshot_->statData[Stats::CONSERVED_QUANTITY] = calcConservedQuantity();
106 >    }
107 >        
108 >    SimInfo* info_;
109 >    Globals* simParams;
110 >    ForceManager* forceMan_;
111 >    bool needPotential;
112 >    bool needStress;
113 >    bool needReset;    
114 >    Velocitizer* velocitizer_;
115 >    bool needVelocityScaling;
116 >    double targetScalingTemp;
117 >    
118 >    DumpWriter* dumpWriter;
119 >    StatWriter* statWriter;
120 >    RestWriter* restWriter;
121 >    Thermo thermo;
122  
123 +    double runTime;
124 +    double sampleTime;
125 +    double statusTime;
126 +    double thermalTime;
127 +    double resetTime;
128 +    double dt;
129  
130 <  int isConstrained; // boolean to know whether the systems contains constraints.
70 <  int nConstrained;  // counter for number of constraints
71 <  int *constrainedA; // the i of a constraint pair
72 <  int *constrainedB; // the j of a constraint pair
73 <  double *constrainedDsqr; // the square of the constraint distance
74 <
75 <  int* moving; // tells whether we are moving atom i
76 <  int* moved;  // tells whether we have moved atom i
77 <  double* oldPos; // pre constrained positions
78 <
79 <  short isFirst; /*boolean for the first time integrate is called */
80 <
81 <  double dt;
82 <  double dt2;
83 <
84 <  Thermo *tStats;
85 <  StatWriter*  statOut;
86 <  DumpWriter*  dumpOut;
87 <
88 < };
89 <
90 < typedef Integrator<BaseIntegrator> RealIntegrator;
91 <
92 < // ansi instantiation
93 < // template class Integrator<BaseIntegrator>;
94 <
95 <
96 < template<typename T> class NVE : public T {
97 <
98 < public:
99 <  NVE ( SimInfo *theInfo, ForceFields* the_ff ):
100 <    T( theInfo, the_ff ){}
101 <  virtual ~NVE(){}
102 < };
103 <
104 <
105 < template<typename T> class NVT : public T {
106 <
107 < public:
108 <
109 <  NVT ( SimInfo *theInfo, ForceFields* the_ff);
110 <  virtual ~NVT();
111 <
112 <  void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
113 <  void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
114 <  void setChiTolerance(double tol) {chiTolerance = tol;}
115 <  virtual double  getConservedQuantity(void);
116 <  virtual string getAdditionalParameters(void);
117 <
118 < protected:
119 <
120 <  virtual void moveA( void );
121 <  virtual void moveB( void );
122 <
123 <  virtual int readyCheck();
124 <
125 <  virtual void resetIntegrator( void );
126 <
127 <  // chi is a propagated degree of freedom.
128 <
129 <  double chi;
130 <
131 <  //integral of chi(t)dt
132 <  double integralOfChidt;
133 <
134 <  // targetTemp must be set.  tauThermostat must also be set;
135 <
136 <  double targetTemp;
137 <  double tauThermostat;
138 <
139 <  short int have_tau_thermostat, have_target_temp;
140 <
141 <  double *oldVel;
142 <  double *oldJi;
143 <
144 <  double chiTolerance;
145 <  short int have_chi_tolerance;
146 <
147 < };
148 <
149 <
150 <
151 < template<typename T> class NPT : public T{
152 <
153 < public:
154 <
155 <  NPT ( SimInfo *theInfo, ForceFields* the_ff);
156 <  virtual ~NPT();
157 <
158 <  virtual void integrateStep( int calcPot, int calcStress ){
159 <    calcStress = 1;
160 <    T::integrateStep( calcPot, calcStress );
161 <  }
162 <
163 <  virtual double getConservedQuantity(void) = 0;
164 <  virtual string getAdditionalParameters(void) = 0;
165 <  
166 <  double myTauThermo( void ) { return tauThermostat; }
167 <  double myTauBaro( void ) { return tauBarostat; }
168 <
169 <  void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
170 <  void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
171 <  void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
172 <  void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
173 <  void setChiTolerance(double tol) {chiTolerance = tol; have_chi_tolerance = 1;}
174 <  void setPosIterTolerance(double tol) {posIterTolerance = tol; have_pos_iter_tolerance = 1;}
175 <  void setEtaTolerance(double tol) {etaTolerance = tol; have_eta_tolerance = 1;}
176 <
177 < protected:
178 <
179 <  virtual void  moveA( void );
180 <  virtual void moveB( void );
181 <
182 <  virtual int readyCheck();
183 <
184 <  virtual void resetIntegrator( void );
185 <
186 <  virtual void getVelScaleA( double sc[3], double vel[3] ) = 0;
187 <  virtual void getVelScaleB( double sc[3], int index ) = 0;
188 <  virtual void getPosScale(double pos[3], double COM[3],
189 <                           int index, double sc[3]) = 0;
190 <
191 <  virtual void calcVelScale( void ) = 0;
192 <
193 <  virtual bool chiConverged( void );
194 <  virtual bool etaConverged( void ) = 0;
195 <
196 <  virtual void evolveChiA( void );
197 <  virtual void evolveEtaA( void ) = 0;
198 <  virtual void evolveChiB( void );
199 <  virtual void evolveEtaB( void ) = 0;
200 <
201 <  virtual void scaleSimBox( void ) = 0;
202 <
203 <  void accIntegralOfChidt(void) { integralOfChidt += dt * chi;}
204 <
205 <  // chi and eta are the propagated degrees of freedom
206 <
207 <  double oldChi;
208 <  double prevChi;
209 <  double chi;
210 <  double NkBT;
211 <  double fkBT;
130 >    Snapshot* currentSnapshot_; //During the integration, the address of currentSnapshot Will not change
131  
132 <  double tt2, tb2;
133 <  double instaTemp, instaPress, instaVol;
134 <  double press[3][3];
132 >        
133 >  private:
134 >        
135 >    virtual double calcConservedQuantity() = 0;
136 >        
137 >    virtual DumpWriter* createDumpWriter() = 0;
138  
139 <  int Nparticles;
218 <
219 <  double integralOfChidt;
220 <
221 <  // targetTemp, targetPressure, and tauBarostat must be set.
222 <  // One of qmass or tauThermostat must be set;
223 <
224 <  double targetTemp;
225 <  double targetPressure;
226 <  double tauThermostat;
227 <  double tauBarostat;
228 <
229 <  short int have_tau_thermostat, have_tau_barostat, have_target_temp;
230 <  short int have_target_pressure;
231 <
232 <  double *oldPos;
233 <  double *oldVel;
234 <  double *oldJi;
235 <
236 <  double chiTolerance;
237 <  short int have_chi_tolerance;
238 <  double posIterTolerance;
239 <  short int have_pos_iter_tolerance;
240 <  double etaTolerance;
241 <  short int have_eta_tolerance;
242 <
243 < };
244 <
245 < template<typename T> class NPTi : public T{
246 <
247 < public:
248 <  NPTi( SimInfo *theInfo, ForceFields* the_ff);
249 <  ~NPTi();
250 <
251 <  virtual double getConservedQuantity(void);
252 <  virtual void resetIntegrator(void);
253 <  virtual string getAdditionalParameters(void);
254 < protected:
255 <
256 <
257 <
258 <  virtual void evolveEtaA(void);
259 <  virtual void evolveEtaB(void);
260 <
261 <  virtual bool etaConverged( void );
262 <
263 <  virtual void scaleSimBox( void );
264 <
265 <  virtual void getVelScaleA( double sc[3], double vel[3] );
266 <  virtual void getVelScaleB( double sc[3], int index );
267 <  virtual void getPosScale(double pos[3], double COM[3],
268 <                           int index, double sc[3]);
269 <
270 <  virtual void calcVelScale( void );
271 <
272 <  double eta, oldEta, prevEta;
273 <  double vScale;
274 < };
275 <
276 < template<typename T> class NPTf : public T{
277 <
278 < public:
279 <
280 <  NPTf ( SimInfo *theInfo, ForceFields* the_ff);
281 <  virtual ~NPTf();
282 <
283 <  virtual double getConservedQuantity(void);
284 <  virtual string getAdditionalParameters(void);
285 <  virtual void resetIntegrator(void);
286 <
287 < protected:
288 <
289 <  virtual void evolveEtaA(void);
290 <  virtual void evolveEtaB(void);
291 <
292 <  virtual bool etaConverged( void );
293 <
294 <  virtual void scaleSimBox( void );
295 <
296 <  virtual void getVelScaleA( double sc[3], double vel[3] );
297 <  virtual void getVelScaleB( double sc[3], int index );
298 <  virtual void getPosScale(double pos[3], double COM[3],
299 <                           int index, double sc[3]);
300 <
301 <  virtual void calcVelScale( void );
302 <
303 <  double eta[3][3];
304 <  double oldEta[3][3];
305 <  double prevEta[3][3];
306 <  double vScale[3][3];
307 < };
308 <
309 < template<typename T> class NPTxyz : public T{
310 <
311 < public:
312 <
313 <  NPTxyz ( SimInfo *theInfo, ForceFields* the_ff);
314 <  virtual ~NPTxyz();
315 <
316 <  virtual double getConservedQuantity(void);
317 <  virtual string getAdditionalParameters(void);
318 <  virtual void resetIntegrator(void);
319 <
320 < protected:
321 <
322 <  virtual void evolveEtaA(void);
323 <  virtual void evolveEtaB(void);
324 <
325 <  virtual bool etaConverged( void );
326 <
327 <  virtual void scaleSimBox( void );
328 <
329 <  virtual void getVelScaleA( double sc[3], double vel[3] );
330 <  virtual void getVelScaleB( double sc[3], int index );
331 <  virtual void getPosScale(double pos[3], double COM[3],
332 <                           int index, double sc[3]);
333 <
334 <  virtual void calcVelScale( void );
335 <
336 <  double eta[3][3];
337 <  double oldEta[3][3];
338 <  double prevEta[3][3];
339 <  double vScale[3][3];
340 < };
341 <
342 <
343 < template<typename T> class ZConstraint : public T {
344 <
345 <  public:
346 <  class ForceSubtractionPolicy{
347 <    public:
348 <      ForceSubtractionPolicy(ZConstraint<T>* integrator) {zconsIntegrator = integrator;}
349 <
350 <      virtual void update() = 0;
351 <      virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
352 <      virtual double getZFOfMovingMols(Atom* atom, double totalForce) = 0;
353 <      virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
354 <      virtual double getHFOfUnconsMols(Atom* atom, double totalForce) = 0;
355 <
356 <   protected:
357 <     ZConstraint<T>* zconsIntegrator;
139 >    virtual StatWriter* createStatWriter() = 0;
140    };
141  
360  class PolicyByNumber : public ForceSubtractionPolicy{
361
362    public:
363      PolicyByNumber(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
364      virtual void update();
365      virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
366      virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
367      virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
368      virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
369
370    private:
371      int totNumOfMovingAtoms;
372  };
373
374  class PolicyByMass : public ForceSubtractionPolicy{
375
376    public:
377      PolicyByMass(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
378
379      virtual void update();
380      virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
381      virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
382      virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
383      virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
384
385   private:
386     double totMassOfMovingAtoms;
387  };
388
389 public:
390
391  ZConstraint( SimInfo *theInfo, ForceFields* the_ff);
392  ~ZConstraint();
393
394  void setZConsTime(double time)                  {this->zconsTime = time;}
395  void getZConsTime()                             {return zconsTime;}
396
397  void setIndexOfAllZConsMols(vector<int> index) {indexOfAllZConsMols = index;}
398  void getIndexOfAllZConsMols()                  {return indexOfAllZConsMols;}
399
400  void setZConsOutput(const char * fileName)          {zconsOutput = fileName;}
401  string getZConsOutput()                         {return zconsOutput;}
402
403  virtual void integrate();
404
405
406 #ifdef IS_MPI
407  virtual void update();                      //which is called to indicate the molecules' migration
408 #endif
409
410  enum ZConsState {zcsMoving, zcsFixed};
411
412  vector<Molecule*> zconsMols;              //z-constraint molecules array
413  vector<ZConsState> states;                 //state of z-constraint molecules
414
415
416
417  int totNumOfUnconsAtoms;              //total number of uncontraint atoms
418  double totalMassOfUncons;                //total mas of unconstraint molecules
419
420
421 protected:
422
423
424
425  virtual void calcForce( int calcPot, int calcStress );
426  virtual void thermalize(void);
427
428  void zeroOutVel();
429  void doZconstraintForce();
430  void doHarmonic(vector<double>& resPos);
431  bool checkZConsState();
432
433  bool haveFixedZMols();
434  bool haveMovingZMols();
435
436  double calcZSys();
437
438  int isZConstraintMol(Molecule* mol);
439
440
441  double zconsTime;                              //sample time
442  double zconsTol;                                 //tolerance of z-contratint
443  double zForceConst;                           //base force constant term
444                                                          //which is estimate by OOPSE
445
446
447  vector<double> massOfZConsMols;       //mass of z-constraint molecule
448  vector<double> kz;                              //force constant array
449
450  vector<double> zPos;                          //
451
452
453  vector<Molecule*> unconsMols;           //unconstraint molecules array
454  vector<double> massOfUnconsMols;    //mass array of unconstraint molecules
455
456
457  vector<ZConsParaItem>* parameters; //
458
459  vector<int> indexOfAllZConsMols;     //index of All Z-Constraint Molecuels
460
461  vector<int> indexOfZConsMols;                   //index of local Z-Constraint Molecules
462  vector<double> fz;
463  vector<double> curZPos;
464
465  bool usingSMD;
466  vector<double> prevCantPos;
467  vector<double> cantPos;
468  vector<double> cantVel;
469
470  double zconsFixTime;  
471  double zconsGap;
472  bool hasZConsGap;
473  vector<double> endFixTime;
474  
475  int whichDirection;                           //constraint direction
476
477 private:
478
479  string zconsOutput;                         //filename of zconstraint output
480  ZConsWriter* fzOut;                         //z-constraint writer
481
482  double curZconsTime;
483
484  double calcMovingMolsCOMVel();
485  double calcSysCOMVel();
486  double calcTotalForce();
487  void updateZPos();
488  void updateCantPos();
489  
490  ForceSubtractionPolicy* forcePolicy; //force subtraction policy
491  friend class ForceSubtractionPolicy;
492
493 };
494
495
496 //Sympletic quaternion Scheme Integrator
497 //Reference:
498 // T.F. Miller, M. Eleftheriou, P. Pattnaik, A. Ndirango, D. Newns and G.J. Martyna
499 //Symplectic quaternion Scheme for biophysical molecular dynamics
500 //116(20), 8649, J. Chem. Phys. (2002)
501 template<typename T> class SQSIntegrator : public T{
502  public:
503    virtual void moveA();
504    virtual void moveB();
505  protected:
506    void freeRotor();
507    void rotate(int k, double dt);
142      
143 < };
144 < #endif
143 > }
144 > #endif //INTEGRATORS_INTEGRATOR_HPP

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines