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 594 by mmeineke, Fri Jul 11 22:34:48 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 228 | Line 234 | void Integrator::integrate( void ){
234        calcStress = 1;
235      }
236  
237 +    std::cerr << "calcPot = " << calcPot << "; calcStress = "
238 +              << calcStress << "\n";
239 +
240      integrateStep( calcPot, calcStress );
241        
242      currTime += dt;
# Line 259 | Line 268 | void Integrator::integrate( void ){
268  
269    }
270  
271 <  dumpOut->writeFinal();
271 >  dumpOut->writeFinal(currTime);
272  
273    delete dumpOut;
274    delete statOut;
# Line 295 | Line 304 | void Integrator::moveA( void ){
304    double Tb[3];
305    double ji[3];
306    double angle;
307 +  double A[3][3];
308  
309 +
310    for( i=0; i<nAtoms; i++ ){
311      atomIndex = i * 3;
312      aMatIndex = i * 9;
313 <    
313 >
314      // velocity half step
315      for( j=atomIndex; j<(atomIndex+3); j++ )
316        vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
317  
318 +    std::cerr<< "MoveA vel[" << i << "] = "
319 +             << vel[atomIndex] << "\t"
320 +             << vel[atomIndex+1]<< "\t"
321 +             << vel[atomIndex+2]<< "\n";
322 +
323      // position whole step    
324 <    for( j=atomIndex; j<(atomIndex+3); j++ )
325 <      pos[j] += dt * vel[j];
324 >    for( j=atomIndex; j<(atomIndex+3); j++ ) pos[j] += dt * vel[j];
325 >    
326  
327 <  
327 >    std::cerr<< "MoveA pos[" << i << "] = "
328 >             << pos[atomIndex] << "\t"
329 >             << pos[atomIndex+1]<< "\t"
330 >             << pos[atomIndex+2]<< "\n";
331 >
332      if( atoms[i]->isDirectional() ){
333  
334        dAtom = (DirectionalAtom *)atoms[i];
# Line 330 | Line 350 | void Integrator::moveA( void ){
350        // use the angular velocities to propagate the rotation matrix a
351        // full time step
352        
353 +          // get the atom's rotation matrix
354 +          
355 +      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 +      
367        // rotate about the x-axis      
368        angle = dt2 * ji[0] / dAtom->getIxx();
369 <      this->rotate( 1, 2, angle, ji, &Amat[aMatIndex] );
369 >      this->rotate( 1, 2, angle, ji, A );
370        
371        // rotate about the y-axis
372        angle = dt2 * ji[1] / dAtom->getIyy();
373 <      this->rotate( 2, 0, angle, ji, &Amat[aMatIndex] );
373 >      this->rotate( 2, 0, angle, ji, A );
374        
375        // rotate about the z-axis
376        angle = dt * ji[2] / dAtom->getIzz();
377 <      this->rotate( 0, 1, angle, ji, &Amat[aMatIndex] );
377 >      this->rotate( 0, 1, angle, ji, A );
378        
379        // rotate about the y-axis
380        angle = dt2 * ji[1] / dAtom->getIyy();
381 <      this->rotate( 2, 0, angle, ji, &Amat[aMatIndex] );
381 >      this->rotate( 2, 0, angle, ji, A );
382        
383         // rotate about the x-axis
384        angle = dt2 * ji[0] / dAtom->getIxx();
385 <      this->rotate( 1, 2, angle, ji, &Amat[aMatIndex] );
385 >      this->rotate( 1, 2, angle, ji, A );
386        
387        dAtom->setJx( ji[0] );
388        dAtom->setJy( ji[1] );
# Line 373 | Line 407 | void Integrator::moveB( void ){
407      for( j=atomIndex; j<(atomIndex+3); j++ )
408        vel[j] += ( dt2 * frc[j] / atoms[i]->getMass() ) * eConvert;
409  
410 +    std::cerr<< "MoveB vel[" << i << "] = "
411 +             << vel[atomIndex] << "\t"
412 +             << vel[atomIndex+1]<< "\t"
413 +             << vel[atomIndex+2]<< "\n";
414 +
415 +
416      if( atoms[i]->isDirectional() ){
417        
418        dAtom = (DirectionalAtom *)atoms[i];
# Line 413 | Line 453 | void Integrator::constrainA(){
453  
454    int i,j,k;
455    int done;
456 <  double pxab, pyab, pzab;
457 <  double rxab, ryab, rzab;
456 >  double pab[3];
457 >  double rab[3];
458    int a, b, ax, ay, az, bx, by, bz;
459    double rma, rmb;
460    double dx, dy, dz;
# Line 424 | Line 464 | void Integrator::constrainA(){
464    double gab;
465    int iteration;
466  
427
428  
467    for( i=0; i<nAtoms; i++){
468      
469      moving[i] = 0;
470      moved[i]  = 1;
471    }
472 <  
435 <  
472 >
473    iteration = 0;
474    done = 0;
475    while( !done && (iteration < maxIteration )){
# Line 451 | Line 488 | void Integrator::constrainA(){
488        by = (b*3) + 1;
489        bz = (b*3) + 2;
490  
454
491        if( moved[a] || moved[b] ){
492          
493 <        pxab = pos[ax] - pos[bx];
494 <        pyab = pos[ay] - pos[by];
495 <        pzab = pos[az] - pos[bz];
493 >        pab[0] = pos[ax] - pos[bx];
494 >        pab[1] = pos[ay] - pos[by];
495 >        pab[2] = pos[az] - pos[bz];
496  
497 <        //periodic boundary condition
498 <        pxab = pxab - info->box_x * copysign(1, pxab)
499 <          * (int)( fabs(pxab / info->box_x) + 0.5);
500 <        pyab = pyab - info->box_y * copysign(1, pyab)
501 <          * (int)( fabs(pyab / info->box_y) + 0.5);
502 <        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;
497 >        //periodic boundary condition
498 >
499 >        info->wrapVector( pab );
500 >
501 >        pabsq = pab[0] * pab[0] + pab[1] * pab[1] + pab[2] * pab[2];
502 >
503          rabsq = constrainedDsqr[i];
504 <        diffsq = pabsq - rabsq;
504 >        diffsq = rabsq - pabsq;
505  
506          // the original rattle code from alan tidesley
507          if (fabs(diffsq) > (tol*rabsq*2)) {
508 <          rxab = oldPos[ax] - oldPos[bx];
509 <          ryab = oldPos[ay] - oldPos[by];
510 <          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);
508 >          rab[0] = oldPos[ax] - oldPos[bx];
509 >          rab[1] = oldPos[ay] - oldPos[by];
510 >          rab[2] = oldPos[az] - oldPos[bz];
511  
512 <          rpab = rxab * pxab + ryab * pyab + rzab * pzab;
512 >          info->wrapVector( rab );
513 >
514 >          rpab = rab[0] * pab[0] + rab[1] * pab[1] + rab[2] * pab[2];
515 >
516            rpabsq = rpab * rpab;
517  
518  
519            if (rpabsq < (rabsq * -diffsq)){
520  
492            cerr << "rpabsq = " << rpabsq << ", rabsq = " << rabsq
493                 << ", -diffsq = " << -diffsq << "\n";
494
521   #ifdef IS_MPI
522              a = atoms[a]->getGlobalIndex();
523              b = atoms[b]->getGlobalIndex();
# Line 505 | Line 531 | void Integrator::constrainA(){
531  
532            rma = 1.0 / atoms[a]->getMass();
533            rmb = 1.0 / atoms[b]->getMass();
534 <          
534 >
535            gab = diffsq / ( 2.0 * ( rma + rmb ) * rpab );
510          dx = rxab * gab;
511          dy = ryab * gab;
512          dz = rzab * gab;
536  
537 +          dx = rab[0] * gab;
538 +          dy = rab[1] * gab;
539 +          dz = rab[2] * gab;
540 +
541            pos[ax] += rma * dx;
542            pos[ay] += rma * dy;
543            pos[az] += rma * dz;
# Line 545 | Line 572 | void Integrator::constrainA(){
572      }
573  
574      iteration++;
548    cerr << "iterainA = " << iteration << "\n";
575    }
576  
577    if( !done ){
# Line 564 | Line 590 | void Integrator::constrainB( void ){
590    int i,j,k;
591    int done;
592    double vxab, vyab, vzab;
593 <  double rxab, ryab, rzab;
593 >  double rab[3];
594    int a, b, ax, ay, az, bx, by, bz;
595    double rma, rmb;
596    double dx, dy, dz;
# Line 582 | Line 608 | void Integrator::constrainB( void ){
608    iteration = 0;
609    while( !done && (iteration < maxIteration ) ){
610  
611 +    done = 1;
612 +
613      for(i=0; i<nConstrained; i++){
614        
615        a = constrainedA[i];
616        b = constrainedB[i];
617  
618 <      ax = 3*a +0;
619 <      ay = 3*a +1;
620 <      az = 3*a +2;
618 >      ax = (a*3) + 0;
619 >      ay = (a*3) + 1;
620 >      az = (a*3) + 2;
621  
622 <      bx = 3*b +0;
623 <      by = 3*b +1;
624 <      bz = 3*b +2;
622 >      bx = (b*3) + 0;
623 >      by = (b*3) + 1;
624 >      bz = (b*3) + 2;
625  
626        if( moved[a] || moved[b] ){
627          
# Line 601 | Line 629 | void Integrator::constrainB( void ){
629          vyab = vel[ay] - vel[by];
630          vzab = vel[az] - vel[bz];
631  
632 <        rxab = pos[ax] - pos[bx];
633 <        ryab = pos[ay] - pos[by];
634 <        rzab = pos[az] - pos[bz];
632 >        rab[0] = pos[ax] - pos[bx];
633 >        rab[1] = pos[ay] - pos[by];
634 >        rab[2] = pos[az] - pos[bz];
635          
636 <        rxab = rxab - info->box_x * copysign(1, rxab)
637 <          * (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);
614 <
636 >        info->wrapVector( rab );
637 >        
638          rma = 1.0 / atoms[a]->getMass();
639          rmb = 1.0 / atoms[b]->getMass();
640  
641 <        rvab = rxab * vxab + ryab * vyab + rzab * vzab;
641 >        rvab = rab[0] * vxab + rab[1] * vyab + rab[2] * vzab;
642            
643          gab = -rvab / ( ( rma + rmb ) * constrainedDsqr[i] );
644  
645          if (fabs(gab) > tol) {
646            
647 <          dx = rxab * gab;
648 <          dy = ryab * gab;
649 <          dz = rzab * gab;
647 >          dx = rab[0] * gab;
648 >          dy = rab[1] * gab;
649 >          dz = rab[2] * gab;
650            
651            vel[ax] += rma * dx;
652            vel[ay] += rma * dy;
# Line 667 | Line 690 | void Integrator::rotate( int axes1, int axes2, double
690  
691  
692   void Integrator::rotate( int axes1, int axes2, double angle, double ji[3],
693 <                         double A[9] ){
693 >                         double A[3][3] ){
694  
695    int i,j,k;
696    double sinAngle;
# Line 683 | Line 706 | void Integrator::rotate( int axes1, int axes2, double
706  
707    for(i=0; i<3; i++){
708      for(j=0; j<3; j++){
709 <      tempA[j][i] = A[3*i + j];
709 >      tempA[j][i] = A[i][j];
710      }
711    }
712  
# Line 740 | Line 763 | void Integrator::rotate( int axes1, int axes2, double
763  
764    for(i=0; i<3; i++){
765      for(j=0; j<3; j++){
766 <      A[3*j + i] = 0.0;
766 >      A[j][i] = 0.0;
767        for(k=0; k<3; k++){
768 <        A[3*j + i] += tempA[i][k] * rot[j][k];
768 >        A[j][i] += tempA[i][k] * rot[j][k];
769        }
770      }
771    }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines