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 597 by mmeineke, Mon Jul 14 21:28:54 2003 UTC vs.
Revision 600 by gezelter, Mon Jul 14 22:38:13 2003 UTC

# Line 180 | Line 180 | void Integrator::integrate( void ){
180    int calcPot, calcStress;
181    int isError;
182  
183
184
183    tStats   = new Thermo( info );
184    statOut  = new StatWriter( info );
185    dumpOut  = new DumpWriter( info );
# Line 219 | Line 217 | void Integrator::integrate( void ){
217            "The integrator is ready to go." );
218    MPIcheckPoint();
219   #endif // is_mpi
222
223
224  pos  = Atom::getPosArray();
225  vel  = Atom::getVelArray();
226  frc  = Atom::getFrcArray();
220  
221    while( currTime < runTime ){
222  
# Line 279 | Line 272 | void Integrator::integrateStep( int calcPot, int calcS
272  
273    preMove();
274    moveA();
275 <  //if( nConstrained ) constrainA();
275 >  if( nConstrained ) constrainA();
276  
277    // calc forces
278  
# Line 295 | Line 288 | void Integrator::moveA( void ){
288  
289   void Integrator::moveA( void ){
290    
291 <  int i,j,k;
299 <  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 A[3][3], At[3][3];
296 >  double vel[3], pos[3], frc[3];
297 >  double mass;
298  
306
299    for( i=0; i<nAtoms; i++ ){
308    atomIndex = i * 3;
309    aMatIndex = i * 9;
300  
301 <    // velocity half step
302 <    for( j=atomIndex; j<(atomIndex+3); j++ )
303 <      vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
301 >    atoms[i]->getVel( vel );
302 >    atoms[i]->getPos( pos );
303 >    atoms[i]->getFrc( frc );
304  
305 +    mass = atoms[i]->getMass();
306  
307 <    // position whole step    
308 <    for( j=atomIndex; j<(atomIndex+3); j++ ) pos[j] += dt * vel[j];
309 <    
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 +    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();
327 <      Tb[1] = dAtom->getTy();
328 <      Tb[2] = dAtom->getTz();
329 <
323 >      dAtom->getTrq( Tb );
324        dAtom->lab2Body( Tb );
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        
334      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
335      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
336      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
337      
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] );
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        
361      dAtom->setJx( ji[0] );
362      dAtom->setJy( ji[1] );
363      dAtom->setJz( ji[2] );
359  
360 <      std::cerr << "Amat[" << i << "]\n";
361 <      info->printMat9( &Amat[aMatIndex] );
360 >      dAtom->setJ( ji );
361 >      dAtom->setA( A  );
362            
363 <      std::cerr << "ji[" << i << "]\t"
369 <                << ji[0] << "\t"
370 <                << ji[1] << "\t"
371 <                << ji[2] << "\n";
372 <          
373 <    }
374 <    
363 >    }    
364    }
365   }
366  
367  
368   void Integrator::moveB( void ){
369 <  int i,j,k;
381 <  int atomIndex, aMatIndex;
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;
377 <    aMatIndex = i * 9;
376 >
377 >    atoms[i]->getVel( vel );
378 >    atoms[i]->getFrc( frc );
379  
380 <    // velocity half step
391 <    for( j=atomIndex; j<(atomIndex+3); j++ )
392 <      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];
398      
399      // get and convert the torque to body frame
400      
401      Tb[0] = dAtom->getTx();
402      Tb[1] = dAtom->getTy();
403      Tb[2] = dAtom->getTz();
404      
405      std::cerr << "TrqB[" << i << "]\t"
406                << Tb[0] << "\t"
407                << Tb[1] << "\t"
408                << Tb[2] << "\n";
391  
392 +      // get and convert the torque to body frame      
393 +
394 +      dAtom->getTrq( Tb );
395        dAtom->lab2Body( Tb );
411      
412      // get the angular momentum, and complete the angular momentum
413      // half step
414      
415      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
416      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
417      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
418      
419      dAtom->setJx( ji[0] );
420      dAtom->setJy( ji[1] );
421      dAtom->setJz( ji[2] );
396  
397 +      // get the angular momentum, and propagate a half step
398  
399 <      std::cerr << "Amat[" << i << "]\n";
400 <      info->printMat9( &Amat[aMatIndex] );
401 <          
402 <      std::cerr << "ji[" << i << "]\t"
403 <                << ji[0] << "\t"
404 <                << ji[1] << "\t"
405 <                << ji[2] << "\n";
399 >      dAtom->getJ( ji );
400 >
401 >      for (j=0; j < 3; j++)
402 >        ji[j] += (dt2 * Tb[j]) * eConvert;
403 >      
404 >
405 >      dAtom->setJ( ji );
406      }
407    }
433
408   }
409  
410   void Integrator::preMove( void ){
411 <  int i;
411 >  int i, j;
412 >  double pos[3];
413  
414    if( nConstrained ){
415  
416 <    for(i=0; i<(nAtoms*3); i++) oldPos[i] = pos[i];
417 <  }
418 < }  
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 + }
427 +
428   void Integrator::constrainA(){
429  
430    int i,j,k;
431    int done;
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;
# Line 457 | Line 442 | void Integrator::constrainA(){
442    double gab;
443    int iteration;
444  
445 <  for( i=0; i<nAtoms; i++){
461 <    
445 >  for( i=0; i<nAtoms; i++){    
446      moving[i] = 0;
447      moved[i]  = 1;
448    }
# Line 482 | Line 466 | void Integrator::constrainA(){
466        bz = (b*3) + 2;
467  
468        if( moved[a] || moved[b] ){
469 <        
470 <        pab[0] = pos[ax] - pos[bx];
471 <        pab[1] = pos[ay] - pos[by];
472 <        pab[2] = pos[az] - pos[bz];
473 <
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          info->wrapVector( pab );
# Line 531 | Line 517 | void Integrator::constrainA(){
517            dy = rab[1] * gab;
518            dz = rab[2] * gab;
519  
520 <          pos[ax] += rma * dx;
521 <          pos[ay] += rma * dy;
522 <          pos[az] += rma * dz;
520 >          posA[0] += rma * dx;
521 >          posA[1] += rma * dy;
522 >          posA[2] += rma * dz;
523  
524 <          pos[bx] -= rmb * dx;
539 <          pos[by] -= rmb * dy;
540 <          pos[bz] -= rmb * dz;
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[ax] += rma * dx;
547 <          vel[ay] += rma * dy;
548 <          vel[az] += rma * dz;
536 >          atoms[a]->getVel( velA );
537  
538 <          vel[bx] -= rmb * dx;
539 <          vel[by] -= rmb * dy;
540 <          vel[bz] -= 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 582 | 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 rab[3];
587    int a, b, ax, ay, az, bx, by, bz;
# Line 617 | Line 617 | void Integrator::constrainB( void ){
617        bz = (b*3) + 2;
618  
619        if( moved[a] || moved[b] ){
620        
621        vxab = vel[ax] - vel[bx];
622        vyab = vel[ay] - vel[by];
623        vzab = vel[az] - vel[bz];
620  
621 <        rab[0] = pos[ax] - pos[bx];
622 <        rab[1] = pos[ay] - pos[by];
623 <        rab[2] = pos[az] - pos[bz];
624 <        
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();
# Line 640 | Line 645 | void Integrator::constrainB( void ){
645            dx = rab[0] * gab;
646            dy = rab[1] * gab;
647            dz = rab[2] * gab;
648 <          
649 <          vel[ax] += rma * dx;
650 <          vel[ay] += rma * dy;
651 <          vel[az] += rma * dz;
648 >        
649 >          velA[0] += rma * dx;
650 >          velA[1] += rma * dy;
651 >          velA[2] += rma * dz;
652  
653 <          vel[bx] -= rmb * dx;
654 <          vel[by] -= rmb * dy;
655 <          vel[bz] -= 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 663 | Line 672 | void Integrator::constrainB( void ){
672      
673      iteration++;
674    }
675 <
675 >  
676    if( !done ){
677  
678    
# Line 676 | Line 685 | void Integrator::constrainB( void ){
685  
686   }
687  
679
680
681
682
683
684
688   void Integrator::rotate( int axes1, int axes2, double angle, double ji[3],
689 <                         double A[9] ){
689 >                         double A[3][3] ){
690  
691    int i,j,k;
692    double sinAngle;
# Line 695 | Line 698 | void Integrator::rotate( int axes1, int axes2, double
698    double tempA[3][3];
699    double tempJ[3];
700  
698
701    // initialize the tempA
702  
703    for(i=0; i<3; i++){
704      for(j=0; j<3; j++){
705 <      tempA[j][i] = A[3*i+j];
705 >      tempA[j][i] = A[i][j];
706      }
707    }
708  
# Line 757 | Line 759 | void Integrator::rotate( int axes1, int axes2, double
759  
760    for(i=0; i<3; i++){
761      for(j=0; j<3; j++){
762 <      A[3*j+i] = 0.0;
762 >      A[j][i] = 0.0;
763        for(k=0; k<3; k++){
764 <        A[3*j+i] += tempA[i][k] * rot[j][k];
764 >        A[j][i] += tempA[i][k] * rot[j][k];
765        }
766      }
767    }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines