ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/Integrator.hpp
Revision: 767
Committed: Tue Sep 16 20:02:11 2003 UTC (20 years, 9 months ago) by tim
File size: 18246 byte(s)
Log Message:
fixed ecr grow in SimInfo

fixed conserved quantity in NPT (Still some small bug)

NPTi appears very stable.

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 tim 763 virtual double getConservedQuantity(void);
31 mmeineke 377
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 tim 763
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 tim 763 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 tim 763 void setChiTolerance(double tol) {chiTolerance = tol;}
103     virtual double getConservedQuantity(void);
104 gezelter 560
105 mmeineke 540 protected:
106 gezelter 560
107 mmeineke 561 virtual void moveA( void );
108     virtual void moveB( void );
109 mmeineke 540
110 mmeineke 561 virtual int readyCheck();
111 gezelter 560
112 mmeineke 746 virtual void resetIntegrator( void );
113    
114 gezelter 565 // chi is a propagated degree of freedom.
115 gezelter 560
116 gezelter 565 double chi;
117 gezelter 560
118 tim 763 //integral of chi(t)dt
119     double integralOfChidt;
120    
121 gezelter 565 // targetTemp must be set. tauThermostat must also be set;
122 gezelter 560
123     double targetTemp;
124     double tauThermostat;
125 mmeineke 561
126 gezelter 565 short int have_tau_thermostat, have_target_temp;
127 gezelter 560
128 tim 763 double *oldVel;
129     double *oldJi;
130    
131     double chiTolerance;
132     short int have_chi_tolerance;
133    
134 mmeineke 540 };
135    
136    
137    
138 tim 645 template<typename T> class NPTi : public T{
139    
140 gezelter 560 public:
141    
142 gezelter 574 NPTi ( SimInfo *theInfo, ForceFields* the_ff);
143 tim 763 virtual ~NPTi();
144    
145 mmeineke 594 virtual void integrateStep( int calcPot, int calcStress ){
146     calcStress = 1;
147 tim 645 T::integrateStep( calcPot, calcStress );
148 tim 763 /* accIntegralOfChidt(); */
149 mmeineke 594 }
150    
151 tim 763 virtual double getConservedQuantity(void);
152    
153 gezelter 560 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
154     void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
155     void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
156     void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
157 tim 763 void setChiTolerance(double tol) {chiTolerance = tol; have_chi_tolerance = 1;}
158     void setPosIterTolerance(double tol) {posIterTolerance = tol; have_pos_iter_tolerance = 1;}
159     void setEtaTolerance(double tol) {etaTolerance = tol; have_eta_tolerance = 1;}
160 gezelter 560
161     protected:
162    
163 mmeineke 561 virtual void moveA( void );
164     virtual void moveB( void );
165 gezelter 560
166 mmeineke 561 virtual int readyCheck();
167 gezelter 560
168 mmeineke 746 virtual void resetIntegrator( void );
169    
170 tim 763 void accIntegralOfChidt(void) { integralOfChidt += dt * chi;}
171    
172 gezelter 565 // chi and eta are the propagated degrees of freedom
173 gezelter 560
174 gezelter 565 double chi;
175     double eta;
176 gezelter 574 double NkBT;
177 tim 763 double fkBT;
178 gezelter 560
179 tim 763 int Nparticles;
180    
181     double integralOfChidt;
182    
183 gezelter 560 // targetTemp, targetPressure, and tauBarostat must be set.
184     // One of qmass or tauThermostat must be set;
185    
186     double targetTemp;
187     double targetPressure;
188     double tauThermostat;
189     double tauBarostat;
190    
191     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
192 gezelter 565 short int have_target_pressure;
193 gezelter 560
194 tim 763 double *oldPos;
195     double *oldVel;
196     double *oldJi;
197    
198     double chiTolerance;
199     short int have_chi_tolerance;
200     double posIterTolerance;
201     short int have_pos_iter_tolerance;
202     double etaTolerance;
203     short int have_eta_tolerance;
204    
205 gezelter 560 };
206    
207 tim 645 template<typename T> class NPTim : public T{
208 gezelter 596
209     public:
210    
211     NPTim ( SimInfo *theInfo, ForceFields* the_ff);
212 tim 763 virtual ~NPTim() {}
213 gezelter 596
214     virtual void integrateStep( int calcPot, int calcStress ){
215     calcStress = 1;
216 tim 645 T::integrateStep( calcPot, calcStress );
217 tim 763 accIntegralOfChidt();
218 gezelter 596 }
219    
220 tim 763 virtual double getConservedQuantity(void);
221    
222 gezelter 596 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
223     void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
224     void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
225     void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
226 tim 763 void setChiTolerance(double tol) {chiTolerance = tol;}
227     void setPosIterTolerance(double tol) {posIterTolerance = tol;}
228 gezelter 596
229     protected:
230    
231 gezelter 604 virtual void moveA( void );
232 gezelter 596 virtual void moveB( void );
233    
234     virtual int readyCheck();
235    
236 mmeineke 746 virtual void resetIntegrator( void );
237    
238 tim 763 void accIntegralOfChidt(void) { integralOfChidt += dt * chi;}
239    
240 gezelter 604 Molecule* myMolecules;
241     Atom** myAtoms;
242    
243 gezelter 596 // chi and eta are the propagated degrees of freedom
244    
245     double chi;
246     double eta;
247     double NkBT;
248 tim 763 double integralOfChidt;
249 gezelter 596
250     // targetTemp, targetPressure, and tauBarostat must be set.
251     // One of qmass or tauThermostat must be set;
252    
253     double targetTemp;
254     double targetPressure;
255     double tauThermostat;
256     double tauBarostat;
257    
258     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
259     short int have_target_pressure;
260 tim 763 double chiTolerance;
261     short int have_chi_tolerance;
262     double posIterTolerance;
263     short int have_pos_iter_tolerance;
264 gezelter 596
265     };
266    
267 mmeineke 755 template<typename T> class NPTzm : public T{
268    
269     public:
270    
271     NPTzm ( SimInfo *theInfo, ForceFields* the_ff);
272     virtual ~NPTzm() {};
273    
274     virtual void integrateStep( int calcPot, int calcStress ){
275     calcStress = 1;
276     T::integrateStep( calcPot, calcStress );
277     }
278    
279     void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
280     void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
281     void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
282     void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
283    
284     protected:
285    
286     virtual void moveA( void );
287     virtual void moveB( void );
288    
289     virtual int readyCheck();
290    
291     virtual void resetIntegrator( void );
292    
293     Molecule* myMolecules;
294     Atom** myAtoms;
295    
296     // chi and eta are the propagated degrees of freedom
297    
298     double chi;
299     double eta;
300     double etaZ;
301     double NkBT;
302    
303     // targetTemp, targetPressure, and tauBarostat must be set.
304     // One of qmass or tauThermostat must be set;
305    
306     double targetTemp;
307     double targetPressure;
308     double tauThermostat;
309     double tauBarostat;
310    
311     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
312     short int have_target_pressure;
313    
314     };
315    
316 tim 645 template<typename T> class NPTf : public T{
317 gezelter 576
318     public:
319    
320     NPTf ( SimInfo *theInfo, ForceFields* the_ff);
321 tim 767 virtual ~NPTf();
322 gezelter 576
323 mmeineke 594 virtual void integrateStep( int calcPot, int calcStress ){
324     calcStress = 1;
325 tim 645 T::integrateStep( calcPot, calcStress );
326 mmeineke 594 }
327 tim 763
328     virtual double getConservedQuantity(void);
329 mmeineke 594
330 gezelter 576 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
331     void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
332     void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
333     void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
334 tim 763 void setChiTolerance(double tol) {chiTolerance = tol;}
335     void setPosIterTolerance(double tol) {posIterTolerance = tol;}
336 gezelter 576
337     protected:
338    
339     virtual void moveA( void );
340     virtual void moveB( void );
341    
342 mmeineke 746 virtual void resetIntegrator( void );
343    
344 gezelter 576 virtual int readyCheck();
345    
346 tim 763
347 gezelter 576 // chi and eta are the propagated degrees of freedom
348    
349     double chi;
350 gezelter 588 double eta[3][3];
351 gezelter 576 double NkBT;
352 tim 767 double fkBT;
353 gezelter 576
354 tim 767 int Nparticles;
355    
356     double *oldPos;
357     double *oldVel;
358     double *oldJi;
359    
360 tim 763 double integralOfChidt;
361    
362 gezelter 576 // targetTemp, targetPressure, and tauBarostat must be set.
363     // One of qmass or tauThermostat must be set;
364    
365     double targetTemp;
366     double targetPressure;
367     double tauThermostat;
368     double tauBarostat;
369    
370     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
371     short int have_target_pressure;
372 tim 763 double chiTolerance;
373     short int have_chi_tolerance;
374     double posIterTolerance;
375     short int have_pos_iter_tolerance;
376 tim 767 double etaTolerance;
377     short int have_eta_tolerance;
378 gezelter 576 };
379    
380 mmeineke 755 template<typename T> class NPTxym : public T{
381    
382     public:
383    
384     NPTxym ( SimInfo *theInfo, ForceFields* the_ff);
385     virtual ~NPTxym() {};
386    
387     virtual void integrateStep( int calcPot, int calcStress ){
388     calcStress = 1;
389     T::integrateStep( calcPot, calcStress );
390     }
391    
392     void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
393     void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
394     void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
395     void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
396    
397     protected:
398    
399     virtual void moveA( void );
400     virtual void moveB( void );
401    
402     virtual int readyCheck();
403    
404     virtual void resetIntegrator( void );
405    
406     Molecule* myMolecules;
407     Atom** myAtoms;
408    
409     // chi and eta are the propagated degrees of freedom
410    
411     double chi;
412     double eta;
413     double etaX;
414     double etaY;
415     double NkBT;
416    
417     // targetTemp, targetPressure, and tauBarostat must be set.
418     // One of qmass or tauThermostat must be set;
419    
420     double targetTemp;
421     double targetPressure;
422     double tauThermostat;
423     double tauBarostat;
424    
425     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
426     short int have_target_pressure;
427    
428     };
429    
430    
431 tim 645 template<typename T> class NPTfm : public T{
432 gezelter 596
433     public:
434    
435     NPTfm ( SimInfo *theInfo, ForceFields* the_ff);
436     virtual ~NPTfm() {};
437    
438     virtual void integrateStep( int calcPot, int calcStress ){
439     calcStress = 1;
440 tim 645 T::integrateStep( calcPot, calcStress );
441 tim 763 accIntegralOfChidt();
442 gezelter 596 }
443    
444 tim 763 virtual double getConservedQuantity(void);
445    
446 gezelter 596 void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
447     void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
448     void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
449     void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
450 tim 763 void setChiTolerance(double tol) {chiTolerance = tol;}
451     void setPosIterTolerance(double tol) {posIterTolerance = tol;}
452 gezelter 596
453     protected:
454    
455     virtual void moveA( void );
456     virtual void moveB( void );
457    
458 mmeineke 746 virtual void resetIntegrator( void );
459    
460 gezelter 596 virtual int readyCheck();
461    
462 tim 763 void accIntegralOfChidt(void) { integralOfChidt += dt * chi;}
463    
464 gezelter 605 Molecule* myMolecules;
465     Atom** myAtoms;
466    
467 gezelter 596 // chi and eta are the propagated degrees of freedom
468    
469     double chi;
470     double eta[3][3];
471     double NkBT;
472 tim 763 double integralOfChidt;
473 gezelter 596
474     // targetTemp, targetPressure, and tauBarostat must be set.
475     // One of qmass or tauThermostat must be set;
476    
477     double targetTemp;
478     double targetPressure;
479     double tauThermostat;
480     double tauBarostat;
481    
482     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
483     short int have_target_pressure;
484 tim 763 double chiTolerance;
485     short int have_chi_tolerance;
486     double posIterTolerance;
487     short int have_pos_iter_tolerance;
488 gezelter 596
489     };
490    
491 gezelter 718
492     template<typename T> class NPTpr : public T{
493    
494     public:
495    
496     NPTpr ( SimInfo *theInfo, ForceFields* the_ff);
497     virtual ~NPTpr() {};
498    
499     virtual void integrateStep( int calcPot, int calcStress ){
500     calcStress = 1;
501     T::integrateStep( calcPot, calcStress );
502     }
503    
504     void setTauThermostat(double tt) {tauThermostat = tt; have_tau_thermostat=1;}
505     void setTauBarostat(double tb) {tauBarostat = tb; have_tau_barostat=1;}
506     void setTargetTemp(double tt) {targetTemp = tt; have_target_temp = 1;}
507     void setTargetPressure(double tp) {targetPressure = tp; have_target_pressure = 1;}
508 tim 763 void setChiTolerance(double tol) {chiTolerance = tol;}
509     void setPosIterTolerance(double tol) {posIterTolerance = tol;}
510 gezelter 718
511     protected:
512    
513     virtual void moveA( void );
514     virtual void moveB( void );
515    
516     virtual int readyCheck();
517    
518 mmeineke 746 virtual void resetIntegrator( void );
519    
520 gezelter 718 // chi and eta are the propagated degrees of freedom
521    
522     double chi;
523     double eta[3][3];
524     double NkBT;
525    
526     // targetTemp, targetPressure, and tauBarostat must be set.
527     // One of qmass or tauThermostat must be set;
528    
529     double targetTemp;
530     double targetPressure;
531     double tauThermostat;
532     double tauBarostat;
533    
534     short int have_tau_thermostat, have_tau_barostat, have_target_temp;
535     short int have_target_pressure;
536 tim 763 double chiTolerance;
537     short int have_chi_tolerance;
538     double posIterTolerance;
539     short int have_pos_iter_tolerance;
540 gezelter 718
541     };
542    
543    
544 tim 658 template<typename T> class ZConstraint : public T {
545 tim 701
546     public:
547 tim 738 class ForceSubtractionPolicy{
548 tim 699 public:
549 tim 738 ForceSubtractionPolicy(ZConstraint<T>* integrator) {zconsIntegrator = integrator;}
550 tim 658
551 tim 701 virtual void update() = 0;
552 tim 699 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
553     virtual double getZFOfMovingMols(Atom* atom, double totalForce) = 0;
554 tim 701 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) = 0;
555     virtual double getHFOfUnconsMols(Atom* atom, double totalForce) = 0;
556    
557     protected:
558     ZConstraint<T>* zconsIntegrator;;
559 tim 699 };
560    
561 tim 738 class PolicyByNumber : public ForceSubtractionPolicy{
562 gezelter 747
563 tim 699 public:
564 tim 738 PolicyByNumber(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
565 tim 701 virtual void update();
566 tim 699 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
567     virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
568 tim 701 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
569     virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
570    
571 tim 699 private:
572 tim 763 int totNumOfMovingAtoms;
573 tim 699 };
574    
575 tim 738 class PolicyByMass : public ForceSubtractionPolicy{
576 gezelter 747
577 tim 699 public:
578 tim 738 PolicyByMass(ZConstraint<T>* integrator) :ForceSubtractionPolicy(integrator) {}
579 tim 701
580     virtual void update();
581 tim 699 virtual double getZFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce) ;
582     virtual double getZFOfMovingMols(Atom* atom, double totalForce) ;
583 tim 701 virtual double getHFOfFixedZMols(Molecule* mol, Atom* atom, double totalForce);
584     virtual double getHFOfUnconsMols(Atom* atom, double totalForce);
585 tim 699
586 tim 701 private:
587     double totMassOfMovingAtoms;
588 tim 699 };
589    
590 tim 658 public:
591    
592     ZConstraint( SimInfo *theInfo, ForceFields* the_ff);
593     ~ZConstraint();
594 tim 677
595 tim 658 void setZConsTime(double time) {this->zconsTime = time;}
596     void getZConsTime() {return zconsTime;}
597    
598 tim 701 void setIndexOfAllZConsMols(vector<int> index) {indexOfAllZConsMols = index;}
599     void getIndexOfAllZConsMols() {return indexOfAllZConsMols;}
600 tim 658
601 tim 701 void setZConsOutput(const char * fileName) {zconsOutput = fileName;}
602 tim 658 string getZConsOutput() {return zconsOutput;}
603 tim 677
604     virtual void integrate();
605    
606 tim 658
607     #ifdef IS_MPI
608 tim 701 virtual void update(); //which is called to indicate the molecules' migration
609 mmeineke 377 #endif
610 tim 658
611     protected:
612    
613 tim 701 enum ZConsState {zcsMoving, zcsFixed};
614 tim 677
615     virtual void calcForce( int calcPot, int calcStress );
616     virtual void thermalize(void);
617    
618     void zeroOutVel();
619     void doZconstraintForce();
620 tim 682 void doHarmonic();
621 tim 677 bool checkZConsState();
622    
623     bool haveFixedZMols();
624     bool haveMovingZMols();
625    
626     double calcZSys();
627    
628     int isZConstraintMol(Molecule* mol);
629    
630    
631 tim 701 double zconsTime; //sample time
632     double zconsTol; //tolerance of z-contratint
633     double zForceConst; //base force constant term
634     //which is estimate by OOPSE
635 tim 658
636 tim 701 vector<Molecule*> zconsMols; //z-constraint molecules array
637     vector<double> massOfZConsMols; //mass of z-constraint molecule
638     vector<double> kz; //force constant array
639     vector<ZConsState> states; //state of z-constraint molecules
640     vector<double> zPos; //
641 tim 658
642 tim 677
643 tim 701 vector<Molecule*> unconsMols; //unconstraint molecules array
644     vector<double> massOfUnconsMols; //mass array of unconstraint molecules
645     double totalMassOfUncons; //total mas of unconstraint molecules
646 tim 682
647 tim 701 vector<ZConsParaItem>* parameters; //
648 tim 658
649     vector<int> indexOfAllZConsMols; //index of All Z-Constraint Molecuels
650 tim 677
651     int* indexOfZConsMols; //index of local Z-Constraint Molecules
652 tim 658 double* fz;
653 tim 699 double* curZPos;
654 tim 658
655 tim 701 int totNumOfUnconsAtoms; //total number of uncontraint atoms
656 tim 677
657     int whichDirection; //constraint direction
658    
659 tim 658 private:
660 tim 677
661 tim 701 string zconsOutput; //filename of zconstraint output
662     ZConsWriter* fzOut; //z-constraint writer
663 tim 677
664 tim 701 double curZconsTime;
665 tim 699
666 tim 696 double calcMovingMolsCOMVel();
667     double calcSysCOMVel();
668     double calcTotalForce();
669 tim 701
670 gezelter 747 ForceSubtractionPolicy* forcePolicy; //force subtraction policy
671 tim 738 friend class ForceSubtractionPolicy;
672 tim 677
673 tim 658 };
674    
675     #endif