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 567 by mmeineke, Wed Jun 25 21:12:14 2003 UTC

# Line 138 | Line 138 | void Integrator::checkConstraints( void ){
138        constrainedB[i] = temp_con[i].get_b();
139        constrainedDsqr[i] = temp_con[i].get_dsqr();
140  
141      cerr << "constraint " << constrainedA[i] << " <-> " << constrainedB[i]
142           << " => " << constrainedDsqr[i] << "\n";
141      }
142  
143      
# Line 296 | Line 294 | void Integrator::moveA( void ){
294    double ji[3];
295    double angle;
296  
297 +
298 +
299    for( i=0; i<nAtoms; i++ ){
300      atomIndex = i * 3;
301      aMatIndex = i * 9;
302 <    
302 >
303      // velocity half step
304      for( j=atomIndex; j<(atomIndex+3); j++ )
305        vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
306  
307      // position whole step    
308 <    for( j=atomIndex; j<(atomIndex+3); j++ )
309 <      pos[j] += dt * vel[j];
310 <
311 <  
308 >    for( j=atomIndex; j<(atomIndex+3); j++ ) pos[j] += dt * vel[j];
309 >    
310      if( atoms[i]->isDirectional() ){
311  
312        dAtom = (DirectionalAtom *)atoms[i];
# Line 431 | Line 429 | void Integrator::constrainA(){
429      moving[i] = 0;
430      moved[i]  = 1;
431    }
432 <  
435 <  
432 >
433    iteration = 0;
434    done = 0;
435    while( !done && (iteration < maxIteration )){
# Line 451 | Line 448 | void Integrator::constrainA(){
448        by = (b*3) + 1;
449        bz = (b*3) + 2;
450  
454
451        if( moved[a] || moved[b] ){
452          
453          pxab = pos[ax] - pos[bx];
454          pyab = pos[ay] - pos[by];
455          pzab = pos[az] - pos[bz];
456  
457 <        //periodic boundary condition
457 >        //periodic boundary condition
458          pxab = pxab - info->box_x * copysign(1, pxab)
459            * (int)( fabs(pxab / info->box_x) + 0.5);
460          pyab = pyab - info->box_y * copysign(1, pyab)
461            * (int)( fabs(pyab / info->box_y) + 0.5);
462          pzab = pzab - info->box_z * copysign(1, pzab)
463            * (int)( fabs(pzab / info->box_z) + 0.5);
464 <      
465 <        pabsq = pxab * pxab + pyab * pyab + pzab * pzab;
464 >
465 >        pabsq = pxab * pxab + pyab * pyab + pzab * pzab;
466 >
467          rabsq = constrainedDsqr[i];
468 <        diffsq = pabsq - rabsq;
468 >        diffsq = rabsq - pabsq;
469  
470          // the original rattle code from alan tidesley
471          if (fabs(diffsq) > (tol*rabsq*2)) {
472            rxab = oldPos[ax] - oldPos[bx];
473            ryab = oldPos[ay] - oldPos[by];
474            rzab = oldPos[az] - oldPos[bz];
475 <
475 >
476            rxab = rxab - info->box_x * copysign(1, rxab)
477              * (int)( fabs(rxab / info->box_x) + 0.5);
478            ryab = ryab - info->box_y * copysign(1, ryab)
# Line 484 | Line 481 | void Integrator::constrainA(){
481              * (int)( fabs(rzab / info->box_z) + 0.5);
482  
483            rpab = rxab * pxab + ryab * pyab + rzab * pzab;
484 +
485            rpabsq = rpab * rpab;
486  
487  
488            if (rpabsq < (rabsq * -diffsq)){
489  
492            cerr << "rpabsq = " << rpabsq << ", rabsq = " << rabsq
493                 << ", -diffsq = " << -diffsq << "\n";
494
490   #ifdef IS_MPI
491              a = atoms[a]->getGlobalIndex();
492              b = atoms[b]->getGlobalIndex();
# Line 505 | Line 500 | void Integrator::constrainA(){
500  
501            rma = 1.0 / atoms[a]->getMass();
502            rmb = 1.0 / atoms[b]->getMass();
503 <          
503 >
504            gab = diffsq / ( 2.0 * ( rma + rmb ) * rpab );
505 +
506            dx = rxab * gab;
507            dy = ryab * gab;
508            dz = rzab * gab;
# Line 545 | Line 541 | void Integrator::constrainA(){
541      }
542  
543      iteration++;
548    cerr << "iterainA = " << iteration << "\n";
544    }
545  
546    if( !done ){
# Line 582 | Line 577 | void Integrator::constrainB( void ){
577    iteration = 0;
578    while( !done && (iteration < maxIteration ) ){
579  
580 +    done = 1;
581 +
582      for(i=0; i<nConstrained; i++){
583        
584        a = constrainedA[i];
585        b = constrainedB[i];
586  
587 <      ax = 3*a +0;
588 <      ay = 3*a +1;
589 <      az = 3*a +2;
587 >      ax = (a*3) + 0;
588 >      ay = (a*3) + 1;
589 >      az = (a*3) + 2;
590  
591 <      bx = 3*b +0;
592 <      by = 3*b +1;
593 <      bz = 3*b +2;
591 >      bx = (b*3) + 0;
592 >      by = (b*3) + 1;
593 >      bz = (b*3) + 2;
594  
595        if( moved[a] || moved[b] ){
596          
# Line 605 | Line 602 | void Integrator::constrainB( void ){
602          ryab = pos[ay] - pos[by];
603          rzab = pos[az] - pos[bz];
604          
605 +
606          rxab = rxab - info->box_x * copysign(1, rxab)
607            * (int)( fabs(rxab / info->box_x) + 0.5);
608          ryab = ryab - info->box_y * copysign(1, ryab)
609            * (int)( fabs(ryab / info->box_y) + 0.5);
610          rzab = rzab - info->box_z * copysign(1, rzab)
611            * (int)( fabs(rzab / info->box_z) + 0.5);
612 <
612 >        
613          rma = 1.0 / atoms[a]->getMass();
614          rmb = 1.0 / atoms[b]->getMass();
615  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines