ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new-templateless/OOPSE/libmdtools/NPTf.cpp
(Generate patch)

Comparing:
trunk/OOPSE/libmdtools/NPTf.cpp (file contents), Revision 829 by gezelter, Tue Oct 28 16:03:37 2003 UTC vs.
branches/new-templateless/OOPSE/libmdtools/NPTf.cpp (file contents), Revision 852 by mmeineke, Thu Nov 6 18:20:47 2003 UTC

# Line 1 | Line 1
1 + #include <stdlib.h>
2   #include <math.h>
3 + #include <string.h>
4 +
5   #include "Atom.hpp"
6   #include "SRI.hpp"
7   #include "AbstractClasses.hpp"
# Line 7 | Line 10
10   #include "Thermo.hpp"
11   #include "ReadWrite.hpp"
12   #include "Integrator.hpp"
13 < #include "simError.h"
13 > #include "simError.h"
14  
15   #ifdef IS_MPI
16   #include "mpiSimulation.hpp"
# Line 17 | Line 20
20   // modification of the Hoover algorithm:
21   //
22   //    Melchionna, S., Ciccotti, G., and Holian, B. L., 1993,
23 < //       Molec. Phys., 78, 533.
23 > //       Molec. Phys., 78, 533.
24   //
25   //           and
26 < //
26 > //
27   //    Hoover, W. G., 1986, Phys. Rev. A, 34, 2499.
28  
29 < template<typename T> NPTf<T>::NPTf ( SimInfo *theInfo, ForceFields* the_ff):
30 <  T( theInfo, the_ff )
29 > NPTf::NPTf ( SimInfo *theInfo, ForceFields* the_ff):
30 >  NPT( theInfo, the_ff )
31   {
32 <  
32 >  GenericData* data;
33 >  double *etaArray;
34    int i,j;
35 <  
35 >
36    for(i = 0; i < 3; i++){
37      for (j = 0; j < 3; j++){
38 <      
38 >
39        eta[i][j] = 0.0;
40        oldEta[i][j] = 0.0;
41      }
42    }
43 +
44 +  // retrieve eta array from simInfo if it exists
45 +  data = info->getProperty(ETAVALUE_ID);
46 +  if(data != NULL){
47 +    
48 +    int test = data->getDarray(etaArray);
49 +    
50 +    if( test == 9 ){
51 +      
52 +      for(i = 0; i < 3; i++){
53 +        for (j = 0; j < 3; j++){
54 +          eta[i][j] = etaArray[3*i+j];
55 +          oldEta[i][j] = eta[i][j];
56 +        }
57 +      }    
58 +      delete[] etaArray;
59 +    }
60 +    else
61 +      std::cerr << "NPTf error: etaArray is not length 9 (actual = " << test
62 +                << ").\n"
63 +                << "            Simulation wil proceed with eta = 0;\n";
64 +  }
65   }
66  
67 < template<typename T> NPTf<T>::~NPTf() {
67 > NPTf::~NPTf() {
68  
69    // empty for now
70   }
71  
72 < template<typename T> void NPTf<T>::resetIntegrator() {
73 <  
72 > void NPTf::resetIntegrator() {
73 >
74    int i, j;
75 <  
75 >
76    for(i = 0; i < 3; i++)
77      for (j = 0; j < 3; j++)
78        eta[i][j] = 0.0;
79 <  
80 <  T::resetIntegrator();
79 >
80 >  NPT::resetIntegrator();
81   }
82  
83 < template<typename T> void NPTf<T>::evolveEtaA() {
84 <  
83 > void NPTf::evolveEtaA() {
84 >
85    int i, j;
86 <  
86 >
87    for(i = 0; i < 3; i ++){
88      for(j = 0; j < 3; j++){
89        if( i == j)
90 <        eta[i][j] += dt2 *  instaVol *
90 >        eta[i][j] += dt2 *  instaVol *
91            (press[i][j] - targetPressure/p_convert) / (NkBT*tb2);
92        else
93          eta[i][j] += dt2 * instaVol * press[i][j] / (NkBT*tb2);
94      }
95    }
96 <  
96 >
97    for(i = 0; i < 3; i++)
98      for (j = 0; j < 3; j++)
99        oldEta[i][j] = eta[i][j];
100   }
101  
102 < template<typename T> void NPTf<T>::evolveEtaB() {
103 <  
102 > void NPTf::evolveEtaB() {
103 >
104    int i,j;
105  
106    for(i = 0; i < 3; i++)
# Line 84 | Line 110 | template<typename T> void NPTf<T>::evolveEtaB() {
110    for(i = 0; i < 3; i ++){
111      for(j = 0; j < 3; j++){
112        if( i == j) {
113 <        eta[i][j] = oldEta[i][j] + dt2 *  instaVol *
113 >        eta[i][j] = oldEta[i][j] + dt2 *  instaVol *
114            (press[i][j] - targetPressure/p_convert) / (NkBT*tb2);
115        } else {
116          eta[i][j] = oldEta[i][j] + dt2 * instaVol * press[i][j] / (NkBT*tb2);
# Line 93 | Line 119 | template<typename T> void NPTf<T>::evolveEtaB() {
119    }
120   }
121  
122 < template<typename T> void NPTf<T>::getVelScaleA(double sc[3], double vel[3]) {
122 > void NPTf::getVelScaleA(double sc[3], double vel[3]) {
123    int i,j;
124    double vScale[3][3];
125  
126    for (i = 0; i < 3; i++ ) {
127      for (j = 0; j < 3; j++ ) {
128        vScale[i][j] = eta[i][j];
129 <      
129 >
130        if (i == j) {
131 <        vScale[i][j] += chi;          
132 <      }              
131 >        vScale[i][j] += chi;
132 >      }
133      }
134    }
135 <  
135 >
136    info->matVecMul3( vScale, vel, sc );
137   }
138  
139 < template<typename T> void NPTf<T>::getVelScaleB(double sc[3], int index ){
139 > void NPTf::getVelScaleB(double sc[3], int index ){
140    int i,j;
141    double myVel[3];
142    double vScale[3][3];
143  
144 + //   std::cerr << "velScaleB chi = " << chi << "\n";
145 +
146    for (i = 0; i < 3; i++ ) {
147      for (j = 0; j < 3; j++ ) {
148        vScale[i][j] = eta[i][j];
149 <      
149 >
150        if (i == j) {
151 <        vScale[i][j] += chi;          
152 <      }              
151 >        vScale[i][j] += chi;
152 >      }
153      }
154    }
155 <  
155 >
156    for (j = 0; j < 3; j++)
157      myVel[j] = oldVel[3*index + j];
158  
159    info->matVecMul3( vScale, myVel, sc );
160   }
161  
162 < template<typename T> void NPTf<T>::getPosScale(double pos[3], double COM[3],
163 <                                               int index, double sc[3]){
162 > void NPTf::getPosScale(double pos[3], double COM[3],
163 >                       int index, double sc[3]){
164    int j;
165    double rj[3];
166  
# Line 142 | Line 170 | template<typename T> void NPTf<T>::getPosScale(double
170    info->matVecMul3( eta, rj, sc );
171   }
172  
173 < template<typename T> void NPTf<T>::scaleSimBox( void ){
173 > void NPTf::scaleSimBox( void ){
174  
175    int i,j,k;
176    double scaleMat[3][3];
177    double eta2ij;
178    double bigScale, smallScale, offDiagMax;
179    double hm[3][3], hmnew[3][3];
152  
180  
181  
182 +
183    // Scale the box after all the positions have been moved:
184 <  
184 >
185    // Use a taylor expansion for eta products:  Hmat = Hmat . exp(dt * etaMat)
186    //  Hmat = Hmat . ( Ident + dt * etaMat  + dt^2 * etaMat*etaMat / 2)
187 <  
187 >
188    bigScale = 1.0;
189    smallScale = 1.0;
190    offDiagMax = 0.0;
191 <  
191 >
192    for(i=0; i<3; i++){
193      for(j=0; j<3; j++){
194 <      
194 >
195        // Calculate the matrix Product of the eta array (we only need
196        // the ij element right now):
197 <      
197 >
198        eta2ij = 0.0;
199        for(k=0; k<3; k++){
200          eta2ij += eta[i][k] * eta[k][j];
201        }
202 <      
202 >
203        scaleMat[i][j] = 0.0;
204        // identity matrix (see above):
205        if (i == j) scaleMat[i][j] = 1.0;
# Line 179 | Line 207 | template<typename T> void NPTf<T>::scaleSimBox( void )
207        scaleMat[i][j] += dt*eta[i][j]  + 0.5*dt*dt*eta2ij;
208  
209        if (i != j)
210 <        if (fabs(scaleMat[i][j]) > offDiagMax)
210 >        if (fabs(scaleMat[i][j]) > offDiagMax)
211            offDiagMax = fabs(scaleMat[i][j]);
212      }
213  
214      if (scaleMat[i][i] > bigScale) bigScale = scaleMat[i][i];
215      if (scaleMat[i][i] < smallScale) smallScale = scaleMat[i][i];
216    }
217 <  
218 <  if ((bigScale > 1.1) || (smallScale < 0.9)) {
217 >
218 >  if ((bigScale > 1.01) || (smallScale < 0.99)) {
219      sprintf( painCave.errMsg,
220 <             "NPTf error: Attempting a Box scaling of more than 10 percent.\n"
220 >             "NPTf error: Attempting a Box scaling of more than 1 percent.\n"
221               " Check your tauBarostat, as it is probably too small!\n\n"
222               " scaleMat = [%lf\t%lf\t%lf]\n"
223               "            [%lf\t%lf\t%lf]\n"
# Line 199 | Line 227 | template<typename T> void NPTf<T>::scaleSimBox( void )
227               scaleMat[2][0],scaleMat[2][1],scaleMat[2][2]);
228      painCave.isFatal = 1;
229      simError();
230 <  } else if (offDiagMax > 0.1) {
230 >  } else if (offDiagMax > 0.01) {
231      sprintf( painCave.errMsg,
232 <             "NPTf error: Attempting an off-diagonal Box scaling of more than 10 percent.\n"
232 >             "NPTf error: Attempting an off-diagonal Box scaling of more than 1 percent.\n"
233               " Check your tauBarostat, as it is probably too small!\n\n"
234               " scaleMat = [%lf\t%lf\t%lf]\n"
235               "            [%lf\t%lf\t%lf]\n"
# Line 218 | Line 246 | template<typename T> void NPTf<T>::scaleSimBox( void )
246    }
247   }
248  
249 < template<typename T> bool NPTf<T>::etaConverged() {
249 > bool NPTf::etaConverged() {
250    int i;
251    double diffEta, sumEta;
252  
253    sumEta = 0;
254    for(i = 0; i < 3; i++)
255 <    sumEta += pow(prevEta[i][i] - eta[i][i], 2);    
256 <  
255 >    sumEta += pow(prevEta[i][i] - eta[i][i], 2);
256 >
257    diffEta = sqrt( sumEta / 3.0 );
258 <  
258 >
259    return ( diffEta <= etaTolerance );
260   }
261  
262 < template<typename T> double NPTf<T>::getConservedQuantity(void){
263 <  
262 > double NPTf::getConservedQuantity(void){
263 >
264    double conservedQuantity;
265    double totalEnergy;
266    double thermostat_kinetic;
# Line 244 | Line 272 | template<typename T> double NPTf<T>::getConservedQuant
272  
273    totalEnergy = tStats->getTotalE();
274  
275 <  thermostat_kinetic = fkBT * tt2 * chi * chi /
275 >  thermostat_kinetic = fkBT * tt2 * chi * chi /
276      (2.0 * eConvert);
277  
278    thermostat_potential = fkBT* integralOfChidt / eConvert;
# Line 253 | Line 281 | template<typename T> double NPTf<T>::getConservedQuant
281    info->matMul3(a, eta, b);
282    trEta = info->matTrace3(b);
283  
284 <  barostat_kinetic = NkBT * tb2 * trEta /
284 >  barostat_kinetic = NkBT * tb2 * trEta /
285      (2.0 * eConvert);
286 <  
287 <  barostat_potential = (targetPressure * tStats->getVolume() / p_convert) /
286 >
287 >  barostat_potential = (targetPressure * tStats->getVolume() / p_convert) /
288      eConvert;
289  
290    conservedQuantity = totalEnergy + thermostat_kinetic + thermostat_potential +
291      barostat_kinetic + barostat_potential;
264  
265 //   cout.width(8);
266 //   cout.precision(8);
292  
293 < //   cerr << info->getTime() << "\t" << Energy << "\t" << thermostat_kinetic <<
269 < //       "\t" << thermostat_potential << "\t" << barostat_kinetic <<
270 < //       "\t" << barostat_potential << "\t" << conservedQuantity << endl;
293 >  return conservedQuantity;
294  
272  return conservedQuantity;
273  
295   }
296 +
297 + char* NPTf::getAdditionalParameters(void){
298 +
299 +  sprintf(addParamBuffer,
300 +          "\t%G\t%G;"
301 +          "\t%G\t%G\t%G;"
302 +          "\t%G\t%G\t%G;"
303 +          "\t%G\t%G\t%G;",
304 +          chi, integralOfChidt,
305 +          eta[0][0], eta[0][1], eta[0][2],
306 +          eta[1][0], eta[1][1], eta[1][2],
307 +          eta[2][0], eta[2][1], eta[2][2]
308 +          );
309 +
310 +  return addParamBuffer;
311 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines