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 472 by mmeineke, Mon Apr 7 21:16:35 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 <  std::cerr<< "calling symplectic constructor\n";
19 >  molecules = info->molecules;
20 >  nMols = info->n_mol;
21  
43  molecules = entry_plug->molecules;
44  nMols = entry_plug->n_mol;
45
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  
51  // grab the masses
52
53  mass = new double[entry_plug->n_atoms];
54  for(int i = 0; i < entry_plug->n_atoms; i++){
55    mass[i] = entry_plug->atoms[i]->getMass();
56  }  
57
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 76 | 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 93 | 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 110 | 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;
135 <      constrained_j[i] = temp_con[i].get_b() + 1;
136 <      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  
143 Symplectic::~Symplectic() {
144  
145  if( n_constrained ){
146    delete[] constrained_i;
147    delete[] constrained_j;
148    delete[] constrained_dsqr;
149  }
150  
151 }
136  
153
137   void Symplectic::integrate( void ){
138  
156  const double e_convert = 4.184e-4; // converts kcal/mol -> amu*A^2/fs^2
157
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 164 | 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 172 | 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 187 | 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;
175 <  StatWriter*  e_out;
176 <  DumpWriter*  dump_out;
174 >  tStats   = new Thermo( info );
175 >  e_out    = new StatWriter( info );
176 >  dump_out = new DumpWriter( info );
177  
178 <  std::cerr << "about to call new thermo\n";
196 <
197 <  tStats   = new Thermo( entry_plug );
198 <  e_out    = new StatWriter( entry_plug );
199 <
200 <  std::cerr << "calling dumpWriter \n";
201 <  dump_out = new DumpWriter( entry_plug );
202 <  std::cerr << "called dumpWriter \n";
203 <
204 <  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 219 | 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 <      
239 <      for( j=0; j<nAtoms; j++ ){
217 >  
218 >  }
219  
220 <        Rx[j] = atoms[j]->getX();
242 <        Ry[j] = atoms[j]->getY();
243 <        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  
249        Fx[j] = atoms[j]->getFx();
250        Fy[j] = atoms[j]->getFy();
251        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,
260 <                      entry_plug->box_y,
261 <                      entry_plug->box_z );
262 <      
263 <      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]);
272 <      }
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
281 <          
282 < // //     Tb[0] = dAtom->getTx();
283 < // //     Tb[1] = dAtom->getTy();
284 < // //     Tb[2] = dAtom->getTz();
285 <          
286 < // //     dAtom->lab2Body( Tb );
287 <          
288 < // //     // get the angular momentum, and propagate a half step
289 <          
290 < // //     ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * e_convert;
291 < // //     ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * e_convert;
292 < // //     ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * e_convert;
293 <          
294 < // //     // get the atom's rotation matrix
295 <          
296 < // //     A[0][0] = dAtom->getAxx();
297 < // //     A[0][1] = dAtom->getAxy();
298 < // //     A[0][2] = dAtom->getAxz();
299 <          
300 < // //     A[1][0] = dAtom->getAyx();
301 < // //     A[1][1] = dAtom->getAyy();
302 < // //     A[1][2] = dAtom->getAyz();
303 <          
304 < // //     A[2][0] = dAtom->getAzx();
305 < // //     A[2][1] = dAtom->getAzy();
306 < // //     A[2][2] = dAtom->getAzz();
307 <          
308 <          
309 < // //     // use the angular velocities to propagate the rotation matrix a
310 < // //     // full time step
311 <          
312 <          
313 < // //     angle = dt2 * ji[0] / dAtom->getIxx();
314 < // //     this->rotate( 1, 2, angle, ji, A ); // rotate about the x-axis
315 <          
316 < // //     angle = dt2 * ji[1] / dAtom->getIyy();
317 < // //     this->rotate( 2, 0, angle, ji, A ); // rotate about the y-axis
318 <          
319 < // //     angle = dt * ji[2] / dAtom->getIzz();
320 < // //     this->rotate( 0, 1, angle, ji, A ); // rotate about the z-axis
321 <          
322 < // //     angle = dt2 * ji[1] / dAtom->getIyy();
323 < // //     this->rotate( 2, 0, angle, ji, A ); // rotate about the y-axis
324 <          
325 < // //     angle = dt2 * ji[0] / dAtom->getIxx();
326 < // //     this->rotate( 1, 2, angle, ji, A ); // rotate about the x-axis
327 <          
328 <          
329 < // //     dAtom->setA( A );
330 < // //     dAtom->setJx( ji[0] );
331 < // //     dAtom->setJy( ji[1] );
332 < // //     dAtom->setJz( ji[2] );
333 < // //   }
334 < //       }
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
260 >      // get the angular momentum, and propagate a half step
261 >      
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 >      // use the angular velocities to propagate the rotation matrix a
267 >      // full time step
268 >      
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 > }
296  
342      for( j=0; j<nAtoms; j++ ){
297  
298 <        Rx[j] = atoms[j]->getX();
299 <        Ry[j] = atoms[j]->getY();
300 <        Rz[j] = atoms[j]->getZ();
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 <        Vx[j] = atoms[j]->get_vx();
306 <        Vy[j] = atoms[j]->get_vy();
350 <        Vz[j] = atoms[j]->get_vz();
305 >  for( i=0; i<nAtoms; i++ ){
306 >    atomIndex = i * 3;
307  
308 <        Fx[j] = atoms[j]->getFx();
309 <        Fy[j] = atoms[j]->getFy();
310 <        Fz[j] = atoms[j]->getFz();
355 <      }
356 <        
357 <      v_constrain_b_( dt, nAtoms, mass, Rx, Ry, Rz, Vx, Vy, Vz,
358 <                      Fx, Fy, Fz,
359 <                      kE, n_constrained, constrained_dsqr,
360 <                      constrained_i, constrained_j,
361 <                      entry_plug->box_x,
362 <                      entry_plug->box_y,
363 <                      entry_plug->box_z );
364 <      
365 <      for( j=0; j<nAtoms; j++ ){
308 >    // velocity half step
309 >    for( j=atomIndex; j<(atomIndex+3); j++ )
310 >      vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
311  
312 <        atoms[j]->setX(Rx[j]);
368 <        atoms[j]->setY(Ry[j]);
369 <        atoms[j]->setZ(Rz[j]);
370 <
371 <        atoms[j]->set_vx(Vx[j]);
372 <        atoms[j]->set_vy(Vy[j]);
373 <        atoms[j]->set_vz(Vz[j]);
374 <      }
312 >    if( atoms[i]->isDirectional() ){
313        
314 < //       for( i=0; i< nAtoms; i++ ){
377 <
378 < //      if( atoms[i]->isDirectional() ){
379 <
380 < //        dAtom = (DirectionalAtom *)atoms[i];
381 <          
382 < //        // get and convert the torque to body frame
383 <          
384 < //        Tb[0] = dAtom->getTx();
385 < //        Tb[1] = dAtom->getTy();
386 < //        Tb[2] = dAtom->getTz();
387 <          
388 < //        dAtom->lab2Body( Tb );
389 <          
390 < //        // get the angular momentum, and complete the angular momentum
391 < //        // half step
392 <          
393 < //        ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * e_convert;
394 < //        ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * e_convert;
395 < //        ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * e_convert;
396 <          
397 < //        dAtom->setJx( ji[0] );
398 < //        dAtom->setJy( ji[1] );
399 < //        dAtom->setJz( ji[2] );
400 < //      }
401 < //       }
402 <    
403 <      time = tl + 1;
314 >      dAtom = (DirectionalAtom *)atoms[i];
315        
316 <      if( entry_plug->setTemp ){
317 <        if( !(time % vel_n) ) tStats->velocitize();
318 <      }
319 <      if( !(time % sample_n) ) dump_out->writeDump( time * dt );
320 <      if( !((time+1) % status_n) ) {
321 <        calcPot = 1;
322 <        calcStress = 1;
323 <      }
324 <      if( !(time % status_n) ){
325 <        e_out->writeStat( time * dt );
326 <        calcPot = 0;
327 <        calcStress = 0;
328 <      }
316 >      // get and convert the torque to body frame
317 >      
318 >      Tb[0] = dAtom->getTx();
319 >      Tb[1] = dAtom->getTy();
320 >      Tb[2] = dAtom->getTz();
321 >      
322 >      dAtom->lab2Body( Tb );
323 >      
324 >      // get the angular momentum, and complete the angular momentum
325 >      // half step
326 >      
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 >      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    }
420  else{
340  
341 <    for( tl=0; tl<n_loops; tl++ ){
423 <      
424 <      kE = 0.0;
425 <      rot_kE= 0.0;
426 <      trans_kE = 0.0;
427 <      
428 <      for( i=0; i<nAtoms; i++ ){
429 <        
430 <        // velocity half step
431 <        
432 <        vx = atoms[i]->get_vx() +
433 <          ( dt2 * atoms[i]->getFx() / atoms[i]->getMass() ) * e_convert;
434 <        vy = atoms[i]->get_vy() +
435 <          ( dt2 * atoms[i]->getFy() / atoms[i]->getMass() ) * e_convert;
436 <        vz = atoms[i]->get_vz() +
437 <          ( dt2 * atoms[i]->getFz() / atoms[i]->getMass() ) * e_convert;
438 <        
439 <        // position whole step
440 <        
441 <        rx = atoms[i]->getX() + dt * vx;
442 <        ry = atoms[i]->getY() + dt * vy;
443 <        rz = atoms[i]->getZ() + dt * vz;
444 <        
445 <        atoms[i]->setX( rx );
446 <        atoms[i]->setY( ry );
447 <        atoms[i]->setZ( rz );
448 <        
449 <        atoms[i]->set_vx( vx );
450 <        atoms[i]->set_vy( vy );
451 <        atoms[i]->set_vz( vz );
452 <        
453 < //      if( atoms[i]->isDirectional() ){
341 > }
342  
455 //        dAtom = (DirectionalAtom *)atoms[i];
456          
457 //        // get and convert the torque to body frame
458          
459 //        Tb[0] = dAtom->getTx();
460 //        Tb[1] = dAtom->getTy();
461 //        Tb[2] = dAtom->getTz();
462          
463 //        dAtom->lab2Body( Tb );
464          
465 //        // get the angular momentum, and propagate a half step
466          
467 //        ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * e_convert;
468 //        ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * e_convert;
469 //        ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * e_convert;
470          
471 //        // get the atom's rotation matrix
472          
473 //        A[0][0] = dAtom->getAxx();
474 //        A[0][1] = dAtom->getAxy();
475 //        A[0][2] = dAtom->getAxz();
476          
477 //        A[1][0] = dAtom->getAyx();
478 //        A[1][1] = dAtom->getAyy();
479 //        A[1][2] = dAtom->getAyz();
480          
481 //        A[2][0] = dAtom->getAzx();
482 //        A[2][1] = dAtom->getAzy();
483 //        A[2][2] = dAtom->getAzz();
484          
485          
486 //        // use the angular velocities to propagate the rotation matrix a
487 //        // full time step
488          
489          
490 //        angle = dt2 * ji[0] / dAtom->getIxx();
491 //        this->rotate( 1, 2, angle, ji, A ); // rotate about the x-axis
492          
493 //        angle = dt2 * ji[1] / dAtom->getIyy();
494 //        this->rotate( 2, 0, angle, ji, A ); // rotate about the y-axis
495          
496 //        angle = dt * ji[2] / dAtom->getIzz();
497 //        this->rotate( 0, 1, angle, ji, A ); // rotate about the z-axis
498          
499 //        angle = dt2 * ji[1] / dAtom->getIyy();
500 //        this->rotate( 2, 0, angle, ji, A ); // rotate about the y-axis
501          
502 //        angle = dt2 * ji[0] / dAtom->getIxx();
503 //        this->rotate( 1, 2, angle, ji, A ); // rotate about the x-axis
504          
505          
506 //        dAtom->setA( A );
507 //        dAtom->setJx( ji[0] );
508 //        dAtom->setJy( ji[1] );
509 //        dAtom->setJz( ji[2] );
510 //      }
511      }
512      
513      // calculate the forces
514      
515      myFF->doForces(calcPot,calcStress);
516      
517      for( i=0; i< nAtoms; i++ ){
518        
519        // complete the velocity half step
520        
521        vx = atoms[i]->get_vx() +
522          ( dt2 * atoms[i]->getFx() / atoms[i]->getMass() ) * e_convert;
523        vy = atoms[i]->get_vy() +
524          ( dt2 * atoms[i]->getFy() / atoms[i]->getMass() ) * e_convert;
525        vz = atoms[i]->get_vz() +
526          ( dt2 * atoms[i]->getFz() / atoms[i]->getMass() ) * e_convert;
527        
528        atoms[i]->set_vx( vx );
529        atoms[i]->set_vy( vy );
530        atoms[i]->set_vz( vz );
531        
532 //      vx2 = vx * vx;
533 //      vy2 = vy * vy;
534 //      vz2 = vz * vz;
535        
536 //      if( atoms[i]->isDirectional() ){
343  
344 < //        dAtom = (DirectionalAtom *)atoms[i];
539 <          
540 < //        // get and convert the torque to body frame
541 <          
542 < //        Tb[0] = dAtom->getTx();
543 < //        Tb[1] = dAtom->getTy();
544 < //        Tb[2] = dAtom->getTz();
545 <          
546 < //        dAtom->lab2Body( Tb );
547 <          
548 < //        // get the angular momentum, and complete the angular momentum
549 < //        // half step
550 <          
551 < //        ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * e_convert;
552 < //        ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * e_convert;
553 < //        ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * e_convert;
554 <          
555 < //        jx2 = ji[0] * ji[0];
556 < //        jy2 = ji[1] * ji[1];
557 < //        jz2 = ji[2] * ji[2];
558 <          
559 < //        rot_kE += (jx2 / dAtom->getIxx()) + (jy2 / dAtom->getIyy())
560 < //          + (jz2 / dAtom->getIzz());
561 <          
562 < //        dAtom->setJx( ji[0] );
563 < //        dAtom->setJy( ji[1] );
564 < //        dAtom->setJz( ji[2] );
565 < //      }
566 <      }
567 <      
568 <      time = tl + 1;
569 <      
570 <      if( entry_plug->setTemp ){
571 <        if( !(time % vel_n) ) tStats->velocitize();
572 <      }
573 <      if( !(time % sample_n) ) dump_out->writeDump( time * dt );
574 <      if( !((time+1) % status_n) ) {
575 <        calcPot = 1;
576 <        calcStress = 1;
577 <      }
578 <      if( !(time % status_n) ){
579 <        e_out->writeStat( time * dt );
580 <        calcPot = 0;
581 <        calcStress = 0;
582 <      }      
583 <    }
584 <  }
344 > void Integrator::constrainA(){
345  
346 <  dump_out->writeFinal();
346 >  
347  
348 <  delete dump_out;
589 <  delete e_out;
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