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 563 by mmeineke, Mon Jun 23 21:24:03 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 138 | Line 146 | void Integrator::checkConstraints( void ){
146        constrainedB[i] = temp_con[i].get_b();
147        constrainedDsqr[i] = temp_con[i].get_dsqr();
148  
141      cerr << "constraint " << constrainedA[i] << " <-> " << constrainedB[i]
142           << " => " << constrainedDsqr[i] << "\n";
149      }
150  
151      
# Line 174 | Line 180 | void Integrator::integrate( void ){
180    int calcPot, calcStress;
181    int isError;
182  
177
178
183    tStats   = new Thermo( info );
184    statOut  = new StatWriter( info );
185    dumpOut  = new DumpWriter( info );
# Line 213 | Line 217 | void Integrator::integrate( void ){
217            "The integrator is ready to go." );
218    MPIcheckPoint();
219   #endif // is_mpi
216
217
218  pos  = Atom::getPosArray();
219  vel  = Atom::getVelArray();
220  frc  = Atom::getFrcArray();
221  trq  = Atom::getTrqArray();
222  Amat = Atom::getAmatArray();
220  
221    while( currTime < runTime ){
222  
# Line 228 | 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 259 | Line 258 | void Integrator::integrate( void ){
258  
259    }
260  
261 <  dumpOut->writeFinal();
261 >  dumpOut->writeFinal(currTime);
262  
263    delete dumpOut;
264    delete statOut;
# 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++ ){
300    atomIndex = i * 3;
301    aMatIndex = i * 9;
302    
303    // velocity half step
304    for( j=atomIndex; j<(atomIndex+3); j++ )
305      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();
319 <      Tb[1] = dAtom->getTy();
320 <      Tb[2] = dAtom->getTz();
321 <      
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        
326      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
327      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
328      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
329      
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;
364 <  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
373 <    for( j=atomIndex; j<(atomIndex+3); j++ )
374 <      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();
383 <      Tb[1] = dAtom->getTy();
384 <      Tb[2] = dAtom->getTz();
385 <      
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
390 <      
391 <      ji[0] = dAtom->getJx() + ( dt2 * Tb[0] ) * eConvert;
392 <      ji[1] = dAtom->getJy() + ( dt2 * Tb[1] ) * eConvert;
393 <      ji[2] = dAtom->getJz() + ( dt2 * Tb[2] ) * eConvert;
394 <      
395 <      dAtom->setJx( ji[0] );
396 <      dAtom->setJy( ji[1] );
397 <      dAtom->setJz( ji[2] );
404 >
405 >      dAtom->setJ( ji );
406      }
407    }
400
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 pxab, pyab, pzab;
433 <  double rxab, ryab, rzab;
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;
# Line 424 | Line 442 | void Integrator::constrainA(){
442    double gab;
443    int iteration;
444  
445 <
428 <  
429 <  for( i=0; i<nAtoms; i++){
430 <    
445 >  for( i=0; i<nAtoms; i++){    
446      moving[i] = 0;
447      moved[i]  = 1;
448    }
449 <  
435 <  
449 >
450    iteration = 0;
451    done = 0;
452    while( !done && (iteration < maxIteration )){
# Line 451 | Line 465 | void Integrator::constrainA(){
465        by = (b*3) + 1;
466        bz = (b*3) + 2;
467  
454
468        if( moved[a] || moved[b] ){
469 <        
470 <        pxab = pos[ax] - pos[bx];
471 <        pyab = pos[ay] - pos[by];
472 <        pzab = pos[az] - pos[bz];
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
479 <        pxab = pxab - info->box_x * copysign(1, pxab)
480 <          * (int)( fabs(pxab / info->box_x) + 0.5);
481 <        pyab = pyab - info->box_y * copysign(1, pyab)
465 <          * (int)( fabs(pyab / info->box_y) + 0.5);
466 <        pzab = pzab - info->box_z * copysign(1, pzab)
467 <          * (int)( fabs(pzab / info->box_z) + 0.5);
468 <      
469 <        pabsq = pxab * pxab + pyab * pyab + pzab * pzab;
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 = pabsq - rabsq;
483 >        diffsq = rabsq - pabsq;
484  
485          // the original rattle code from alan tidesley
486          if (fabs(diffsq) > (tol*rabsq*2)) {
487 <          rxab = oldPos[ax] - oldPos[bx];
488 <          ryab = oldPos[ay] - oldPos[by];
489 <          rzab = oldPos[az] - oldPos[bz];
478 <
479 <          rxab = rxab - info->box_x * copysign(1, rxab)
480 <            * (int)( fabs(rxab / info->box_x) + 0.5);
481 <          ryab = ryab - info->box_y * copysign(1, ryab)
482 <            * (int)( fabs(ryab / info->box_y) + 0.5);
483 <          rzab = rzab - info->box_z * copysign(1, rzab)
484 <            * (int)( fabs(rzab / info->box_z) + 0.5);
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  
492            cerr << "rpabsq = " << rpabsq << ", rabsq = " << rabsq
493                 << ", -diffsq = " << -diffsq << "\n";
494
500   #ifdef IS_MPI
501              a = atoms[a]->getGlobalIndex();
502              b = atoms[b]->getGlobalIndex();
# Line 505 | 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 );
510          dx = rxab * gab;
511          dy = ryab * gab;
512          dz = rzab * gab;
515  
516 <          pos[ax] += rma * dx;
517 <          pos[ay] += rma * dy;
518 <          pos[az] += rma * dz;
516 >          dx = rab[0] * gab;
517 >          dy = rab[1] * gab;
518 >          dz = rab[2] * gab;
519  
520 <          pos[bx] -= rmb * dx;
521 <          pos[by] -= rmb * dy;
522 <          pos[bz] -= 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[ax] += rma * dx;
527 <          vel[ay] += rma * dy;
528 <          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 545 | Line 563 | void Integrator::constrainA(){
563      }
564  
565      iteration++;
548    cerr << "iterainA = " << iteration << "\n";
566    }
567  
568    if( !done ){
# Line 563 | 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;
586 >  double rab[3];
587    int a, b, ax, ay, az, bx, by, bz;
588    double rma, rmb;
589    double dx, dy, dz;
# Line 581 | Line 600 | void Integrator::constrainB( void ){
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 = 3*a +0;
612 <      ay = 3*a +1;
613 <      az = 3*a +2;
611 >      ax = (a*3) + 0;
612 >      ay = (a*3) + 1;
613 >      az = (a*3) + 2;
614  
615 <      bx = 3*b +0;
616 <      by = 3*b +1;
617 <      bz = 3*b +2;
615 >      bx = (b*3) + 0;
616 >      by = (b*3) + 1;
617 >      bz = (b*3) + 2;
618  
619        if( moved[a] || moved[b] ){
599        
600        vxab = vel[ax] - vel[bx];
601        vyab = vel[ay] - vel[by];
602        vzab = vel[az] - vel[bz];
620  
621 <        rxab = pos[ax] - pos[bx];
622 <        ryab = pos[ay] - pos[by];
623 <        rzab = pos[az] - pos[bz];
624 <        
625 <        rxab = rxab - info->box_x * copysign(1, rxab)
626 <          * (int)( fabs(rxab / info->box_x) + 0.5);
610 <        ryab = ryab - info->box_y * copysign(1, ryab)
611 <          * (int)( fabs(ryab / info->box_y) + 0.5);
612 <        rzab = rzab - info->box_z * copysign(1, rzab)
613 <          * (int)( fabs(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 ) * constrainedDsqr[i] );
642  
643          if (fabs(gab) > tol) {
644            
645 <          dx = rxab * gab;
646 <          dy = ryab * gab;
647 <          dz = rzab * gab;
648 <          
649 <          vel[ax] += rma * dx;
650 <          vel[ay] += rma * dy;
651 <          vel[az] += 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[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 647 | Line 672 | void Integrator::constrainB( void ){
672      
673      iteration++;
674    }
675 <
675 >  
676    if( !done ){
677  
678    
# Line 660 | Line 685 | void Integrator::constrainB( void ){
685  
686   }
687  
663
664
665
666
667
668
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 683 | 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 740 | 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