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 594 by mmeineke, Fri Jul 11 22:34:48 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();
227  trq  = Atom::getTrqArray();
228  Amat = Atom::getAmatArray();
220  
221    while( currTime < runTime ){
222  
# Line 234 | Line 225 | void Integrator::integrate( void ){
225        calcStress = 1;
226      }
227  
228 <    std::cerr << "calcPot = " << calcPot << "; calcStress = "
238 <              << calcStress << "\n";
228 >    std::cerr << currTime << "\n";
229  
230      integrateStep( calcPot, calcStress );
231        
# Line 298 | Line 288 | void Integrator::moveA( void ){
288  
289   void Integrator::moveA( void ){
290    
291 <  int i,j,k;
302 <  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];
296 >  double vel[3], pos[3], frc[3];
297 >  double mass;
298  
309
299    for( i=0; i<nAtoms; i++ ){
300 <    atomIndex = i * 3;
301 <    aMatIndex = i * 9;
300 >
301 >    atoms[i]->getVel( vel );
302 >    atoms[i]->getPos( pos );
303 >    atoms[i]->getFrc( frc );
304  
305 <    // velocity half step
315 <    for( j=atomIndex; j<(atomIndex+3); j++ )
316 <      vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
305 >    mass = atoms[i]->getMass();
306  
307 <    std::cerr<< "MoveA vel[" << i << "] = "
308 <             << vel[atomIndex] << "\t"
309 <             << vel[atomIndex+1]<< "\t"
310 <             << vel[atomIndex+2]<< "\n";
311 <
312 <    // position whole step    
324 <    for( j=atomIndex; j<(atomIndex+3); j++ ) pos[j] += dt * vel[j];
325 <    
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 <    std::cerr<< "MoveA pos[" << i << "] = "
315 <             << pos[atomIndex] << "\t"
329 <             << pos[atomIndex+1]<< "\t"
330 <             << pos[atomIndex+2]<< "\n";
314 >    atoms[i]->setVel( vel );
315 >    atoms[i]->setPos( pos );
316  
317      if( atoms[i]->isDirectional() ){
318  
# Line 335 | Line 320 | void Integrator::moveA( void ){
320            
321        // get and convert the torque to body frame
322        
323 <      Tb[0] = dAtom->getTx();
339 <      Tb[1] = dAtom->getTy();
340 <      Tb[2] = dAtom->getTz();
341 <      
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        
346      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
347      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
348      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
349      
333        // use the angular velocities to propagate the rotation matrix a
334        // full time step
335 <      
336 <          // get the atom's rotation matrix
337 <          
338 <      A[0][0] = dAtom->getAxx();
356 <      A[0][1] = dAtom->getAxy();
357 <      A[0][2] = dAtom->getAxz();
358 <      
359 <      A[1][0] = dAtom->getAyx();
360 <      A[1][1] = dAtom->getAyy();
361 <      A[1][2] = dAtom->getAyz();
362 <      
363 <      A[2][0] = dAtom->getAzx();
364 <      A[2][1] = dAtom->getAzy();
365 <      A[2][2] = dAtom->getAzz();
366 <      
335 >
336 >      dAtom->getA(A);
337 >      dAtom->getI(I);
338 >    
339        // rotate about the x-axis      
340 <      angle = dt2 * ji[0] / dAtom->getIxx();
340 >      angle = dt2 * ji[0] / I[0][0];
341        this->rotate( 1, 2, angle, ji, A );
342 <      
342 >
343        // rotate about the y-axis
344 <      angle = dt2 * ji[1] / dAtom->getIyy();
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, A );
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();
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();
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;
398 <  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 +    mass = atoms[i]->getMass();
381 +
382      // velocity half step
383 <    for( j=atomIndex; j<(atomIndex+3); j++ )
384 <      vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
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  
390 <    std::cerr<< "MoveB vel[" << i << "] = "
411 <             << vel[atomIndex] << "\t"
412 <             << vel[atomIndex+1]<< "\t"
413 <             << vel[atomIndex+2]<< "\n";
390 >      dAtom = (DirectionalAtom *)atoms[i];
391  
392 +      // get and convert the torque to body frame      
393  
394 <    if( atoms[i]->isDirectional() ){
417 <      
418 <      dAtom = (DirectionalAtom *)atoms[i];
419 <      
420 <      // get and convert the torque to body frame
421 <      
422 <      Tb[0] = dAtom->getTx();
423 <      Tb[1] = dAtom->getTy();
424 <      Tb[2] = dAtom->getTz();
425 <      
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
430 <      
431 <      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
432 <      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
433 <      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
434 <      
435 <      dAtom->setJx( ji[0] );
436 <      dAtom->setJy( ji[1] );
437 <      dAtom->setJz( ji[2] );
404 >
405 >      dAtom->setJ( ji );
406      }
407    }
440
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 464 | Line 442 | void Integrator::constrainA(){
442    double gab;
443    int iteration;
444  
445 <  for( i=0; i<nAtoms; i++){
468 <    
445 >  for( i=0; i<nAtoms; i++){    
446      moving[i] = 0;
447      moved[i]  = 1;
448    }
# Line 489 | 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 538 | 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;
546 <          pos[by] -= rmb * dy;
547 <          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;
554 <          vel[ay] += rma * dy;
555 <          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 589 | 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 624 | Line 617 | void Integrator::constrainB( void ){
617        bz = (b*3) + 2;
618  
619        if( moved[a] || moved[b] ){
627        
628        vxab = vel[ax] - vel[bx];
629        vyab = vel[ay] - vel[by];
630        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 647 | 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 670 | Line 672 | void Integrator::constrainB( void ){
672      
673      iteration++;
674    }
675 <
675 >  
676    if( !done ){
677  
678    
# Line 683 | Line 685 | void Integrator::constrainB( void ){
685  
686   }
687  
686
687
688
689
690
691
688   void Integrator::rotate( int axes1, int axes2, double angle, double ji[3],
689                           double A[3][3] ){
690  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines