ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-3.0/src/integrators/NPTi.cpp
Revision: 1865
Committed: Tue Dec 7 05:12:41 2004 UTC (19 years, 9 months ago) by tim
File size: 3516 byte(s)
Log Message:
fix a bug in UseInitXSstate

File Contents

# User Rev Content
1 tim 1822 #include "NPTi.hpp"
2 tim 1492 #include "brains/SimInfo.hpp"
3     #include "brains/Thermo.hpp"
4 tim 1837 #include "integrators/IntegratorCreator.hpp"
5 tim 1822 #include "integrators/NPT.hpp"
6     #include "primitives/Molecule.hpp"
7     #include "utils/OOPSEConstant.hpp"
8 tim 1492 #include "utils/simError.h"
9 gezelter 1490
10 tim 1822 namespace oopse {
11 gezelter 1490
12 tim 1837 static IntegratorBuilder<NPTi>* NPTiCreator = new IntegratorBuilder<NPTi>("NPTi");
13    
14 gezelter 1490 // Basic isotropic thermostating and barostating via the Melchionna
15     // modification of the Hoover algorithm:
16     //
17     // Melchionna, S., Ciccotti, G., and Holian, B. L., 1993,
18     // Molec. Phys., 78, 533.
19     //
20     // and
21     //
22     // Hoover, W. G., 1986, Phys. Rev. A, 34, 2499.
23    
24 tim 1822 NPTi::NPTi ( SimInfo *info) : NPT(info){
25 gezelter 1490
26     }
27    
28 tim 1774 void NPTi::evolveEtaA() {
29 tim 1822 eta += dt2 * ( instaVol * (instaPress - targetPressure) /
30     (OOPSEConstant::pressureConvert*NkBT*tb2));
31     oldEta = eta;
32 gezelter 1490 }
33    
34 tim 1774 void NPTi::evolveEtaB() {
35 gezelter 1490
36 tim 1822 prevEta = eta;
37     eta = oldEta + dt2 * ( instaVol * (instaPress - targetPressure) /
38     (OOPSEConstant::pressureConvert*NkBT*tb2));
39 gezelter 1490 }
40    
41 tim 1774 void NPTi::calcVelScale() {
42 tim 1822 vScale = chi + eta;
43 gezelter 1490 }
44    
45 tim 1774 void NPTi::getVelScaleA(Vector3d& sc, const Vector3d& vel) {
46     sc = vel * vScale;
47 gezelter 1490 }
48    
49 tim 1774 void NPTi::getVelScaleB(Vector3d& sc, int index ){
50     sc = oldVel[index] * vScale;
51 gezelter 1490 }
52    
53    
54 tim 1774 void NPTi::getPosScale(const Vector3d& pos, const Vector3d& COM,
55 tim 1822 int index, Vector3d& sc){
56 tim 1774 /**@todo*/
57     sc = oldPos[index] + pos/2.0 -COM;
58     sc *= eta;
59 gezelter 1490 }
60    
61 tim 1774 void NPTi::scaleSimBox(){
62 gezelter 1490
63 tim 1822 double scaleFactor;
64 gezelter 1490
65 tim 1822 scaleFactor = exp(dt*eta);
66 gezelter 1490
67 tim 1822 if ((scaleFactor > 1.1) || (scaleFactor < 0.9)) {
68     sprintf( painCave.errMsg,
69 gezelter 1490 "NPTi error: Attempting a Box scaling of more than 10 percent"
70     " check your tauBarostat, as it is probably too small!\n"
71     " eta = %lf, scaleFactor = %lf\n", eta, scaleFactor
72     );
73 tim 1822 painCave.isFatal = 1;
74     simError();
75     } else {
76     Mat3x3d hmat = currentSnapshot_->getHmat();
77     hmat *= scaleFactor;
78     currentSnapshot_->setHmat(hmat);
79     }
80 gezelter 1490
81     }
82    
83 tim 1774 bool NPTi::etaConverged() {
84 gezelter 1490
85 tim 1822 return ( fabs(prevEta - eta) <= etaTolerance );
86 gezelter 1490 }
87    
88 tim 1774 double NPTi::calcConservedQuantity(){
89 gezelter 1490
90 tim 1822 double conservedQuantity;
91     double Energy;
92     double thermostat_kinetic;
93     double thermostat_potential;
94     double barostat_kinetic;
95     double barostat_potential;
96 gezelter 1490
97 tim 1822 Energy =thermo.getTotalE();
98 gezelter 1490
99 tim 1822 thermostat_kinetic = fkBT* tt2 * chi * chi / (2.0 * OOPSEConstant::energyConvert);
100 gezelter 1490
101 tim 1822 thermostat_potential = fkBT* integralOfChidt / OOPSEConstant::energyConvert;
102 gezelter 1490
103    
104 tim 1822 barostat_kinetic = 3.0 * NkBT * tb2 * eta * eta /(2.0 * OOPSEConstant::energyConvert);
105 gezelter 1490
106 tim 1822 barostat_potential = (targetPressure * thermo.getVolume() / OOPSEConstant::pressureConvert) /
107     OOPSEConstant::energyConvert;
108 gezelter 1490
109 tim 1822 conservedQuantity = Energy + thermostat_kinetic + thermostat_potential +
110     barostat_kinetic + barostat_potential;
111 gezelter 1490
112 tim 1822 return conservedQuantity;
113 gezelter 1490 }
114    
115 tim 1822 void NPTi::loadEta() {
116     Mat3x3d etaMat = currentSnapshot_->getEta();
117     eta = etaMat(0,0);
118     if (fabs(etaMat(1,1) - eta) >= oopse::epsilon || fabs(etaMat(1,1) - eta) >= oopse::epsilon || etaMat.isDiagonal()) {
119     sprintf( painCave.errMsg,
120     "NPTi error: the diagonal elements of are eta matrix is not same or etaMat is not a diagonal matrix");
121     painCave.isFatal = 1;
122     simError();
123     }
124     }
125    
126     void NPTi::saveEta() {
127     Mat3x3d etaMat(0.0);
128     etaMat(0, 0) = eta;
129     etaMat(1, 1) = eta;
130     etaMat(2, 2) = eta;
131     currentSnapshot_->setEta(etaMat);
132     }
133    
134     }