ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/oopse-1.0/libmdtools/NPTi.cpp
Revision: 1447
Committed: Fri Jul 30 21:01:35 2004 UTC (19 years, 11 months ago) by gezelter
File size: 4227 byte(s)
Log Message:
Initial import of OOPSE sources into cvs tree

File Contents

# User Rev Content
1 gezelter 1447 #include <math.h>
2     #include "Atom.hpp"
3     #include "SRI.hpp"
4     #include "AbstractClasses.hpp"
5     #include "SimInfo.hpp"
6     #include "ForceFields.hpp"
7     #include "Thermo.hpp"
8     #include "ReadWrite.hpp"
9     #include "Integrator.hpp"
10     #include "simError.h"
11    
12     #ifdef IS_MPI
13     #include "mpiSimulation.hpp"
14     #endif
15    
16     // Basic isotropic thermostating and barostating via the Melchionna
17     // modification of the Hoover algorithm:
18     //
19     // Melchionna, S., Ciccotti, G., and Holian, B. L., 1993,
20     // Molec. Phys., 78, 533.
21     //
22     // and
23     //
24     // Hoover, W. G., 1986, Phys. Rev. A, 34, 2499.
25    
26     template<typename T> NPTi<T>::NPTi ( SimInfo *theInfo, ForceFields* the_ff):
27     T( theInfo, the_ff )
28     {
29     GenericData* data;
30     DoubleArrayData * etaValue;
31     vector<double> etaArray;
32    
33     eta = 0.0;
34     oldEta = 0.0;
35    
36     if( theInfo->useInitXSstate ){
37     // retrieve eta from simInfo if
38     data = info->getProperty(ETAVALUE_ID);
39     if(data){
40     etaValue = dynamic_cast<DoubleArrayData*>(data);
41    
42     if(etaValue){
43     etaArray = etaValue->getData();
44     eta = etaArray[0];
45     oldEta = eta;
46     }
47     }
48     }
49     }
50    
51     template<typename T> NPTi<T>::~NPTi() {
52     //nothing for now
53     }
54    
55     template<typename T> void NPTi<T>::resetIntegrator() {
56     eta = 0.0;
57     T::resetIntegrator();
58     }
59    
60     template<typename T> void NPTi<T>::evolveEtaA() {
61     eta += dt2 * ( instaVol * (instaPress - targetPressure) /
62     (p_convert*NkBT*tb2));
63     oldEta = eta;
64     }
65    
66     template<typename T> void NPTi<T>::evolveEtaB() {
67    
68     prevEta = eta;
69     eta = oldEta + dt2 * ( instaVol * (instaPress - targetPressure) /
70     (p_convert*NkBT*tb2));
71     }
72    
73     template<typename T> void NPTi<T>::calcVelScale(void) {
74     vScale = chi + eta;
75     }
76    
77     template<typename T> void NPTi<T>::getVelScaleA(double sc[3], double vel[3]) {
78     int i;
79    
80     for(i=0; i<3; i++) sc[i] = vel[i] * vScale;
81     }
82    
83     template<typename T> void NPTi<T>::getVelScaleB(double sc[3], int index ){
84     int i;
85    
86     for(i=0; i<3; i++) sc[i] = oldVel[index*3 + i] * vScale;
87     }
88    
89    
90     template<typename T> void NPTi<T>::getPosScale(double pos[3], double COM[3],
91     int index, double sc[3]){
92     int j;
93    
94     for(j=0; j<3; j++)
95     sc[j] = ( oldPos[index*3+j] + pos[j]) / 2.0 - COM[j];
96    
97     for(j=0; j<3; j++)
98     sc[j] *= eta;
99     }
100    
101     template<typename T> void NPTi<T>::scaleSimBox( void ){
102    
103     double scaleFactor;
104    
105     scaleFactor = exp(dt*eta);
106    
107     if ((scaleFactor > 1.1) || (scaleFactor < 0.9)) {
108     sprintf( painCave.errMsg,
109     "NPTi error: Attempting a Box scaling of more than 10 percent"
110     " check your tauBarostat, as it is probably too small!\n"
111     " eta = %lf, scaleFactor = %lf\n", eta, scaleFactor
112     );
113     painCave.isFatal = 1;
114     simError();
115     } else {
116     info->scaleBox(scaleFactor);
117     }
118    
119     }
120    
121     template<typename T> bool NPTi<T>::etaConverged() {
122    
123     return ( fabs(prevEta - eta) <= etaTolerance );
124     }
125    
126     template<typename T> double NPTi<T>::getConservedQuantity(void){
127    
128     double conservedQuantity;
129     double Energy;
130     double thermostat_kinetic;
131     double thermostat_potential;
132     double barostat_kinetic;
133     double barostat_potential;
134    
135     Energy = tStats->getTotalE();
136    
137     thermostat_kinetic = fkBT* tt2 * chi * chi /
138     (2.0 * eConvert);
139    
140     thermostat_potential = fkBT* integralOfChidt / eConvert;
141    
142    
143     barostat_kinetic = 3.0 * NkBT * tb2 * eta * eta /
144     (2.0 * eConvert);
145    
146     barostat_potential = (targetPressure * tStats->getVolume() / p_convert) /
147     eConvert;
148    
149     conservedQuantity = Energy + thermostat_kinetic + thermostat_potential +
150     barostat_kinetic + barostat_potential;
151    
152     // cout.width(8);
153     // cout.precision(8);
154    
155     // cerr << info->getTime() << "\t" << Energy << "\t" << thermostat_kinetic <<
156     // "\t" << thermostat_potential << "\t" << barostat_kinetic <<
157     // "\t" << barostat_potential << "\t" << conservedQuantity << endl;
158     return conservedQuantity;
159     }
160    
161     template<typename T> string NPTi<T>::getAdditionalParameters(void){
162     string parameters;
163     const int BUFFERSIZE = 2000; // size of the read buffer
164     char buffer[BUFFERSIZE];
165    
166     sprintf(buffer,"\t%G\t%G;", chi, integralOfChidt);
167     parameters += buffer;
168    
169     sprintf(buffer,"\t%G\t0\t0;", eta);
170     parameters += buffer;
171    
172     sprintf(buffer,"\t0\t%G\t0;", eta);
173     parameters += buffer;
174    
175     sprintf(buffer,"\t0\t0\t%G;", eta);
176     parameters += buffer;
177    
178     return parameters;
179    
180     }