ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libmdtools/NPT.cpp
(Generate patch)

Comparing trunk/OOPSE/libmdtools/NPT.cpp (file contents):
Revision 857 by mmeineke, Fri Nov 7 17:09:48 2003 UTC vs.
Revision 1129 by tim, Thu Apr 22 03:29:30 2004 UTC

# Line 62 | Line 62 | template<typename T> NPT<T>::NPT ( SimInfo *theInfo, F
62      integralOfChidt = integralOfChidtValue->getData();
63    }
64  
65 <  oldPos = new double[3*nAtoms];
66 <  oldVel = new double[3*nAtoms];
67 <  oldJi = new double[3*nAtoms];
68 < #ifdef IS_MPI
69 <  Nparticles = mpiSim->getTotAtoms();
70 < #else
71 <  Nparticles = theInfo->n_atoms;
72 < #endif
65 >  oldPos = new double[3*integrableObjects.size()];
66 >  oldVel = new double[3*integrableObjects.size()];
67 >  oldJi = new double[3*integrableObjects.size()];
68  
69   }
70  
# Line 83 | Line 78 | template<typename T> void NPT<T>::moveA() {
78  
79    //new version of NPT
80    int i, j, k;
86  DirectionalAtom* dAtom;
81    double Tb[3], ji[3];
82    double mass;
83    double vel[3], pos[3], frc[3];
# Line 101 | Line 95 | template<typename T> void NPT<T>::moveA() {
95  
96    calcVelScale();
97    
98 <  for( i=0; i<nAtoms; i++ ){
98 >  for( i=0; i<integrableObjects.size(); i++ ){
99  
100 <    atoms[i]->getVel( vel );
101 <    atoms[i]->getFrc( frc );
100 >    integrableObjects[i]->getVel( vel );
101 >    integrableObjects[i]->getFrc( frc );
102  
103 <    mass = atoms[i]->getMass();
103 >    mass = integrableObjects[i]->getMass();
104  
105      getVelScaleA( sc, vel );
106  
# Line 117 | Line 111 | template<typename T> void NPT<T>::moveA() {
111  
112      }
113  
114 <    atoms[i]->setVel( vel );
114 >    integrableObjects[i]->setVel( vel );
115  
116 <    if( atoms[i]->isDirectional() ){
116 >    if( integrableObjects[i]->isDirectional() ){
117  
124      dAtom = (DirectionalAtom *)atoms[i];
125
118        // get and convert the torque to body frame
119  
120 <      dAtom->getTrq( Tb );
121 <      dAtom->lab2Body( Tb );
120 >      integrableObjects[i]->getTrq( Tb );
121 >      integrableObjects[i]->lab2Body( Tb );
122  
123        // get the angular momentum, and propagate a half step
124  
125 <      dAtom->getJ( ji );
125 >      integrableObjects[i]->getJ( ji );
126  
127        for (j=0; j < 3; j++)
128          ji[j] += dt2 * (Tb[j] * eConvert - ji[j]*chi);
129  
130 <      this->rotationPropagation( dAtom, ji );
130 >      this->rotationPropagation( integrableObjects[i], ji );
131  
132 <      dAtom->setJ( ji );
132 >      integrableObjects[i]->setJ( ji );
133      }
134    }
135  
# Line 150 | Line 142 | template<typename T> void NPT<T>::moveA() {
142    integralOfChidt += dt2*chi;
143  
144    //save the old positions
145 <  for(i = 0; i < nAtoms; i++){
146 <    atoms[i]->getPos(pos);
145 >  for(i = 0; i < integrableObjects.size(); i++){
146 >    integrableObjects[i]->getPos(pos);
147      for(j = 0; j < 3; j++)
148        oldPos[i*3 + j] = pos[j];
149    }
# Line 160 | Line 152 | template<typename T> void NPT<T>::moveA() {
152  
153    for(k = 0; k < 5; k ++){
154  
155 <    for(i =0 ; i < nAtoms; i++){
155 >    for(i =0 ; i < integrableObjects.size(); i++){
156  
157 <      atoms[i]->getVel(vel);
158 <      atoms[i]->getPos(pos);
157 >      integrableObjects[i]->getVel(vel);
158 >      integrableObjects[i]->getPos(pos);
159  
160        this->getPosScale( pos, COM, i, sc );
161  
162        for(j = 0; j < 3; j++)
163          pos[j] = oldPos[i*3 + j] + dt*(vel[j] + sc[j]);
164  
165 <      atoms[i]->setPos( pos );
165 >      integrableObjects[i]->setPos( pos );
166      }
167  
168      if (nConstrained){
# Line 188 | Line 180 | template<typename T> void NPT<T>::moveB( void ){
180  
181    //new version of NPT
182    int i, j, k;
191  DirectionalAtom* dAtom;
183    double Tb[3], ji[3], sc[3];
184    double vel[3], frc[3];
185    double mass;
186  
187    // Set things up for the iteration:
188  
189 <  for( i=0; i<nAtoms; i++ ){
189 >  for( i=0; i<integrableObjects.size(); i++ ){
190  
191 <    atoms[i]->getVel( vel );
191 >    integrableObjects[i]->getVel( vel );
192  
193      for (j=0; j < 3; j++)
194        oldVel[3*i + j]  = vel[j];
195  
196 <    if( atoms[i]->isDirectional() ){
196 >    if( integrableObjects[i]->isDirectional() ){
197  
198 <      dAtom = (DirectionalAtom *)atoms[i];
198 >      integrableObjects[i]->getJ( ji );
199  
209      dAtom->getJ( ji );
210
200        for (j=0; j < 3; j++)
201          oldJi[3*i + j] = ji[j];
202  
# Line 229 | Line 218 | template<typename T> void NPT<T>::moveB( void ){
218      this->evolveEtaB();
219      this->calcVelScale();
220  
221 <    for( i=0; i<nAtoms; i++ ){
221 >    for( i=0; i<integrableObjects.size(); i++ ){
222  
223 <      atoms[i]->getFrc( frc );
224 <      atoms[i]->getVel(vel);
223 >      integrableObjects[i]->getFrc( frc );
224 >      integrableObjects[i]->getVel(vel);
225  
226 <      mass = atoms[i]->getMass();
226 >      mass = integrableObjects[i]->getMass();
227  
228        getVelScaleB( sc, i );
229  
# Line 242 | Line 231 | template<typename T> void NPT<T>::moveB( void ){
231        for (j=0; j < 3; j++)
232          vel[j] = oldVel[3*i+j] + dt2 * ((frc[j] / mass ) * eConvert - sc[j]);
233  
234 <      atoms[i]->setVel( vel );
234 >      integrableObjects[i]->setVel( vel );
235  
236 <      if( atoms[i]->isDirectional() ){
236 >      if( integrableObjects[i]->isDirectional() ){
237  
249        dAtom = (DirectionalAtom *)atoms[i];
250
238          // get and convert the torque to body frame
239  
240 <        dAtom->getTrq( Tb );
241 <        dAtom->lab2Body( Tb );
240 >        integrableObjects[i]->getTrq( Tb );
241 >        integrableObjects[i]->lab2Body( Tb );
242  
243          for (j=0; j < 3; j++)
244            ji[j] = oldJi[3*i + j] + dt2 * (Tb[j] * eConvert - oldJi[3*i+j]*chi);
245  
246 <          dAtom->setJ( ji );
246 >          integrableObjects[i]->setJ( ji );
247        }
248      }
249  
# Line 364 | Line 351 | template<typename T> int NPT<T>::readyCheck() {
351    }
352  
353    // We need NkBT a lot, so just set it here: This is the RAW number
354 <  // of particles, so no subtraction or addition of constraints or
354 >  // of integrableObjects, so no subtraction or addition of constraints or
355    // orientational degrees of freedom:
356  
357 <  NkBT = (double)Nparticles * kB * targetTemp;
357 >  NkBT = (double)(info->getTotIntegrableObjects()) * kB * targetTemp;
358  
359    // fkBT is used because the thermostat operates on more degrees of freedom
360    // than the barostat (when there are particles with orientational degrees
361 <  // of freedom).  ndf = 3 * (n_atoms + n_oriented -1) - n_constraint - nZcons
361 >  // of freedom).  
362  
363 <  fkBT = (double)info->ndf * kB * targetTemp;
363 >  fkBT = (double)(info->getNDF()) * kB * targetTemp;
364  
365    tt2 = tauThermostat * tauThermostat;
366    tb2 = tauBarostat * tauBarostat;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines