ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/integrators/NPAT.cpp
Revision: 1665
Committed: Tue Nov 22 20:38:56 2011 UTC (13 years, 5 months ago) by gezelter
File size: 5975 byte(s)
Log Message:
updated copyright notices

File Contents

# User Rev Content
1 tim 536 /*
2     * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3     *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
10 tim 536 * notice, this list of conditions and the following disclaimer.
11     *
12 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
13 tim 536 * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the
15     * distribution.
16     *
17     * This software is provided "AS IS," without a warranty of any
18     * kind. All express or implied conditions, representations and
19     * warranties, including any implied warranty of merchantability,
20     * fitness for a particular purpose or non-infringement, are hereby
21     * excluded. The University of Notre Dame and its licensors shall not
22     * be liable for any damages suffered by licensee as a result of
23     * using, modifying or distributing the software or its
24     * derivatives. In no event will the University of Notre Dame or its
25     * licensors be liable for any lost revenue, profit or data, or for
26     * direct, indirect, special, consequential, incidental or punitive
27     * damages, however caused and regardless of the theory of liability,
28     * arising out of the use of or inability to use software, even if the
29     * University of Notre Dame has been advised of the possibility of
30     * such damages.
31 gezelter 1390 *
32     * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
33     * research, please cite the appropriate papers when you publish your
34     * work. Good starting points are:
35     *
36     * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
37     * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
38     * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 24107 (2008).
39 gezelter 1665 * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010).
40     * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 tim 536 */
42    
43     #include "brains/SimInfo.hpp"
44     #include "brains/Thermo.hpp"
45     #include "integrators/IntegratorCreator.hpp"
46     #include "integrators/NPAT.hpp"
47     #include "primitives/Molecule.hpp"
48 gezelter 1390 #include "utils/PhysicalConstants.hpp"
49 tim 536 #include "utils/simError.h"
50    
51 gezelter 1390 namespace OpenMD {
52 tim 536
53     void NPAT::evolveEtaA() {
54    
55 gezelter 1390 eta(2,2) += dt2 * instaVol * (press(2, 2) - targetPressure/PhysicalConstants::pressureConvert) / (NkBT*tb2);
56 tim 536 oldEta = eta;
57     }
58    
59     void NPAT::evolveEtaB() {
60    
61     prevEta = eta;
62     eta(2,2) = oldEta(2, 2) + dt2 * instaVol *
63 gezelter 1390 (press(2, 2) - targetPressure/PhysicalConstants::pressureConvert) / (NkBT*tb2);
64 tim 536 }
65    
66     void NPAT::calcVelScale(){
67    
68     for (int i = 0; i < 3; i++ ) {
69     for (int j = 0; j < 3; j++ ) {
70     vScale(i, j) = eta(i, j);
71    
72     if (i == j) {
73     vScale(i, j) += chi;
74     }
75     }
76     }
77     }
78    
79     void NPAT::getVelScaleA(Vector3d& sc, const Vector3d& vel){
80     sc = vScale * vel;
81     }
82    
83     void NPAT::getVelScaleB(Vector3d& sc, int index ) {
84     sc = vScale * oldVel[index];
85     }
86    
87     void NPAT::getPosScale(const Vector3d& pos, const Vector3d& COM, int index, Vector3d& sc) {
88    
89     /**@todo */
90 tim 963 Vector3d rj = (oldPos[index] + pos)/(RealType)2.0 -COM;
91 tim 536 sc = eta * rj;
92     }
93    
94     void NPAT::scaleSimBox(){
95     Mat3x3d scaleMat;
96    
97 tim 538 for(int i=0; i<3; i++){
98     for(int j=0; j<3; j++){
99     scaleMat(i, j) = 0.0;
100     if(i==j) {
101     scaleMat(i, j) = 1.0;
102     }
103 tim 536 }
104     }
105 tim 538
106     scaleMat(2, 2) = exp(dt*eta(2, 2));
107     Mat3x3d hmat = currentSnapshot_->getHmat();
108     hmat = hmat *scaleMat;
109     currentSnapshot_->setHmat(hmat);
110 tim 536 }
111    
112     bool NPAT::etaConverged() {
113     int i;
114 tim 963 RealType diffEta, sumEta;
115 tim 536
116     sumEta = 0;
117     for(i = 0; i < 3; i++) {
118     sumEta += pow(prevEta(i, i) - eta(i, i), 2);
119     }
120    
121     diffEta = sqrt( sumEta / 3.0 );
122    
123     return ( diffEta <= etaTolerance );
124     }
125    
126 tim 963 RealType NPAT::calcConservedQuantity(){
127 tim 536
128     chi= currentSnapshot_->getChi();
129     integralOfChidt = currentSnapshot_->getIntegralOfChiDt();
130     loadEta();
131    
132     // We need NkBT a lot, so just set it here: This is the RAW number
133     // of integrableObjects, so no subtraction or addition of constraints or
134     // orientational degrees of freedom:
135 gezelter 1390 NkBT = info_->getNGlobalIntegrableObjects()*PhysicalConstants::kB *targetTemp;
136 tim 536
137     // fkBT is used because the thermostat operates on more degrees of freedom
138     // than the barostat (when there are particles with orientational degrees
139     // of freedom).
140 gezelter 1390 fkBT = info_->getNdf()*PhysicalConstants::kB *targetTemp;
141 tim 536
142 tim 963 RealType conservedQuantity;
143     RealType totalEnergy;
144     RealType thermostat_kinetic;
145     RealType thermostat_potential;
146     RealType barostat_kinetic;
147     RealType barostat_potential;
148     RealType trEta;
149 tim 536
150     totalEnergy = thermo.getTotalE();
151    
152 gezelter 1390 thermostat_kinetic = fkBT * tt2 * chi * chi /(2.0 * PhysicalConstants::energyConvert);
153 tim 536
154 gezelter 1390 thermostat_potential = fkBT* integralOfChidt / PhysicalConstants::energyConvert;
155 tim 536
156 tim 963 SquareMatrix<RealType, 3> tmp = eta.transpose() * eta;
157 tim 536 trEta = tmp.trace();
158    
159 gezelter 1390 barostat_kinetic = NkBT * tb2 * trEta /(2.0 * PhysicalConstants::energyConvert);
160 tim 536
161 gezelter 1390 barostat_potential = (targetPressure * thermo.getVolume() / PhysicalConstants::pressureConvert) /PhysicalConstants::energyConvert;
162 tim 536
163     conservedQuantity = totalEnergy + thermostat_kinetic + thermostat_potential +
164     barostat_kinetic + barostat_potential;
165    
166     return conservedQuantity;
167    
168     }
169    
170     void NPAT::loadEta() {
171     eta= currentSnapshot_->getEta();
172    
173     //if (!eta.isDiagonal()) {
174     // sprintf( painCave.errMsg,
175     // "NPAT error: the diagonal elements of eta matrix are not the same or etaMat is not a diagonal matrix");
176     // painCave.isFatal = 1;
177     // simError();
178     //}
179     }
180    
181     void NPAT::saveEta() {
182     currentSnapshot_->setEta(eta);
183     }
184    
185     }
186    

Properties

Name Value
svn:keywords Author Id Revision Date