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

Comparing trunk/OOPSE/libmdtools/Symplectic.cpp (file contents):
Revision 468 by gezelter, Mon Apr 7 16:56:38 2003 UTC vs.
Revision 542 by mmeineke, Fri May 30 21:31:48 2003 UTC

# Line 1 | Line 1
1   #include <iostream>
2   #include <cstdlib>
3  
4 + #ifdef IS_MPI
5 + #include "mpiSimulation.hpp"
6 + #include <unistd.h>
7 + #endif //is_mpi
8 +
9   #include "Integrator.hpp"
5 #include "Thermo.hpp"
6 #include "ReadWrite.hpp"
7 #include "ForceFields.hpp"
8 #include "ExtendedSystem.hpp"
10   #include "simError.h"
11  
11 extern "C"{
12  
13  void v_constrain_a_( double &dt, int &n_atoms, double* mass,
14                       double* Rx, double* Ry, double* Rz,
15                       double* Vx, double* Vy, double* Vz,
16                       double* Fx, double* Fy, double* Fz,
17                       int &n_constrained, double *constr_sqr,
18                       int* constr_i, int* constr_j,
19                       double &box_x, double &box_y, double &box_z );
12  
13 <  void v_constrain_b_( double &dt, int &n_atoms, double* mass,
14 <                       double* Rx, double* Ry, double* Rz,
15 <                       double* Vx, double* Vy, double* Vz,
24 <                       double* Fx, double* Fy, double* Fz,
25 <                       double &Kinetic,
26 <                       int &n_constrained, double *constr_sqr,
27 <                       int* constr_i, int* constr_j,
28 <                       double &box_x, double &box_y, double &box_z );
29 < }
30 <
31 <
32 <
33 <
34 < Symplectic::Symplectic( SimInfo* the_entry_plug, ForceFields* the_ff,
35 <                        ExtendedSystem* the_es ){
36 <  entry_plug = the_entry_plug;
13 > Symplectic::Symplectic( SimInfo* theInfo, ForceFields* the_ff ){
14 >  
15 >  info = theInfo;
16    myFF = the_ff;
38  myES = the_es;
17    isFirst = 1;
18  
19 <  molecules = entry_plug->molecules;
20 <  nMols = entry_plug->n_mol;
19 >  molecules = info->molecules;
20 >  nMols = info->n_mol;
21  
22    // give a little love back to the SimInfo object
23    
24 <  if( entry_plug->the_integrator != NULL ) delete entry_plug->the_integrator;
25 <  entry_plug->the_integrator = this;
24 >  if( info->the_integrator != NULL ) delete info->the_integrator;
25 >  info->the_integrator = this;
26  
49  // grab the masses
50
51  mass = new double[entry_plug->n_atoms];
52  for(int i = 0; i < entry_plug->n_atoms; i++){
53    mass[i] = entry_plug->atoms[i]->getMass();
54  }  
55
27    // check for constraints
28 +  
29 +  constrainedI = NULL;
30 +  constrainedJ = NULL;
31 +  constrainedDsqr = NULL;
32 +  nConstrained = 0;
33  
34 <  is_constrained = 0;
34 >  checkConstraints();
35 > }
36  
37 + Symplectic::~Symplectic() {
38 +  
39 +  if( nConstrained ){
40 +    delete[] constrainedI;
41 +    delete[] constrainedJ;
42 +    delete[] constrainedDsqr;
43 +  }
44 +  
45 + }
46 +
47 + void Symplectic::checkConstraints( void ){
48 +
49 +
50 +  isConstrained = 0;
51 +
52    Constraint *temp_con;
53    Constraint *dummy_plug;
54 <  temp_con = new Constraint[entry_plug->n_SRI];
55 <  n_constrained = 0;
54 >  temp_con = new Constraint[info->n_SRI];
55 >  nConstrained = 0;
56    int constrained = 0;
57    
58    SRI** theArray;
# Line 74 | Line 66 | Symplectic::Symplectic( SimInfo* the_entry_plug, Force
66        if(constrained){
67          
68          dummy_plug = theArray[j]->get_constraint();
69 <        temp_con[n_constrained].set_a( dummy_plug->get_a() );
70 <        temp_con[n_constrained].set_b( dummy_plug->get_b() );
71 <        temp_con[n_constrained].set_dsqr( dummy_plug->get_dsqr() );
69 >        temp_con[nConstrained].set_a( dummy_plug->get_a() );
70 >        temp_con[nConstrained].set_b( dummy_plug->get_b() );
71 >        temp_con[nConstrained].set_dsqr( dummy_plug->get_dsqr() );
72          
73 <        n_constrained++;
73 >        nConstrained++;
74          constrained = 0;
75        }
76      }
# Line 91 | Line 83 | Symplectic::Symplectic( SimInfo* the_entry_plug, Force
83        if(constrained){
84          
85          dummy_plug = theArray[j]->get_constraint();
86 <        temp_con[n_constrained].set_a( dummy_plug->get_a() );
87 <        temp_con[n_constrained].set_b( dummy_plug->get_b() );
88 <        temp_con[n_constrained].set_dsqr( dummy_plug->get_dsqr() );
86 >        temp_con[nConstrained].set_a( dummy_plug->get_a() );
87 >        temp_con[nConstrained].set_b( dummy_plug->get_b() );
88 >        temp_con[nConstrained].set_dsqr( dummy_plug->get_dsqr() );
89          
90 <        n_constrained++;
90 >        nConstrained++;
91          constrained = 0;
92        }
93      }
# Line 108 | Line 100 | Symplectic::Symplectic( SimInfo* the_entry_plug, Force
100        if(constrained){
101          
102          dummy_plug = theArray[j]->get_constraint();
103 <        temp_con[n_constrained].set_a( dummy_plug->get_a() );
104 <        temp_con[n_constrained].set_b( dummy_plug->get_b() );
105 <        temp_con[n_constrained].set_dsqr( dummy_plug->get_dsqr() );
103 >        temp_con[nConstrained].set_a( dummy_plug->get_a() );
104 >        temp_con[nConstrained].set_b( dummy_plug->get_b() );
105 >        temp_con[nConstrained].set_dsqr( dummy_plug->get_dsqr() );
106          
107 <        n_constrained++;
107 >        nConstrained++;
108          constrained = 0;
109        }
110      }
111    }
112  
113 <  if(n_constrained > 0){
113 >  if(nConstrained > 0){
114      
115 <    is_constrained = 1;
116 <    constrained_i = new int[n_constrained];
117 <    constrained_j = new int[n_constrained];
118 <    constrained_dsqr = new double[n_constrained];
115 >    isConstrained = 1;
116 >
117 >    if(constrainedI != NULL )    delete[] constrainedI;
118 >    if(constrainedJ != NULL )    delete[] constrainedJ;
119 >    if(constrainedDsqr != NULL ) delete[] constrainedDsqr;
120 >
121 >    constrainedI =    new int[nConstrained];
122 >    constrainedJ =    new int[nConstrained];
123 >    constrainedDsqr = new double[nConstrained];
124      
125 <    for( int i = 0; i < n_constrained; i++){
125 >    for( int i = 0; i < nConstrained; i++){
126        
127 <      /* add 1 to the index for the fortran arrays. */
128 <
129 <      constrained_i[i] = temp_con[i].get_a() + 1;
133 <      constrained_j[i] = temp_con[i].get_b() + 1;
134 <      constrained_dsqr[i] = temp_con[i].get_dsqr();
127 >      constrainedI[i] = temp_con[i].get_a();
128 >      constrainedJ[i] = temp_con[i].get_b();
129 >      constrainedDsqr[i] = temp_con[i].get_dsqr();
130      }
131    }
132    
133    delete[] temp_con;
134   }
135  
141 Symplectic::~Symplectic() {
142  
143  if( n_constrained ){
144    delete[] constrained_i;
145    delete[] constrained_j;
146    delete[] constrained_dsqr;
147  }
148  
149 }
136  
151
137   void Symplectic::integrate( void ){
138  
154  const double e_convert = 4.184e-4; // converts kcal/mol -> amu*A^2/fs^2
155
139    int i, j;                         // loop counters
140 <  int nAtoms = entry_plug->n_atoms; // the number of atoms
140 >  int nAtoms = info->n_atoms; // the number of atoms
141    double kE = 0.0;                  // the kinetic energy  
142    double rot_kE;
143    double trans_kE;
# Line 162 | Line 145 | void Symplectic::integrate( void ){
145    double dt2;                       // half the dt
146  
147    double vx, vy, vz;    // the velocities
148 < //  double vx2, vy2, vz2; // the square of the velocities
148 >  double vx2, vy2, vz2; // the square of the velocities
149    double rx, ry, rz;    // the postitions
150    
151    double ji[3];   // the body frame angular momentum
# Line 170 | Line 153 | void Symplectic::integrate( void ){
153    double Tb[3];   // torque in the body frame
154    double angle;   // the angle through which to rotate the rotation matrix
155    double A[3][3]; // the rotation matrix
156 +  double press[9];
157  
158    int time;
159  
160 <  double dt          = entry_plug->dt;
161 <  double runTime     = entry_plug->run_time;
162 <  double sampleTime  = entry_plug->sampleTime;
163 <  double statusTime  = entry_plug->statusTime;
164 <  double thermalTime = entry_plug->thermalTime;
160 >  double dt          = info->dt;
161 >  double runTime     = info->run_time;
162 >  double sampleTime  = info->sampleTime;
163 >  double statusTime  = info->statusTime;
164 >  double thermalTime = info->thermalTime;
165  
166    int n_loops  = (int)( runTime / dt );
167    int sample_n = (int)( sampleTime / dt );
# Line 185 | Line 169 | void Symplectic::integrate( void ){
169    int vel_n    = (int)( thermalTime / dt );
170  
171    int calcPot, calcStress;
172 +  int isError;
173  
174 <   Thermo *tStats = new Thermo( entry_plug );
174 >  tStats   = new Thermo( info );
175 >  e_out    = new StatWriter( info );
176 >  dump_out = new DumpWriter( info );
177  
178 <  StatWriter*  e_out    = new StatWriter( entry_plug );
192 <  DumpWriter*  dump_out = new DumpWriter( entry_plug );
193 <
194 <  Atom** atoms = entry_plug->atoms;
178 >  Atom** atoms = info->atoms;
179    DirectionalAtom* dAtom;
180    dt2 = 0.5 * dt;
181  
182 <  // initialize the forces the before the first step
182 >  // initialize the forces before the first step
183  
184    myFF->doForces(1,1);
185    
186 <  if( entry_plug->setTemp ){
186 >  if( info->setTemp ){
187      
188      tStats->velocitize();
189    }
# Line 209 | Line 193 | void Symplectic::integrate( void ){
193    
194    calcPot = 0;
195  
196 <  if( n_constrained ){
196 >  for( tl=0; tl<nLoops; tl++){
197  
198 <    double *Rx = new double[nAtoms];
199 <    double *Ry = new double[nAtoms];
200 <    double *Rz = new double[nAtoms];
198 >    integrateStep( calcPot, calcStress );
199 >      
200 >    time = tl + 1;
201      
202 <    double *Vx = new double[nAtoms];
203 <    double *Vy = new double[nAtoms];
204 <    double *Vz = new double[nAtoms];
205 <    
206 <    double *Fx = new double[nAtoms];
207 <    double *Fy = new double[nAtoms];
208 <    double *Fz = new double[nAtoms];
209 <    
202 >    if( info->setTemp ){
203 >      if( !(time % vel_n) ) tStats->velocitize();
204 >    }
205 >    if( !(time % sample_n) ) dump_out->writeDump( time * dt );
206 >    if( !((time+1) % status_n) ) {
207 >      calcPot = 1;
208 >      calcStress = 1;
209 >    }
210 >    if( !(time % status_n) ){
211 >      e_out->writeStat( time * dt );
212 >      calcPot = 0;
213 >      if (!strcasecmp(info->ensemble, "NPT")) calcStress = 1;
214 >      else calcStress = 0;
215 >    }    
216  
217 <    for( tl=0; tl < n_loops; tl++ ){
218 <      
229 <      for( j=0; j<nAtoms; j++ ){
217 >  
218 >  }
219  
220 <        Rx[j] = atoms[j]->getX();
232 <        Ry[j] = atoms[j]->getY();
233 <        Rz[j] = atoms[j]->getZ();
220 >  dump_out->writeFinal();
221  
222 <        Vx[j] = atoms[j]->get_vx();
223 <        Vy[j] = atoms[j]->get_vy();
224 <        Vz[j] = atoms[j]->get_vz();
222 >  delete dump_out;
223 >  delete e_out;
224 > }
225  
239        Fx[j] = atoms[j]->getFx();
240        Fy[j] = atoms[j]->getFy();
241        Fz[j] = atoms[j]->getFz();
226  
227 <      }
228 <        
229 <      v_constrain_a_( dt, nAtoms, mass, Rx, Ry, Rz, Vx, Vy, Vz,
230 <                      Fx, Fy, Fz,
231 <                      n_constrained, constrained_dsqr,
232 <                      constrained_i, constrained_j,
233 <                      entry_plug->box_x,
250 <                      entry_plug->box_y,
251 <                      entry_plug->box_z );
252 <      
253 <      for( j=0; j<nAtoms; j++ ){
227 > void Symplectic::moveA( void ){
228 >  
229 >  int i,j,k;
230 >  int atomIndex, aMatIndex;
231 >  DirectionalAtom* dAtom;
232 >  double Tb[3];
233 >  double ji[3];
234  
235 <        atoms[j]->setX(Rx[j]);
236 <        atoms[j]->setY(Ry[j]);
237 <        atoms[j]->setZ(Rz[j]);
238 <        
239 <        atoms[j]->set_vx(Vx[j]);
240 <        atoms[j]->set_vy(Vy[j]);
241 <        atoms[j]->set_vz(Vz[j]);
262 <      }
235 >  for( i=0; i<nAtoms; i++ ){
236 >    atomIndex = i * 3;
237 >    aMatIndex = i * 9;
238 >    
239 >    // velocity half step
240 >    for( j=atomIndex; j<(atomIndex+3); j++ )
241 >      vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
242  
243 +    // position whole step    
244 +    for( j=atomIndex; j<(atomIndex+3); j++ )
245 +      pos[j] += dt * vel[j];
246  
247 <      for( i=0; i<nAtoms; i++ ){
248 <        if( atoms[i]->isDirectional() ){
249 <                  
250 <          dAtom = (DirectionalAtom *)atoms[i];
247 >  
248 >    if( atoms[i]->isDirectional() ){
249 >
250 >      dAtom = (DirectionalAtom *)atoms[i];
251            
252 <          // get and convert the torque to body frame
271 <          
272 <          Tb[0] = dAtom->getTx();
273 <          Tb[1] = dAtom->getTy();
274 <          Tb[2] = dAtom->getTz();
275 <          
276 <          dAtom->lab2Body( Tb );
277 <          
278 <          // get the angular momentum, and propagate a half step
279 <          
280 <          ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * e_convert;
281 <          ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * e_convert;
282 <          ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * e_convert;
283 <          
284 <          // get the atom's rotation matrix
285 <          
286 <          A[0][0] = dAtom->getAxx();
287 <          A[0][1] = dAtom->getAxy();
288 <          A[0][2] = dAtom->getAxz();
289 <          
290 <          A[1][0] = dAtom->getAyx();
291 <          A[1][1] = dAtom->getAyy();
292 <          A[1][2] = dAtom->getAyz();
293 <          
294 <          A[2][0] = dAtom->getAzx();
295 <          A[2][1] = dAtom->getAzy();
296 <          A[2][2] = dAtom->getAzz();
297 <          
298 <          
299 <          // use the angular velocities to propagate the rotation matrix a
300 <          // full time step
301 <          
302 <          
303 <          angle = dt2 * ji[0] / dAtom->getIxx();
304 <          this->rotate( 1, 2, angle, ji, A ); // rotate about the x-axis
305 <          
306 <          angle = dt2 * ji[1] / dAtom->getIyy();
307 <          this->rotate( 2, 0, angle, ji, A ); // rotate about the y-axis
308 <          
309 <          angle = dt * ji[2] / dAtom->getIzz();
310 <          this->rotate( 0, 1, angle, ji, A ); // rotate about the z-axis
311 <          
312 <          angle = dt2 * ji[1] / dAtom->getIyy();
313 <          this->rotate( 2, 0, angle, ji, A ); // rotate about the y-axis
314 <          
315 <          angle = dt2 * ji[0] / dAtom->getIxx();
316 <          this->rotate( 1, 2, angle, ji, A ); // rotate about the x-axis
317 <          
318 <          
319 <          dAtom->setA( A );
320 <          dAtom->setJx( ji[0] );
321 <          dAtom->setJy( ji[1] );
322 <          dAtom->setJz( ji[2] );
323 <        }
324 <      }
252 >      // get and convert the torque to body frame
253        
254 <      // calculate the forces
254 >      Tb[0] = dAtom->getTx();
255 >      Tb[1] = dAtom->getTy();
256 >      Tb[2] = dAtom->getTz();
257        
258 <      myFF->doForces(calcPot, calcStress);
258 >      dAtom->lab2Body( Tb );
259        
260 <      // move b
331 <
332 <      for( j=0; j<nAtoms; j++ ){
333 <
334 <        Rx[j] = atoms[j]->getX();
335 <        Ry[j] = atoms[j]->getY();
336 <        Rz[j] = atoms[j]->getZ();
337 <
338 <        Vx[j] = atoms[j]->get_vx();
339 <        Vy[j] = atoms[j]->get_vy();
340 <        Vz[j] = atoms[j]->get_vz();
341 <
342 <        Fx[j] = atoms[j]->getFx();
343 <        Fy[j] = atoms[j]->getFy();
344 <        Fz[j] = atoms[j]->getFz();
345 <      }
346 <        
347 <      v_constrain_b_( dt, nAtoms, mass, Rx, Ry, Rz, Vx, Vy, Vz,
348 <                      Fx, Fy, Fz,
349 <                      kE, n_constrained, constrained_dsqr,
350 <                      constrained_i, constrained_j,
351 <                      entry_plug->box_x,
352 <                      entry_plug->box_y,
353 <                      entry_plug->box_z );
260 >      // get the angular momentum, and propagate a half step
261        
262 <      for( j=0; j<nAtoms; j++ ){
263 <
264 <        atoms[j]->setX(Rx[j]);
358 <        atoms[j]->setY(Ry[j]);
359 <        atoms[j]->setZ(Rz[j]);
360 <
361 <        atoms[j]->set_vx(Vx[j]);
362 <        atoms[j]->set_vy(Vy[j]);
363 <        atoms[j]->set_vz(Vz[j]);
364 <      }
262 >      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
263 >      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
264 >      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
265        
266 <      for( i=0; i< nAtoms; i++ ){
267 <
368 <        if( atoms[i]->isDirectional() ){
369 <
370 <          dAtom = (DirectionalAtom *)atoms[i];
371 <          
372 <          // get and convert the torque to body frame
373 <          
374 <          Tb[0] = dAtom->getTx();
375 <          Tb[1] = dAtom->getTy();
376 <          Tb[2] = dAtom->getTz();
377 <          
378 <          dAtom->lab2Body( Tb );
379 <          
380 <          // get the angular momentum, and complete the angular momentum
381 <          // half step
382 <          
383 <          ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * e_convert;
384 <          ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * e_convert;
385 <          ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * e_convert;
386 <          
387 <          dAtom->setJx( ji[0] );
388 <          dAtom->setJy( ji[1] );
389 <          dAtom->setJz( ji[2] );
390 <        }
391 <      }
392 <    
393 <      time = tl + 1;
266 >      // use the angular velocities to propagate the rotation matrix a
267 >      // full time step
268        
269 <      if( entry_plug->setTemp ){
270 <        if( !(time % vel_n) ) tStats->velocitize();
271 <      }
272 <      if( !(time % sample_n) ) dump_out->writeDump( time * dt );
273 <      if( !((time+1) % status_n) ) {
274 <        calcPot = 1;
275 <        calcStress = 1;
276 <      }
277 <      if( !(time % status_n) ){
278 <        e_out->writeStat( time * dt );
279 <        calcPot = 0;
280 <        calcStress = 0;
281 <      }
269 >      // rotate about the x-axis      
270 >      angle = dt2 * ji[0] / dAtom->getIxx();
271 >      this->rotate( 1, 2, angle, ji, &aMat[aMatIndex] );
272 >      
273 >      // rotate about the y-axis
274 >      angle = dt2 * ji[1] / dAtom->getIyy();
275 >      this->rotate( 2, 0, angle, ji, &aMat[aMatIndex] );
276 >      
277 >      // rotate about the z-axis
278 >      angle = dt * ji[2] / dAtom->getIzz();
279 >      this->rotate( 0, 1, angle, ji, &aMat[aMatIndex] );
280 >      
281 >      // rotate about the y-axis
282 >      angle = dt2 * ji[1] / dAtom->getIyy();
283 >      this->rotate( 2, 0, angle, ji, &aMat[aMatIndex] );
284 >      
285 >       // rotate about the x-axis
286 >      angle = dt2 * ji[0] / dAtom->getIxx();
287 >      this->rotate( 1, 2, angle, ji, &aMat[aMatIndex] );
288 >      
289 >      dAtom->setJx( ji[0] );
290 >      dAtom->setJy( ji[1] );
291 >      dAtom->setJz( ji[2] );
292      }
293 +    
294    }
295 <  else{
295 > }
296  
297 <    for( tl=0; tl<n_loops; tl++ ){
297 >
298 > void Integrator::moveB( void ){
299 >  int i,j,k;
300 >  int atomIndex;
301 >  DirectionalAtom* dAtom;
302 >  double Tb[3];
303 >  double ji[3];
304 >
305 >  for( i=0; i<nAtoms; i++ ){
306 >    atomIndex = i * 3;
307 >
308 >    // velocity half step
309 >    for( j=atomIndex; j<(atomIndex+3); j++ )
310 >      vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
311 >
312 >    if( atoms[i]->isDirectional() ){
313        
314 <      kE = 0.0;
415 <      rot_kE= 0.0;
416 <      trans_kE = 0.0;
314 >      dAtom = (DirectionalAtom *)atoms[i];
315        
316 <      for( i=0; i<nAtoms; i++ ){
419 <        
420 <        // velocity half step
421 <        
422 <        vx = atoms[i]->get_vx() +
423 <          ( dt2 * atoms[i]->getFx() / atoms[i]->getMass() ) * e_convert;
424 <        vy = atoms[i]->get_vy() +
425 <          ( dt2 * atoms[i]->getFy() / atoms[i]->getMass() ) * e_convert;
426 <        vz = atoms[i]->get_vz() +
427 <          ( dt2 * atoms[i]->getFz() / atoms[i]->getMass() ) * e_convert;
428 <        
429 <        // position whole step
430 <        
431 <        rx = atoms[i]->getX() + dt * vx;
432 <        ry = atoms[i]->getY() + dt * vy;
433 <        rz = atoms[i]->getZ() + dt * vz;
434 <        
435 <        atoms[i]->setX( rx );
436 <        atoms[i]->setY( ry );
437 <        atoms[i]->setZ( rz );
438 <        
439 <        atoms[i]->set_vx( vx );
440 <        atoms[i]->set_vy( vy );
441 <        atoms[i]->set_vz( vz );
442 <        
443 <        if( atoms[i]->isDirectional() ){
444 <
445 <          dAtom = (DirectionalAtom *)atoms[i];
446 <          
447 <          // get and convert the torque to body frame
448 <          
449 <          Tb[0] = dAtom->getTx();
450 <          Tb[1] = dAtom->getTy();
451 <          Tb[2] = dAtom->getTz();
452 <          
453 <          dAtom->lab2Body( Tb );
454 <          
455 <          // get the angular momentum, and propagate a half step
456 <          
457 <          ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * e_convert;
458 <          ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * e_convert;
459 <          ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * e_convert;
460 <          
461 <          // get the atom's rotation matrix
462 <          
463 <          A[0][0] = dAtom->getAxx();
464 <          A[0][1] = dAtom->getAxy();
465 <          A[0][2] = dAtom->getAxz();
466 <          
467 <          A[1][0] = dAtom->getAyx();
468 <          A[1][1] = dAtom->getAyy();
469 <          A[1][2] = dAtom->getAyz();
470 <          
471 <          A[2][0] = dAtom->getAzx();
472 <          A[2][1] = dAtom->getAzy();
473 <          A[2][2] = dAtom->getAzz();
474 <          
475 <          
476 <          // use the angular velocities to propagate the rotation matrix a
477 <          // full time step
478 <          
479 <          
480 <          angle = dt2 * ji[0] / dAtom->getIxx();
481 <          this->rotate( 1, 2, angle, ji, A ); // rotate about the x-axis
482 <          
483 <          angle = dt2 * ji[1] / dAtom->getIyy();
484 <          this->rotate( 2, 0, angle, ji, A ); // rotate about the y-axis
485 <          
486 <          angle = dt * ji[2] / dAtom->getIzz();
487 <          this->rotate( 0, 1, angle, ji, A ); // rotate about the z-axis
488 <          
489 <          angle = dt2 * ji[1] / dAtom->getIyy();
490 <          this->rotate( 2, 0, angle, ji, A ); // rotate about the y-axis
491 <          
492 <          angle = dt2 * ji[0] / dAtom->getIxx();
493 <          this->rotate( 1, 2, angle, ji, A ); // rotate about the x-axis
494 <          
495 <          
496 <          dAtom->setA( A );
497 <          dAtom->setJx( ji[0] );
498 <          dAtom->setJy( ji[1] );
499 <          dAtom->setJz( ji[2] );
500 <        }
501 <      }
316 >      // get and convert the torque to body frame
317        
318 <      // calculate the forces
318 >      Tb[0] = dAtom->getTx();
319 >      Tb[1] = dAtom->getTy();
320 >      Tb[2] = dAtom->getTz();
321        
322 <      myFF->doForces(calcPot,calcStress);
322 >      dAtom->lab2Body( Tb );
323        
324 <      for( i=0; i< nAtoms; i++ ){
325 <        
509 <        // complete the velocity half step
510 <        
511 <        vx = atoms[i]->get_vx() +
512 <          ( dt2 * atoms[i]->getFx() / atoms[i]->getMass() ) * e_convert;
513 <        vy = atoms[i]->get_vy() +
514 <          ( dt2 * atoms[i]->getFy() / atoms[i]->getMass() ) * e_convert;
515 <        vz = atoms[i]->get_vz() +
516 <          ( dt2 * atoms[i]->getFz() / atoms[i]->getMass() ) * e_convert;
517 <        
518 <        atoms[i]->set_vx( vx );
519 <        atoms[i]->set_vy( vy );
520 <        atoms[i]->set_vz( vz );
521 <        
522 < //      vx2 = vx * vx;
523 < //      vy2 = vy * vy;
524 < //      vz2 = vz * vz;
525 <        
526 <        if( atoms[i]->isDirectional() ){
527 <
528 <          dAtom = (DirectionalAtom *)atoms[i];
529 <          
530 <          // get and convert the torque to body frame
531 <          
532 <          Tb[0] = dAtom->getTx();
533 <          Tb[1] = dAtom->getTy();
534 <          Tb[2] = dAtom->getTz();
535 <          
536 <          dAtom->lab2Body( Tb );
537 <          
538 <          // get the angular momentum, and complete the angular momentum
539 <          // half step
540 <          
541 <          ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * e_convert;
542 <          ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * e_convert;
543 <          ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * e_convert;
544 <          
545 <          jx2 = ji[0] * ji[0];
546 <          jy2 = ji[1] * ji[1];
547 <          jz2 = ji[2] * ji[2];
548 <          
549 <          rot_kE += (jx2 / dAtom->getIxx()) + (jy2 / dAtom->getIyy())
550 <            + (jz2 / dAtom->getIzz());
551 <          
552 <          dAtom->setJx( ji[0] );
553 <          dAtom->setJy( ji[1] );
554 <          dAtom->setJz( ji[2] );
555 <        }
556 <      }
324 >      // get the angular momentum, and complete the angular momentum
325 >      // half step
326        
327 <      time = tl + 1;
327 >      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
328 >      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
329 >      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
330        
331 <      if( entry_plug->setTemp ){
332 <        if( !(time % vel_n) ) tStats->velocitize();
333 <      }
334 <      if( !(time % sample_n) ) dump_out->writeDump( time * dt );
335 <      if( !((time+1) % status_n) ) {
336 <        calcPot = 1;
337 <        calcStress = 1;
567 <      }
568 <      if( !(time % status_n) ){
569 <        e_out->writeStat( time * dt );
570 <        calcPot = 0;
571 <        calcStress = 0;
572 <      }      
331 >      jx2 = ji[0] * ji[0];
332 >      jy2 = ji[1] * ji[1];
333 >      jz2 = ji[2] * ji[2];
334 >      
335 >      dAtom->setJx( ji[0] );
336 >      dAtom->setJy( ji[1] );
337 >      dAtom->setJz( ji[2] );
338      }
339    }
340  
341 <  dump_out->writeFinal();
341 > }
342  
343 <  delete dump_out;
344 <  delete e_out;
343 >
344 > void Integrator::constrainA(){
345 >
346 >  
347 >
348 >
349   }
350  
351 +
352 +
353 +
354 +
355 +
356 +
357 +
358 +
359   void Symplectic::rotate( int axes1, int axes2, double angle, double ji[3],
360                           double A[3][3] ){
361  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines