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

Comparing branches/new_design/OOPSE-4/src/integrators/Integrator.hpp (file contents):
Revision 1720, Thu Oct 28 22:34:02 2004 UTC vs.
Revision 1721 by tim, Tue Nov 9 01:08:31 2004 UTC

# Line 1 | Line 1
1 < #ifndef _INTEGRATOR_H_
2 < #define _INTEGRATOR_H_
1 > /*
2 > * Copyright (C) 2000-2004  Object Oriented Parallel Simulation Engine (OOPSE) project
3 > *
4 > * Contact: oopse@oopse.org
5 > *
6 > * This program is free software; you can redistribute it and/or
7 > * modify it under the terms of the GNU Lesser General Public License
8 > * as published by the Free Software Foundation; either version 2.1
9 > * of the License, or (at your option) any later version.
10 > * All we ask is that proper credit is given for our work, which includes
11 > * - but is not limited to - adding the above copyright notice to the beginning
12 > * of your source code files, and to any copyright notice that you may distribute
13 > * with programs based on this work.
14 > *
15 > * This program is distributed in the hope that it will be useful,
16 > * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 > * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 > * GNU Lesser General Public License for more details.
19 > *
20 > * You should have received a copy of the GNU Lesser General Public License
21 > * along with this program; if not, write to the Free Software
22 > * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23 > *
24 > */
25 >
26 > /**
27 >  * @file Integrator.hpp
28 >  * @author tlin
29 >  * @date 11/08/2004
30 >  * @time 13:25am
31 >  * @version 1.0
32 >  */
33  
34 < #include <string>
35 < #include <vector>
6 < #include "primitives/Atom.hpp"
7 < #include "primitives/StuntDouble.hpp"
8 < #include "primitives/Molecule.hpp"
9 < #include "primitives/SRI.hpp"
10 < #include "primitives/AbstractClasses.hpp"
11 < #include "brains/SimInfo.hpp"
12 < #include "UseTheForce/ForceFields.hpp"
13 < #include "brains/Thermo.hpp"
14 < #include "io/ReadWrite.hpp"
15 < #include "io/ZConsWriter.hpp"
16 < #include "restraints/Restraints.hpp"
34 > #ifndef INTEGRATORS_INTEGRATOR_HPP
35 > #define INTEGRATORS_INTEGRATOR_HPP
36  
37 < using namespace std;
19 < const double kB = 8.31451e-7;// boltzmann constant amu*Ang^2*fs^-2/K
20 < const double eConvert = 4.184e-4; // converts kcal/mol -> amu*A^2/fs^2
21 < const double p_convert = 1.63882576e8; //converts amu*fs^-2*Ang^-1 -> atm
22 < const int maxIteration = 300;
23 < const double tol = 1.0e-6;
37 > namespace oopse {
38  
39 < class VelVerletConsFramework;
40 < template<typename T = BaseIntegrator> class Integrator : public T {
41 <
42 < public:
43 <  Integrator( SimInfo *theInfo, ForceFields* the_ff );
30 <  virtual ~Integrator();
31 <  void integrate( void );
32 <  virtual double  getConservedQuantity(void);
33 <  virtual string getAdditionalParameters(void);
34 <
35 < protected:
36 <
37 <  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; }
44 <
45 <  virtual void resetIntegrator( void ) { }
46 <
47 <  virtual void calcForce( int calcPot, int calcStress );
48 <  virtual void thermalize();
49 <
50 <  virtual bool stopIntegrator() {return false;}
51 <
52 <  virtual void rotationPropagation( StuntDouble* sd, double ji[3] );
53 <
54 <  void checkConstraints( void );
55 <  void rotate( int axes1, int axes2, double angle, double j[3],
56 <         double A[3][3] );
57 <
58 <  ForceFields* myFF;
59 <
60 <  SimInfo *info; // all the info we'll ever need
61 <  vector<StuntDouble*> integrableObjects;
62 <  int nAtoms;  /* the number of atoms */
63 <  int oldAtoms;
64 <  Atom **atoms; /* array of atom pointers */
65 <  Molecule* molecules;
66 <  int nMols;
67 <
68 <
69 <  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;
212 <
213 <  double tt2, tb2;
214 <  double instaTemp, instaPress, instaVol;
215 <  double press[3][3];
216 <
217 <  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{
39 > /**
40 > * @class Integrator Integrator.hpp "integrators/Integrator.hpp"
41 > * @brief Base class of Integrator
42 > */
43 > class Integrator {
44      public:
348      ForceSubtractionPolicy(ZConstraint<T>* integrator) {zconsIntegrator = integrator;}
45  
46 <      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;
46 >        virtual ~Integrator() {}
47  
48 <   protected:
49 <     ZConstraint<T>* zconsIntegrator;
50 <  };
51 <
52 <  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 <
48 >        virtual void integrate() =0;
49 >        
50 >    protected:
51 >        
52 >        virtual void calcConservedQuantity() = 0;
53   };
54  
55  
56 < //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);
56 > typedef GenericFactory<Integrator, std::string, Integrator* (*)(SimInfo*)> IntegratorFactory;
57      
58 < };
59 < #endif
58 > }
59 > #endif //INTEGRATORS_INTEGRATOR_HPP

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines