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 572 by mmeineke, Wed Jul 2 21:26:55 2003 UTC vs.
Revision 600 by gezelter, Mon Jul 14 22:38:13 2003 UTC

# Line 27 | 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 72 | 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 82 | 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 171 | Line 179 | void Integrator::integrate( void ){
179  
180    int calcPot, calcStress;
181    int isError;
174
175
182  
183    tStats   = new Thermo( info );
184    statOut  = new StatWriter( info );
# Line 212 | Line 218 | void Integrator::integrate( void ){
218    MPIcheckPoint();
219   #endif // is_mpi
220  
215
216  pos  = Atom::getPosArray();
217  vel  = Atom::getVelArray();
218  frc  = Atom::getFrcArray();
219  trq  = Atom::getTrqArray();
220  Amat = Atom::getAmatArray();
221
221    while( currTime < runTime ){
222  
223      if( (currTime+dt) >= currStatus ){
# Line 226 | Line 225 | void Integrator::integrate( void ){
225        calcStress = 1;
226      }
227  
228 +    std::cerr << currTime << "\n";
229 +
230      integrateStep( calcPot, calcStress );
231        
232      currTime += dt;
# Line 287 | Line 288 | void Integrator::moveA( void ){
288  
289   void Integrator::moveA( void ){
290    
291 <  int i,j,k;
291 <  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++ ){
300  
301 +    atoms[i]->getVel( vel );
302 +    atoms[i]->getPos( pos );
303 +    atoms[i]->getFrc( frc );
304  
305 <  for( i=0; i<nAtoms; i++ ){
300 <    atomIndex = i * 3;
301 <    aMatIndex = i * 9;
305 >    mass = atoms[i]->getMass();
306  
307 <    // velocity half step
308 <    for( j=atomIndex; j<(atomIndex+3); j++ )
309 <      vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
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 <    // position whole step    
315 <    for( j=atomIndex; j<(atomIndex+3); j++ ) pos[j] += dt * vel[j];
316 <    
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();
317 <      Tb[1] = dAtom->getTy();
318 <      Tb[2] = dAtom->getTz();
319 <      
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        
324      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
325      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
326      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
327      
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;
362 <  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
371 <    for( j=atomIndex; j<(atomIndex+3); j++ )
372 <      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();
381 <      Tb[1] = dAtom->getTy();
382 <      Tb[2] = dAtom->getTz();
383 <      
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 complete the angular momentum
398 <      // half step
399 <      
400 <      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
401 <      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
402 <      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
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 <      dAtom->setJx( ji[0] );
405 <      dAtom->setJy( ji[1] );
395 <      dAtom->setJz( ji[2] );
404 >
405 >      dAtom->setJ( ji );
406      }
407    }
398
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 422 | Line 442 | void Integrator::constrainA(){
442    double gab;
443    int iteration;
444  
445 <
426 <  
427 <  for( i=0; i<nAtoms; i++){
428 <    
445 >  for( i=0; i<nAtoms; i++){    
446      moving[i] = 0;
447      moved[i]  = 1;
448    }
# Line 449 | 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 498 | 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;
506 <          pos[by] -= rmb * dy;
507 <          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;
514 <          vel[ay] += rma * dy;
515 <          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 549 | 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 584 | Line 617 | void Integrator::constrainB( void ){
617        bz = (b*3) + 2;
618  
619        if( moved[a] || moved[b] ){
587        
588        vxab = vel[ax] - vel[bx];
589        vyab = vel[ay] - vel[by];
590        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 607 | 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 630 | Line 672 | void Integrator::constrainB( void ){
672      
673      iteration++;
674    }
675 <
675 >  
676    if( !done ){
677  
678    
# Line 643 | Line 685 | void Integrator::constrainB( void ){
685  
686   }
687  
646
647
648
649
650
651
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 666 | Line 702 | void Integrator::rotate( int axes1, int axes2, double
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 723 | 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