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 561 by mmeineke, Fri Jun 20 20:29:36 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 137 | Line 145 | void Integrator::checkConstraints( void ){
145        constrainedA[i] = temp_con[i].get_a();
146        constrainedB[i] = temp_con[i].get_b();
147        constrainedDsqr[i] = temp_con[i].get_dsqr();
148 +
149      }
150  
151      
# Line 225 | 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 256 | Line 268 | void Integrator::integrate( void ){
268  
269    }
270  
271 <  dumpOut->writeFinal();
271 >  dumpOut->writeFinal(currTime);
272  
273    delete dumpOut;
274    delete statOut;
# Line 292 | 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 327 | 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 370 | 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 402 | Line 445 | void Integrator::preMove( void ){
445  
446    if( nConstrained ){
447  
405 //    if( oldAtoms != nAtoms ){
406      
407 //       // save oldAtoms to check for lode balanceing later on.
408      
409 //       oldAtoms = nAtoms;
410      
411 //       delete[] moving;
412 //       delete[] moved;
413 //       delete[] oldPos;
414      
415 //       moving = new int[nAtoms];
416 //       moved  = new int[nAtoms];
417      
418 //       oldPos = new double[nAtoms*3];
419 //     }
420  
448      for(i=0; i<(nAtoms*3); i++) oldPos[i] = pos[i];
449    }
450   }  
# Line 426 | Line 453 | void Integrator::constrainA(){
453  
454    int i,j,k;
455    int done;
456 <  double pxab, pyab, pzab;
457 <  double rxab, ryab, rzab;
458 <  int a, b;
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;
461    double rpab;
# Line 437 | Line 464 | void Integrator::constrainA(){
464    double gab;
465    int iteration;
466  
440
441  
467    for( i=0; i<nAtoms; i++){
468      
469      moving[i] = 0;
470      moved[i]  = 1;
471    }
472 <  
448 <  
472 >
473    iteration = 0;
474    done = 0;
475    while( !done && (iteration < maxIteration )){
# Line 455 | Line 479 | void Integrator::constrainA(){
479  
480        a = constrainedA[i];
481        b = constrainedB[i];
482 <    
482 >      
483 >      ax = (a*3) + 0;
484 >      ay = (a*3) + 1;
485 >      az = (a*3) + 2;
486 >
487 >      bx = (b*3) + 0;
488 >      by = (b*3) + 1;
489 >      bz = (b*3) + 2;
490 >
491        if( moved[a] || moved[b] ){
492          
493 <        pxab = pos[3*a+0] - pos[3*b+0];
494 <        pyab = pos[3*a+1] - pos[3*b+1];
495 <        pzab = pos[3*a+2] - pos[3*b+2];
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)
471 <          * int( fabs(pzab) / info->box_z + 0.5);
472 <      
473 <        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[3*a+0] - oldPos[3*b+0];
509 <          ryab = oldPos[3*a+1] - oldPos[3*b+1];
510 <          rzab = oldPos[3*a+2] - oldPos[3*b+2];
482 <
483 <          rxab = rxab - info->box_x * copysign(1, rxab)
484 <            * int( fabs(rxab) / info->box_x + 0.5);
485 <          ryab = ryab - info->box_y * copysign(1, ryab)
486 <            * int( fabs(ryab) / info->box_y + 0.5);
487 <          rzab = rzab - info->box_z * copysign(1, rzab)
488 <            * int( fabs(rzab) / info->box_z + 0.5);
507 >        if (fabs(diffsq) > (tol*rabsq*2)) {
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 +
521   #ifdef IS_MPI
522              a = atoms[a]->getGlobalIndex();
523              b = atoms[b]->getGlobalIndex();
524   #endif //is_mpi
525              sprintf( painCave.errMsg,
526 <                     "Constraint failure in constrainA at atom %d and %d\n.",
526 >                     "Constraint failure in constrainA at atom %d and %d.\n",
527                       a, b );
528              painCave.isFatal = 1;
529              simError();
# 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 <          pos[3*a+0] += rma * dx;
538 <          pos[3*a+1] += rma * dy;
539 <          pos[3*a+2] += rma * dz;
537 >          dx = rab[0] * gab;
538 >          dy = rab[1] * gab;
539 >          dz = rab[2] * gab;
540  
541 <          pos[3*b+0] -= rmb * dx;
542 <          pos[3*b+1] -= rmb * dy;
543 <          pos[3*b+2] -= rmb * dz;
541 >          pos[ax] += rma * dx;
542 >          pos[ay] += rma * dy;
543 >          pos[az] += rma * dz;
544  
545 +          pos[bx] -= rmb * dx;
546 +          pos[by] -= rmb * dy;
547 +          pos[bz] -= rmb * dz;
548 +
549            dx = dx / dt;
550            dy = dy / dt;
551            dz = dz / dt;
552  
553 <          vel[3*a+0] += rma * dx;
554 <          vel[3*a+1] += rma * dy;
555 <          vel[3*a+2] += rma * dz;
553 >          vel[ax] += rma * dx;
554 >          vel[ay] += rma * dy;
555 >          vel[az] += rma * dz;
556  
557 <          vel[3*b+0] -= rmb * dx;
558 <          vel[3*b+1] -= rmb * dy;
559 <          vel[3*b+2] -= rmb * dz;
557 >          vel[bx] -= rmb * dx;
558 >          vel[by] -= rmb * dy;
559 >          vel[bz] -= rmb * dz;
560  
561            moving[a] = 1;
562            moving[b] = 1;
# Line 563 | Line 590 | void Integrator::constrainB( void ){
590    int i,j,k;
591    int done;
592    double vxab, vyab, vzab;
593 <  double rxab, ryab, rzab;
594 <  int a, b;
593 >  double rab[3];
594 >  int a, b, ax, ay, az, bx, by, bz;
595    double rma, rmb;
596    double dx, dy, dz;
597    double rabsq, pabsq, rvab;
# Line 581 | 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 = (a*3) + 0;
619 +      ay = (a*3) + 1;
620 +      az = (a*3) + 2;
621 +
622 +      bx = (b*3) + 0;
623 +      by = (b*3) + 1;
624 +      bz = (b*3) + 2;
625 +
626        if( moved[a] || moved[b] ){
627          
628 <        vxab = vel[3*a+0] - vel[3*b+0];
629 <        vyab = vel[3*a+1] - vel[3*b+1];
630 <        vzab = vel[3*a+2] - vel[3*b+2];
628 >        vxab = vel[ax] - vel[bx];
629 >        vyab = vel[ay] - vel[by];
630 >        vzab = vel[az] - vel[bz];
631  
632 <        rxab = pos[3*a+0] - pos[3*b+0];
633 <        ryab = pos[3*a+1] - pos[3*b+1];
634 <        rzab = pos[3*a+2] - pos[3*b+2];
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);
601 <        ryab = ryab - info->box_y * copysign(1, ryab)
602 <          * int( fabs(ryab) / info->box_y + 0.5);
603 <        rzab = rzab - info->box_z * copysign(1, rzab)
604 <          * int( fabs(rzab) / info->box_z + 0.5);
605 <
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[3*a+0] += rma * dx;
652 <          vel[3*a+1] += rma * dy;
653 <          vel[3*a+2] += rma * dz;
651 >          vel[ax] += rma * dx;
652 >          vel[ay] += rma * dy;
653 >          vel[az] += rma * dz;
654  
655 <          vel[3*b+0] -= rmb * dx;
656 <          vel[3*b+1] -= rmb * dy;
657 <          vel[3*b+2] -= rmb * dz;
655 >          vel[bx] -= rmb * dx;
656 >          vel[by] -= rmb * dy;
657 >          vel[bz] -= rmb * dz;
658            
659            moving[a] = 1;
660            moving[b] = 1;
# Line 658 | 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 674 | 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 731 | 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