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

Comparing trunk/OOPSE/libmdtools/Integrator.cpp (file contents):
Revision 559 by mmeineke, Thu Jun 19 22:02:44 2003 UTC vs.
Revision 600 by gezelter, Mon Jul 14 22:38:13 2003 UTC

# Line 1 | Line 1
1   #include <iostream>
2   #include <cstdlib>
3 + #include <cmath>
4  
5   #ifdef IS_MPI
6   #include "mpiSimulation.hpp"
# Line 10 | Line 11 | Integrator::Integrator( SimInfo* theInfo, ForceFields*
11   #include "simError.h"
12  
13  
14 < Integrator::Integrator( SimInfo* theInfo, ForceFields* the_ff ){
14 > Integrator::Integrator( SimInfo *theInfo, ForceFields* the_ff ){
15    
16    info = theInfo;
17    myFF = the_ff;
# Line 26 | Line 27 | Integrator::Integrator( SimInfo* theInfo, ForceFields*
27  
28    nAtoms = info->n_atoms;
29  
30 +  std::cerr << "integ nAtoms = "  << nAtoms << "\n";
31 +
32    // check for constraints
33    
34    constrainedA    = NULL;
# Line 33 | Line 36 | Integrator::Integrator( SimInfo* theInfo, ForceFields*
36    constrainedDsqr = NULL;
37    moving          = NULL;
38    moved           = NULL;
39 <  prePos          = NULL;
39 >  oldPos          = NULL;
40    
41    nConstrained = 0;
42  
# Line 48 | Line 51 | Integrator::~Integrator() {
51      delete[] constrainedDsqr;
52      delete[] moving;
53      delete[] moved;
54 <    delete[] prePos;
54 >    delete[] oldPos;
55    }
56    
57   }
# Line 71 | Line 74 | void Integrator::checkConstraints( void ){
74      for(int j=0; j<molecules[i].getNBonds(); j++){
75        
76        constrained = theArray[j]->is_constrained();
77 +
78 +      std::cerr << "Is the folowing bond constrained \n";
79 +      theArray[j]->printMe();
80        
81        if(constrained){
82          
83 +        std::cerr << "Yes\n";
84 +
85          dummy_plug = theArray[j]->get_constraint();
86          temp_con[nConstrained].set_a( dummy_plug->get_a() );
87          temp_con[nConstrained].set_b( dummy_plug->get_b() );
# Line 81 | Line 89 | void Integrator::checkConstraints( void ){
89          
90          nConstrained++;
91          constrained = 0;
92 <      }
92 >      }
93 >      else std::cerr << "No.\n";
94      }
95  
96      theArray = (SRI**) molecules[i].getMyBends();
# Line 136 | Line 145 | void Integrator::checkConstraints( void ){
145        constrainedA[i] = temp_con[i].get_a();
146        constrainedB[i] = temp_con[i].get_b();
147        constrainedDsqr[i] = temp_con[i].get_dsqr();
148 +
149      }
150  
151      
# Line 146 | Line 156 | void Integrator::checkConstraints( void ){
156      moving = new int[nAtoms];
157      moved  = new int[nAtoms];
158  
159 <    prePos = new double[nAtoms*3];
159 >    oldPos = new double[nAtoms*3];
160    }
161    
162    delete[] temp_con;
# Line 156 | Line 166 | void Integrator::integrate( void ){
166   void Integrator::integrate( void ){
167  
168    int i, j;                         // loop counters
159  double kE = 0.0;                  // the kinetic energy  
160  double rot_kE;
161  double trans_kE;
162  int tl;                        // the time loop conter
163  double dt2;                       // half the dt
169  
165  double vx, vy, vz;    // the velocities
166  double vx2, vy2, vz2; // the square of the velocities
167  double rx, ry, rz;    // the postitions
168  
169  double ji[3];   // the body frame angular momentum
170  double jx2, jy2, jz2; // the square of the angular momentums
171  double Tb[3];   // torque in the body frame
172  double angle;   // the angle through which to rotate the rotation matrix
173  double A[3][3]; // the rotation matrix
174  double press[9];
175
176  double dt          = info->dt;
170    double runTime     = info->run_time;
171    double sampleTime  = info->sampleTime;
172    double statusTime  = info->statusTime;
# Line 188 | Line 181 | void Integrator::integrate( void ){
181    int isError;
182  
183    tStats   = new Thermo( info );
184 <  e_out    = new StatWriter( info );
185 <  dump_out = new DumpWriter( info );
184 >  statOut  = new StatWriter( info );
185 >  dumpOut  = new DumpWriter( info );
186  
187 <  Atom** atoms = info->atoms;
187 >  atoms = info->atoms;
188    DirectionalAtom* dAtom;
189 +
190 +  dt = info->dt;
191    dt2 = 0.5 * dt;
192  
193    // initialize the forces before the first step
# Line 204 | Line 199 | void Integrator::integrate( void ){
199      tStats->velocitize();
200    }
201    
202 <  dump_out->writeDump( 0.0 );
203 <  e_out->writeStat( 0.0 );
202 >  dumpOut->writeDump( 0.0 );
203 >  statOut->writeStat( 0.0 );
204    
205    calcPot     = 0;
206    calcStress  = 0;
# Line 229 | Line 224 | void Integrator::integrate( void ){
224        calcPot = 1;
225        calcStress = 1;
226      }
227 <    
227 >
228 >    std::cerr << currTime << "\n";
229 >
230      integrateStep( calcPot, calcStress );
231        
232      currTime += dt;
# Line 242 | Line 239 | void Integrator::integrate( void ){
239      }
240  
241      if( currTime >= currSample ){
242 <      dump_out->writeDump( currTime );
242 >      dumpOut->writeDump( currTime );
243        currSample += sampleTime;
244      }
245  
246      if( currTime >= currStatus ){
247 <      e_out->writeStat( time * dt );
247 >      statOut->writeStat( currTime );
248        calcPot = 0;
249        calcStress = 0;
250        currStatus += statusTime;
# Line 261 | Line 258 | void Integrator::integrate( void ){
258  
259    }
260  
261 <  dump_out->writeFinal();
261 >  dumpOut->writeFinal(currTime);
262  
263 <  delete dump_out;
264 <  delete e_out;
263 >  delete dumpOut;
264 >  delete statOut;
265   }
266  
267   void Integrator::integrateStep( int calcPot, int calcStress ){
268  
269 +
270 +      
271    // Position full step, and velocity half step
272  
273 <  //preMove();
273 >  preMove();
274    moveA();
275    if( nConstrained ) constrainA();
276  
# Line 289 | Line 288 | void Integrator::moveA( void ){
288  
289   void Integrator::moveA( void ){
290    
291 <  int i,j,k;
293 <  int atomIndex, aMatIndex;
291 >  int i, j;
292    DirectionalAtom* dAtom;
293 <  double Tb[3];
294 <  double ji[3];
293 >  double Tb[3], ji[3];
294 >  double A[3][3], I[3][3];
295 >  double angle;
296 >  double vel[3], pos[3], frc[3];
297 >  double mass;
298  
299    for( i=0; i<nAtoms; i++ ){
299    atomIndex = i * 3;
300    aMatIndex = i * 9;
301    
302    // velocity half step
303    for( j=atomIndex; j<(atomIndex+3); j++ )
304      vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
300  
301 <    // position whole step    
302 <    for( j=atomIndex; j<(atomIndex+3); j++ )
301 >    atoms[i]->getVel( vel );
302 >    atoms[i]->getPos( pos );
303 >    atoms[i]->getFrc( frc );
304 >
305 >    mass = atoms[i]->getMass();
306 >
307 >    for (j=0; j < 3; j++) {
308 >      // velocity half step
309 >      vel[j] += ( dt2 * frc[j] / mass ) * eConvert;
310 >      // position whole step
311        pos[j] += dt * vel[j];
312 +    }
313  
314 <  
314 >    atoms[i]->setVel( vel );
315 >    atoms[i]->setPos( pos );
316 >
317      if( atoms[i]->isDirectional() ){
318  
319        dAtom = (DirectionalAtom *)atoms[i];
320            
321        // get and convert the torque to body frame
322        
323 <      Tb[0] = dAtom->getTx();
318 <      Tb[1] = dAtom->getTy();
319 <      Tb[2] = dAtom->getTz();
320 <      
323 >      dAtom->getTrq( Tb );
324        dAtom->lab2Body( Tb );
325 <      
325 >
326        // get the angular momentum, and propagate a half step
327 +
328 +      dAtom->getJ( ji );
329 +
330 +      for (j=0; j < 3; j++)
331 +        ji[j] += (dt2 * Tb[j]) * eConvert;
332        
325      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
326      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
327      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
328      
333        // use the angular velocities to propagate the rotation matrix a
334        // full time step
335 <      
335 >
336 >      dAtom->getA(A);
337 >      dAtom->getI(I);
338 >    
339        // rotate about the x-axis      
340 <      angle = dt2 * ji[0] / dAtom->getIxx();
341 <      this->rotate( 1, 2, angle, ji, &aMat[aMatIndex] );
342 <      
340 >      angle = dt2 * ji[0] / I[0][0];
341 >      this->rotate( 1, 2, angle, ji, A );
342 >
343        // rotate about the y-axis
344 <      angle = dt2 * ji[1] / dAtom->getIyy();
345 <      this->rotate( 2, 0, angle, ji, &aMat[aMatIndex] );
344 >      angle = dt2 * ji[1] / I[1][1];
345 >      this->rotate( 2, 0, angle, ji, A );
346        
347        // rotate about the z-axis
348 <      angle = dt * ji[2] / dAtom->getIzz();
349 <      this->rotate( 0, 1, angle, ji, &aMat[aMatIndex] );
348 >      angle = dt * ji[2] / I[2][2];
349 >      this->rotate( 0, 1, angle, ji, A);
350        
351        // rotate about the y-axis
352 <      angle = dt2 * ji[1] / dAtom->getIyy();
353 <      this->rotate( 2, 0, angle, ji, &aMat[aMatIndex] );
352 >      angle = dt2 * ji[1] / I[1][1];
353 >      this->rotate( 2, 0, angle, ji, A );
354        
355         // rotate about the x-axis
356 <      angle = dt2 * ji[0] / dAtom->getIxx();
357 <      this->rotate( 1, 2, angle, ji, &aMat[aMatIndex] );
356 >      angle = dt2 * ji[0] / I[0][0];
357 >      this->rotate( 1, 2, angle, ji, A );
358        
359 <      dAtom->setJx( ji[0] );
360 <      dAtom->setJy( ji[1] );
361 <      dAtom->setJz( ji[2] );
362 <    }
363 <    
359 >
360 >      dAtom->setJ( ji );
361 >      dAtom->setA( A  );
362 >          
363 >    }    
364    }
365   }
366  
367  
368   void Integrator::moveB( void ){
369 <  int i,j,k;
363 <  int atomIndex;
369 >  int i, j;
370    DirectionalAtom* dAtom;
371 <  double Tb[3];
372 <  double ji[3];
371 >  double Tb[3], ji[3];
372 >  double vel[3], frc[3];
373 >  double mass;
374  
375    for( i=0; i<nAtoms; i++ ){
376 <    atomIndex = i * 3;
376 >
377 >    atoms[i]->getVel( vel );
378 >    atoms[i]->getFrc( frc );
379  
380 <    // velocity half step
372 <    for( j=atomIndex; j<(atomIndex+3); j++ )
373 <      vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
380 >    mass = atoms[i]->getMass();
381  
382 +    // velocity half step
383 +    for (j=0; j < 3; j++)
384 +      vel[j] += ( dt2 * frc[j] / mass ) * eConvert;
385 +    
386 +    atoms[i]->setVel( vel );
387 +
388      if( atoms[i]->isDirectional() ){
389 <      
389 >
390        dAtom = (DirectionalAtom *)atoms[i];
391 <      
392 <      // get and convert the torque to body frame
393 <      
394 <      Tb[0] = dAtom->getTx();
382 <      Tb[1] = dAtom->getTy();
383 <      Tb[2] = dAtom->getTz();
384 <      
391 >
392 >      // get and convert the torque to body frame      
393 >
394 >      dAtom->getTrq( Tb );
395        dAtom->lab2Body( Tb );
396 +
397 +      // get the angular momentum, and propagate a half step
398 +
399 +      dAtom->getJ( ji );
400 +
401 +      for (j=0; j < 3; j++)
402 +        ji[j] += (dt2 * Tb[j]) * eConvert;
403        
404 <      // get the angular momentum, and complete the angular momentum
405 <      // half step
389 <      
390 <      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
391 <      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
392 <      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
393 <      
394 <      jx2 = ji[0] * ji[0];
395 <      jy2 = ji[1] * ji[1];
396 <      jz2 = ji[2] * ji[2];
397 <      
398 <      dAtom->setJx( ji[0] );
399 <      dAtom->setJy( ji[1] );
400 <      dAtom->setJz( ji[2] );
404 >
405 >      dAtom->setJ( ji );
406      }
407    }
403
408   }
409  
410   void Integrator::preMove( void ){
411 <  int i;
411 >  int i, j;
412 >  double pos[3];
413  
414    if( nConstrained ){
415 <    if( oldAtoms != nAtoms ){
416 <      
417 <      // save oldAtoms to check for lode balanceing later on.
418 <      
419 <      oldAtoms = nAtoms;
420 <      
421 <      delete[] moving;
422 <      delete[] moved;
423 <      delete[] oldPos;
419 <      
420 <      moving = new int[nAtoms];
421 <      moved  = new int[nAtoms];
422 <      
423 <      oldPos = new double[nAtoms*3];
415 >
416 >    for(i=0; i < nAtoms; i++) {
417 >
418 >      atoms[i]->getPos( pos );
419 >
420 >      for (j = 0; j < 3; j++) {        
421 >        oldPos[3*i + j] = pos[j];
422 >      }
423 >
424      }
425 <  
426 <    for(i=0; i<(nAtoms*3); i++) oldPos[i] = pos[i];
427 <  }
428 < }  
425 >  }  
426 > }
427  
428   void Integrator::constrainA(){
429  
430    int i,j,k;
431    int done;
432 <  double pxab, pyab, pzab;
433 <  double rxab, ryab, rzab;
434 <  int a, b;
432 >  double posA[3], posB[3];
433 >  double velA[3], velB[3];
434 >  double pab[3];
435 >  double rab[3];
436 >  int a, b, ax, ay, az, bx, by, bz;
437    double rma, rmb;
438    double dx, dy, dz;
439 +  double rpab;
440    double rabsq, pabsq, rpabsq;
441    double diffsq;
442    double gab;
443    int iteration;
444  
445 <
445 <  
446 <  for( i=0; i<nAtoms; i++){
447 <    
445 >  for( i=0; i<nAtoms; i++){    
446      moving[i] = 0;
447      moved[i]  = 1;
448    }
449 <  
452 <  
449 >
450    iteration = 0;
451    done = 0;
452    while( !done && (iteration < maxIteration )){
# Line 459 | Line 456 | void Integrator::constrainA(){
456  
457        a = constrainedA[i];
458        b = constrainedB[i];
459 <    
459 >      
460 >      ax = (a*3) + 0;
461 >      ay = (a*3) + 1;
462 >      az = (a*3) + 2;
463 >
464 >      bx = (b*3) + 0;
465 >      by = (b*3) + 1;
466 >      bz = (b*3) + 2;
467 >
468        if( moved[a] || moved[b] ){
469 <        
470 <        pxab = pos[3*a+0] - pos[3*b+0];
471 <        pyab = pos[3*a+1] - pos[3*b+1];
472 <        pzab = pos[3*a+2] - pos[3*b+2];
469 >        
470 >        atoms[a]->getPos( posA );
471 >        atoms[b]->getPos( posB );
472 >        
473 >        for (j = 0; j < 3; j++ )
474 >          pab[j] = posA[j] - posB[j];
475 >        
476 >        //periodic boundary condition
477  
478 <        //periodic boundary condition
470 <        pxab = pxab - info->box_x * copysign(1, pxab)
471 <          * int(pxab / info->box_x + 0.5);
472 <        pyab = pyab - info->box_y * copysign(1, pyab)
473 <          * int(pyab / info->box_y + 0.5);
474 <        pzab = pzab - info->box_z * copysign(1, pzab)
475 <          * int(pzab / info->box_z + 0.5);
476 <      
477 <        pabsq = pxab * pxab + pyab * pyab + pzab * pzab;
478 <        rabsq = constraintedDsqr[i];
479 <        diffsq = pabsq - rabsq;
478 >        info->wrapVector( pab );
479  
480 +        pabsq = pab[0] * pab[0] + pab[1] * pab[1] + pab[2] * pab[2];
481 +
482 +        rabsq = constrainedDsqr[i];
483 +        diffsq = rabsq - pabsq;
484 +
485          // the original rattle code from alan tidesley
486 <        if (fabs(diffsq) > tol*rabsq*2) {
487 <          rxab = oldPos[3*a+0] - oldPos[3*b+0];
488 <          ryab = oldPos[3*a+1] - oldPos[3*b+1];
489 <          rzab = oldPos[3*a+2] - oldPos[3*b+2];
486 <
487 <          rxab = rxab - info->box_x * copysign(1, rxab)
488 <            * int(rxab / info->box_x + 0.5);
489 <          ryab = ryab - info->box_y * copysign(1, ryab)
490 <            * int(ryab / info->box_y + 0.5);
491 <          rzab = rzab - info->box_z * copysign(1, rzab)
492 <            * int(rzab / info->box_z + 0.5);
486 >        if (fabs(diffsq) > (tol*rabsq*2)) {
487 >          rab[0] = oldPos[ax] - oldPos[bx];
488 >          rab[1] = oldPos[ay] - oldPos[by];
489 >          rab[2] = oldPos[az] - oldPos[bz];
490  
491 <          rpab = rxab * pxab + ryab * pyab + rzab * pzab;
491 >          info->wrapVector( rab );
492 >
493 >          rpab = rab[0] * pab[0] + rab[1] * pab[1] + rab[2] * pab[2];
494 >
495            rpabsq = rpab * rpab;
496  
497  
498            if (rpabsq < (rabsq * -diffsq)){
499 +
500   #ifdef IS_MPI
501              a = atoms[a]->getGlobalIndex();
502              b = atoms[b]->getGlobalIndex();
503   #endif //is_mpi
504              sprintf( painCave.errMsg,
505 <                     "Constraint failure in constrainA at atom %d and %d\n.",
505 >                     "Constraint failure in constrainA at atom %d and %d.\n",
506                       a, b );
507              painCave.isFatal = 1;
508              simError();
# Line 509 | Line 510 | void Integrator::constrainA(){
510  
511            rma = 1.0 / atoms[a]->getMass();
512            rmb = 1.0 / atoms[b]->getMass();
513 <          
513 >
514            gab = diffsq / ( 2.0 * ( rma + rmb ) * rpab );
514          dx = rxab * gab;
515          dy = ryab * gab;
516          dz = rzab * gab;
515  
516 <          pos[3*a+0] += rma * dx;
517 <          pos[3*a+1] += rma * dy;
518 <          pos[3*a+2] += rma * dz;
516 >          dx = rab[0] * gab;
517 >          dy = rab[1] * gab;
518 >          dz = rab[2] * gab;
519  
520 <          pos[3*b+0] -= rmb * dx;
521 <          pos[3*b+1] -= rmb * dy;
522 <          pos[3*b+2] -= rmb * dz;
520 >          posA[0] += rma * dx;
521 >          posA[1] += rma * dy;
522 >          posA[2] += rma * dz;
523  
524 +          atoms[a]->setPos( posA );
525 +
526 +          posB[0] -= rmb * dx;
527 +          posB[1] -= rmb * dy;
528 +          posB[2] -= rmb * dz;
529 +
530 +          atoms[b]->setPos( posB );
531 +
532            dx = dx / dt;
533            dy = dy / dt;
534            dz = dz / dt;
535  
536 <          vel[3*a+0] += rma * dx;
531 <          vel[3*a+1] += rma * dy;
532 <          vel[3*a+2] += rma * dz;
536 >          atoms[a]->getVel( velA );
537  
538 <          vel[3*b+0] -= rmb * dx;
539 <          vel[3*b+1] -= rmb * dy;
540 <          vel[3*b+2] -= rmb * dz;
538 >          velA[0] += rma * dx;
539 >          velA[1] += rma * dy;
540 >          velA[2] += rma * dz;
541  
542 +          atoms[a]->setVel( velA );
543 +
544 +          atoms[b]->getVel( velB );
545 +
546 +          velB[0] -= rmb * dx;
547 +          velB[1] -= rmb * dy;
548 +          velB[2] -= rmb * dz;
549 +
550 +          atoms[b]->setVel( velB );
551 +
552            moving[a] = 1;
553            moving[b] = 1;
554            done = 0;
# Line 553 | Line 567 | void Integrator::constrainA(){
567  
568    if( !done ){
569  
570 <    sprintf( painCae.errMsg,
570 >    sprintf( painCave.errMsg,
571               "Constraint failure in constrainA, too many iterations: %d\n",
572 <             iterations );
572 >             iteration );
573      painCave.isFatal = 1;
574      simError();
575    }
# Line 566 | Line 580 | void Integrator::constrainB( void ){
580    
581    int i,j,k;
582    int done;
583 +  double posA[3], posB[3];
584 +  double velA[3], velB[3];
585    double vxab, vyab, vzab;
586 <  double rxab, ryab, rzab;
587 <  int a, b;
586 >  double rab[3];
587 >  int a, b, ax, ay, az, bx, by, bz;
588    double rma, rmb;
589    double dx, dy, dz;
590    double rabsq, pabsq, rvab;
# Line 576 | Line 592 | void Integrator::constrainB( void ){
592    double gab;
593    int iteration;
594  
595 <  for(i=0; i<nAtom; i++){
595 >  for(i=0; i<nAtoms; i++){
596      moving[i] = 0;
597      moved[i] = 1;
598    }
599  
600    done = 0;
601 +  iteration = 0;
602    while( !done && (iteration < maxIteration ) ){
603  
604 +    done = 1;
605 +
606      for(i=0; i<nConstrained; i++){
607        
608        a = constrainedA[i];
609        b = constrainedB[i];
610  
611 +      ax = (a*3) + 0;
612 +      ay = (a*3) + 1;
613 +      az = (a*3) + 2;
614 +
615 +      bx = (b*3) + 0;
616 +      by = (b*3) + 1;
617 +      bz = (b*3) + 2;
618 +
619        if( moved[a] || moved[b] ){
593        
594        vxab = vel[3*a+0] - vel[3*b+0];
595        vyab = vel[3*a+1] - vel[3*b+1];
596        vzab = vel[3*a+2] - vel[3*b+2];
620  
621 <        rxab = pos[3*a+0] - pos[3*b+0];q
622 <        ryab = pos[3*a+1] - pos[3*b+1];
623 <        rzab = pos[3*a+2] - pos[3*b+2];
624 <        
625 <        rxab = rxab - info->box_x * copysign(1, rxab)
626 <          * int(rxab / info->box_x + 0.5);
604 <        ryab = ryab - info->box_y * copysign(1, ryab)
605 <          * int(ryab / info->box_y + 0.5);
606 <        rzab = rzab - info->box_z * copysign(1, rzab)
607 <          * int(rzab / info->box_z + 0.5);
621 >        atoms[a]->getVel( velA );
622 >        atoms[b]->getVel( velB );
623 >          
624 >        vxab = velA[0] - velB[0];
625 >        vyab = velA[1] - velB[1];
626 >        vzab = velA[2] - velB[2];
627  
628 +        atoms[a]->getPos( posA );
629 +        atoms[b]->getPos( posB );
630 +
631 +        for (j = 0; j < 3; j++)
632 +          rab[j] = posA[j] - posB[j];
633 +          
634 +        info->wrapVector( rab );
635 +        
636          rma = 1.0 / atoms[a]->getMass();
637          rmb = 1.0 / atoms[b]->getMass();
638  
639 <        rvab = rxab * vxab + ryab * vyab + rzab * vzab;
639 >        rvab = rab[0] * vxab + rab[1] * vyab + rab[2] * vzab;
640            
641 <        gab = -rvab / ( ( rma + rmb ) * constraintsDsqr[i] );
641 >        gab = -rvab / ( ( rma + rmb ) * constrainedDsqr[i] );
642  
643          if (fabs(gab) > tol) {
644            
645 <          dx = rxab * gab;
646 <          dy = ryab * gab;
647 <          dz = rzab * gab;
648 <          
649 <          vel[3*a+0] += rma * dx;
650 <          vel[3*a+1] += rma * dy;
651 <          vel[3*a+2] += rma * dz;
645 >          dx = rab[0] * gab;
646 >          dy = rab[1] * gab;
647 >          dz = rab[2] * gab;
648 >        
649 >          velA[0] += rma * dx;
650 >          velA[1] += rma * dy;
651 >          velA[2] += rma * dz;
652  
653 <          vel[3*b+0] -= rmb * dx;
654 <          vel[3*b+1] -= rmb * dy;
655 <          vel[3*b+2] -= rmb * dz;
653 >          atoms[a]->setVel( velA );
654 >
655 >          velB[0] -= rmb * dx;
656 >          velB[1] -= rmb * dy;
657 >          velB[2] -= rmb * dz;
658 >
659 >          atoms[b]->setVel( velB );
660            
661            moving[a] = 1;
662            moving[b] = 1;
# Line 641 | Line 672 | void Integrator::constrainB( void ){
672      
673      iteration++;
674    }
675 <
675 >  
676    if( !done ){
677  
678    
679 <    sprintf( painCae.errMsg,
679 >    sprintf( painCave.errMsg,
680               "Constraint failure in constrainB, too many iterations: %d\n",
681 <             iterations );
681 >             iteration );
682      painCave.isFatal = 1;
683      simError();
684    }
685  
686   }
687  
657
658
659
660
661
662
688   void Integrator::rotate( int axes1, int axes2, double angle, double ji[3],
689                           double A[3][3] ){
690  
# Line 728 | Line 753 | void Integrator::rotate( int axes1, int axes2, double
753    //            A[][] = A[][] * transpose(rot[][])
754  
755  
756 <  // NOte for as yet unknown reason, we are setting the performing the
756 >  // NOte for as yet unknown reason, we are performing the
757    // calculation as:
758    //                transpose(A[][]) = transpose(A[][]) * transpose(rot[][])
759  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines