ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/branches/new_design/OOPSE-2.0/src/integrators/NPTi.cpp
(Generate patch)

Comparing:
trunk/OOPSE-2.0/src/integrators/NPTi.cpp (file contents), Revision 1625 by tim, Thu Oct 21 16:22:01 2004 UTC vs.
branches/new_design/OOPSE-2.0/src/integrators/NPTi.cpp (file contents), Revision 1897 by tim, Mon Dec 20 19:49:44 2004 UTC

# Line 1 | Line 1
1 < #include <math.h>
2 < #include "primitives/Atom.hpp"
3 < #include "primitives/SRI.hpp"
4 < #include "primitives/AbstractClasses.hpp"
1 > #include "NPTi.hpp"
2   #include "brains/SimInfo.hpp"
6 #include "UseTheForce/ForceFields.hpp"
3   #include "brains/Thermo.hpp"
4 < #include "io/ReadWrite.hpp"
5 < #include "integrators/Integrator.hpp"
4 > #include "integrators/IntegratorCreator.hpp"
5 > #include "integrators/NPT.hpp"
6 > #include "primitives/Molecule.hpp"
7 > #include "utils/OOPSEConstant.hpp"
8   #include "utils/simError.h"
9  
10 < #ifdef IS_MPI
13 < #include "brains/mpiSimulation.hpp"
14 < #endif
10 > namespace oopse {
11  
12   // Basic isotropic thermostating and barostating via the Melchionna
13   // modification of the Hoover algorithm:
# Line 23 | Line 19 | template<typename T> NPTi<T>::NPTi ( SimInfo *theInfo,
19   //
20   //    Hoover, W. G., 1986, Phys. Rev. A, 34, 2499.
21  
22 < template<typename T> NPTi<T>::NPTi ( SimInfo *theInfo, ForceFields* the_ff):
27 <  T( theInfo, the_ff )
28 < {
29 <  GenericData* data;
30 <  DoubleVectorGenericData * etaValue;
31 <  vector<double> etaArray;
22 > NPTi::NPTi ( SimInfo *info) : NPT(info){
23  
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<DoubleVectorGenericData*>(data);
41      
42      if(etaValue){
43        eta = (*etaValue)[0];
44        oldEta = eta;
45      }
46    }
47  }
24   }
25  
26 < template<typename T> NPTi<T>::~NPTi() {
27 <  //nothing for now
26 > void NPTi::evolveEtaA() {
27 >    eta += dt2 * ( instaVol * (instaPress - targetPressure) /
28 >         (OOPSEConstant::pressureConvert*NkBT*tb2));
29 >    oldEta = eta;
30   }
31  
32 < template<typename T> void NPTi<T>::resetIntegrator() {
55 <  eta = 0.0;
56 <  T::resetIntegrator();
57 < }
32 > void NPTi::evolveEtaB() {
33  
34 < template<typename T> void NPTi<T>::evolveEtaA() {
35 <  eta += dt2 * ( instaVol * (instaPress - targetPressure) /
36 <                 (p_convert*NkBT*tb2));
62 <  oldEta = eta;
34 >    prevEta = eta;
35 >    eta = oldEta + dt2 * ( instaVol * (instaPress - targetPressure) /
36 >         (OOPSEConstant::pressureConvert*NkBT*tb2));
37   }
38  
39 < template<typename T> void NPTi<T>::evolveEtaB() {
40 <
67 <  prevEta = eta;
68 <  eta = oldEta + dt2 * ( instaVol * (instaPress - targetPressure) /
69 <                 (p_convert*NkBT*tb2));
39 > void NPTi::calcVelScale() {
40 >    vScale = chi + eta;
41   }
42  
43 < template<typename T> void NPTi<T>::calcVelScale(void) {
44 <  vScale = chi + eta;
43 > void NPTi::getVelScaleA(Vector3d& sc, const Vector3d& vel) {
44 >    sc = vel * vScale;
45   }
46  
47 < template<typename T> void NPTi<T>::getVelScaleA(double sc[3], double vel[3]) {
48 <  int i;
78 <
79 <  for(i=0; i<3; i++) sc[i] = vel[i] * vScale;
47 > void NPTi::getVelScaleB(Vector3d& sc, int index ){
48 >    sc = oldVel[index] * vScale;    
49   }
50  
82 template<typename T> void NPTi<T>::getVelScaleB(double sc[3], int index ){
83  int i;
51  
52 <  for(i=0; i<3; i++) sc[i] = oldVel[index*3 + i] * vScale;
52 > void NPTi::getPosScale(const Vector3d& pos, const Vector3d& COM,
53 >                           int index, Vector3d& sc){
54 >    /**@todo*/
55 >    sc  = (oldPos[index] + pos)/2.0 -COM;
56 >    sc *= eta;
57   }
58  
59 + void NPTi::scaleSimBox(){
60  
61 < template<typename T> void NPTi<T>::getPosScale(double pos[3], double COM[3],
90 <                                               int index, double sc[3]){
91 <  int j;
61 >    double scaleFactor;
62  
63 <  for(j=0; j<3; j++)
94 <    sc[j] = ( oldPos[index*3+j] + pos[j]) / 2.0 - COM[j];
63 >    scaleFactor = exp(dt*eta);
64  
65 <  for(j=0; j<3; j++)
66 <    sc[j] *= eta;
98 < }
99 <
100 < template<typename T> void NPTi<T>::scaleSimBox( void ){
101 <
102 <  double scaleFactor;
103 <
104 <  scaleFactor = exp(dt*eta);
105 <
106 <  if ((scaleFactor > 1.1) || (scaleFactor < 0.9)) {
107 <    sprintf( painCave.errMsg,
65 >    if ((scaleFactor > 1.1) || (scaleFactor < 0.9)) {
66 >        sprintf( painCave.errMsg,
67               "NPTi error: Attempting a Box scaling of more than 10 percent"
68               " check your tauBarostat, as it is probably too small!\n"
69               " eta = %lf, scaleFactor = %lf\n", eta, scaleFactor
70               );
71 <    painCave.isFatal = 1;
72 <    simError();
73 <  } else {
74 <    info->scaleBox(scaleFactor);
75 <  }
71 >        painCave.isFatal = 1;
72 >        simError();
73 >    } else {
74 >        Mat3x3d hmat = currentSnapshot_->getHmat();
75 >        hmat *= scaleFactor;
76 >        currentSnapshot_->setHmat(hmat);
77 >    }
78  
79   }
80  
81 < template<typename T> bool NPTi<T>::etaConverged() {
81 > bool NPTi::etaConverged() {
82  
83 <  return ( fabs(prevEta - eta) <= etaTolerance );
83 >    return ( fabs(prevEta - eta) <= etaTolerance );
84   }
85  
86 < template<typename T> double NPTi<T>::getConservedQuantity(void){
86 > double NPTi::calcConservedQuantity(){
87  
88 <  double conservedQuantity;
89 <  double Energy;
90 <  double thermostat_kinetic;
91 <  double thermostat_potential;
92 <  double barostat_kinetic;
93 <  double barostat_potential;
88 >    chi= currentSnapshot_->getChi();
89 >    integralOfChidt = currentSnapshot_->getIntegralOfChiDt();
90 >    loadEta();
91 >    // We need NkBT a lot, so just set it here: This is the RAW number
92 >    // of integrableObjects, so no subtraction or addition of constraints or
93 >    // orientational degrees of freedom:
94 >    NkBT = info_->getNGlobalIntegrableObjects()*OOPSEConstant::kB *targetTemp;
95  
96 <  Energy = tStats->getTotalE();
96 >    // fkBT is used because the thermostat operates on more degrees of freedom
97 >    // than the barostat (when there are particles with orientational degrees
98 >    // of freedom).  
99 >    fkBT = info_->getNdf()*OOPSEConstant::kB *targetTemp;    
100 >    
101 >    double conservedQuantity;
102 >    double Energy;
103 >    double thermostat_kinetic;
104 >    double thermostat_potential;
105 >    double barostat_kinetic;
106 >    double barostat_potential;
107  
108 <  thermostat_kinetic = fkBT* tt2 * chi * chi /
137 <    (2.0 * eConvert);
108 >    Energy =thermo.getTotalE();
109  
110 <  thermostat_potential = fkBT* integralOfChidt / eConvert;
110 >    thermostat_kinetic = fkBT* tt2 * chi * chi / (2.0 * OOPSEConstant::energyConvert);
111  
112 +    thermostat_potential = fkBT* integralOfChidt / OOPSEConstant::energyConvert;
113  
142  barostat_kinetic = 3.0 * NkBT * tb2 * eta * eta /
143    (2.0 * eConvert);
114  
115 <  barostat_potential = (targetPressure * tStats->getVolume() / p_convert) /
146 <    eConvert;
115 >    barostat_kinetic = 3.0 * NkBT * tb2 * eta * eta /(2.0 * OOPSEConstant::energyConvert);
116  
117 <  conservedQuantity = Energy + thermostat_kinetic + thermostat_potential +
118 <    barostat_kinetic + barostat_potential;
117 >    barostat_potential = (targetPressure * thermo.getVolume() / OOPSEConstant::pressureConvert) /
118 >        OOPSEConstant::energyConvert;
119  
120 < //   cout.width(8);
121 < //   cout.precision(8);
120 >    conservedQuantity = Energy + thermostat_kinetic + thermostat_potential +
121 >        barostat_kinetic + barostat_potential;
122  
123 < //   cerr << info->getTime() << "\t" << Energy << "\t" << thermostat_kinetic <<
124 < //       "\t" << thermostat_potential << "\t" << barostat_kinetic <<
125 < //       "\t" << barostat_potential << "\t" << conservedQuantity << endl;
126 <  return conservedQuantity;
123 >    std::cout << "--------------------------------------------------------------" << std::endl;
124 >    std::cout << "time: " << currentSnapshot_->getTime() << std:: endl;
125 >    std::cout << "chi : " << chi << std::endl;
126 >    std::cout << "integralOfChidt : " << integralOfChidt << std::endl;
127 >    std::cout << "eta : " << eta << std::endl;    
128 >    std::cout << "NkBT: " << NkBT << std::endl;
129 >    std::cout << "fkBT: " << fkBT << std::endl;    
130 >    std::cout << "thermostat_kinetic : " << thermostat_kinetic<< std::endl;
131 >    std::cout << "thermostat_potential : " << thermostat_potential << std::endl;
132 >    std::cout << "barostat_kinetic : " << barostat_kinetic << std::endl;
133 >    std::cout << "barostat_potential : " << barostat_potential << std::endl;
134 >    std::cout << "Total Energy: " << Energy << std::endl;
135 >    std::cout << "Conserved Quantity: " << conservedQuantity <<std::endl;
136 >    std::cout << "--------------------------------------------------------------" << std::endl;
137 >    return conservedQuantity;
138   }
139  
140 < template<typename T> string NPTi<T>::getAdditionalParameters(void){
141 <  string parameters;
142 <  const int BUFFERSIZE = 2000; // size of the read buffer
143 <  char buffer[BUFFERSIZE];
140 > void NPTi::loadEta() {
141 >    Mat3x3d etaMat = currentSnapshot_->getEta();
142 >    eta = etaMat(0,0);
143 >    //if (fabs(etaMat(1,1) - eta) >= oopse::epsilon || fabs(etaMat(1,1) - eta) >= oopse::epsilon || !etaMat.isDiagonal()) {
144 >    //    sprintf( painCave.errMsg,
145 >    //             "NPTi error: the diagonal elements of  eta matrix are not the same or etaMat is not a diagonal matrix");
146 >    //    painCave.isFatal = 1;
147 >    //    simError();
148 >    //}
149 > }
150  
151 <  sprintf(buffer,"\t%G\t%G;", chi, integralOfChidt);
152 <  parameters += buffer;
151 > void NPTi::saveEta() {
152 >    Mat3x3d etaMat(0.0);
153 >    etaMat(0, 0) = eta;
154 >    etaMat(1, 1) = eta;
155 >    etaMat(2, 2) = eta;
156 >    currentSnapshot_->setEta(etaMat);
157 > }
158  
168  sprintf(buffer,"\t%G\t0\t0;", eta);
169  parameters += buffer;
170
171  sprintf(buffer,"\t0\t%G\t0;", eta);
172  parameters += buffer;
173
174  sprintf(buffer,"\t0\t0\t%G;", eta);
175  parameters += buffer;
176
177  return parameters;
178
159   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines