--- trunk/OOPSE/libmdtools/Integrator.cpp 2004/04/12 20:32:20 1097 +++ trunk/OOPSE/libmdtools/Integrator.cpp 2004/05/01 18:52:38 1144 @@ -179,12 +179,13 @@ template void Integrator::integrate(voi readyCheck(); + // remove center of mass drift velocity (in case we passed in a configuration + // that was drifting + tStats->removeCOMdrift(); + // initialize the forces before the first step calcForce(1, 1); - - //temp test - tStats->getPotential(); if (nConstrained){ preMove(); @@ -213,7 +214,7 @@ template void Integrator::integrate(voi MPIcheckPoint(); #endif // is_mpi - while (info->getTime() < runTime){ + while (info->getTime() < runTime && !stopIntegrator()){ if ((info->getTime() + dt) >= currStatus){ calcPot = 1; calcStress = 1; @@ -345,6 +346,8 @@ template void Integrator::moveA(void){ integrableObjects[i]->getVel(vel); integrableObjects[i]->getPos(pos); integrableObjects[i]->getFrc(frc); + + std::cerr << "i =\t" << i << "\t" << frc[0] << "\t" << frc[1]<< "\t" << frc[2] << "\n"; mass = integrableObjects[i]->getMass(); @@ -690,6 +693,7 @@ template void Integrator::rotationPropa double angle; double A[3][3], I[3][3]; + int i, j, k; // use the angular velocities to propagate the rotation matrix a // full time step @@ -697,26 +701,42 @@ template void Integrator::rotationPropa sd->getA(A); sd->getI(I); - // rotate about the x-axis - angle = dt2 * ji[0] / I[0][0]; - this->rotate( 1, 2, angle, ji, A ); + if (sd->isLinear()) { + i = sd->linearAxis(); + j = (i+1)%3; + k = (i+2)%3; + + angle = dt2 * ji[j] / I[j][j]; + this->rotate( k, i, angle, ji, A ); - // rotate about the y-axis - angle = dt2 * ji[1] / I[1][1]; - this->rotate( 2, 0, angle, ji, A ); + angle = dt * ji[k] / I[k][k]; + this->rotate( i, j, angle, ji, A); - // rotate about the z-axis - angle = dt * ji[2] / I[2][2]; - this->rotate( 0, 1, angle, ji, A); + angle = dt2 * ji[j] / I[j][j]; + this->rotate( k, i, angle, ji, A ); - // rotate about the y-axis - angle = dt2 * ji[1] / I[1][1]; - this->rotate( 2, 0, angle, ji, A ); - - // rotate about the x-axis - angle = dt2 * ji[0] / I[0][0]; - this->rotate( 1, 2, angle, ji, A ); - + } else { + // rotate about the x-axis + angle = dt2 * ji[0] / I[0][0]; + this->rotate( 1, 2, angle, ji, A ); + + // rotate about the y-axis + angle = dt2 * ji[1] / I[1][1]; + this->rotate( 2, 0, angle, ji, A ); + + // rotate about the z-axis + angle = dt * ji[2] / I[2][2]; + this->rotate( 0, 1, angle, ji, A); + + // rotate about the y-axis + angle = dt2 * ji[1] / I[1][1]; + this->rotate( 2, 0, angle, ji, A ); + + // rotate about the x-axis + angle = dt2 * ji[0] / I[0][0]; + this->rotate( 1, 2, angle, ji, A ); + + } sd->setA( A ); }