ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new-templateless/OOPSE/libmdtools/NPTi.cpp
Revision: 850
Committed: Mon Nov 3 22:07:17 2003 UTC (21 years, 9 months ago) by mmeineke
File size: 3970 byte(s)
Log Message:
begun work on removing templates and most of standard template library from OOPSE.

File Contents

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