--- trunk/OOPSE/libmdtools/Integrator.cpp 2004/04/20 16:56:40 1127 +++ trunk/OOPSE/libmdtools/Integrator.cpp 2004/06/04 03:15:31 1234 @@ -1,7 +1,7 @@ #include #include #include - +#include "Rattle.hpp" #ifdef IS_MPI #include "mpiSimulation.hpp" #include @@ -33,6 +33,16 @@ template Integrator::Integrator(SimInfo nAtoms = info->n_atoms; integrableObjects = info->integrableObjects; + rattle = new RattleFramework(info); + + if(rattle == NULL){ + sprintf(painCave.errMsg, + "Integrator::Intergrator() Error: Memory allocation error for RattleFramework" ); + painCave.isFatal = 1; + simError(); + } + +/* // check for constraints constrainedA = NULL; @@ -45,9 +55,13 @@ template Integrator::Integrator(SimInfo nConstrained = 0; checkConstraints(); +*/ } template Integrator::~Integrator(){ + if (rattle != NULL) + delete rattle; +/* if (nConstrained){ delete[] constrainedA; delete[] constrainedB; @@ -56,8 +70,10 @@ template Integrator::~Integrator(){ delete[] moved; delete[] oldPos; } +*/ } +/* template void Integrator::checkConstraints(void){ isConstrained = 0; @@ -150,8 +166,8 @@ template void Integrator::checkConstrai delete[] temp_con; } +*/ - template void Integrator::integrate(void){ double runTime = info->run_time; @@ -160,7 +176,7 @@ template void Integrator::integrate(voi double thermalTime = info->thermalTime; double resetTime = info->resetTime; - + double difference; double currSample; double currThermal; double currStatus; @@ -183,16 +199,20 @@ template void Integrator::integrate(voi // that was drifting tStats->removeCOMdrift(); + // initialize the retraints if necessary + if (info->useSolidThermInt && !info->useLiquidThermInt) { + myFF->initRestraints(); + } + // initialize the forces before the first step calcForce(1, 1); - - if (nConstrained){ - preMove(); - constrainA(); - calcForce(1, 1); - constrainB(); - } + + //execute constraint algorithm to make sure at the very beginning the system is constrained + rattle->doPreConstraint(); + rattle->doRattleA(); + calcForce(1, 1); + rattle->doRattleB(); if (info->setTemp){ thermalize(); @@ -215,7 +235,8 @@ template void Integrator::integrate(voi #endif // is_mpi while (info->getTime() < runTime && !stopIntegrator()){ - if ((info->getTime() + dt) >= currStatus){ + difference = info->getTime() + dt - currStatus; + if (difference > 0 || fabs(difference) < 1e-4 ){ calcPot = 1; calcStress = 1; } @@ -270,6 +291,11 @@ template void Integrator::integrate(voi #endif // is_mpi } + // dump out a file containing the omega values for the final configuration + if (info->useSolidThermInt && !info->useLiquidThermInt) + myFF->dumpzAngle(); + + delete dumpOut; delete statOut; } @@ -282,7 +308,8 @@ template void Integrator::integrateStep startProfile(pro3); #endif //profile - preMove(); + //save old state (position, velocity etc) + rattle->doPreConstraint(); #ifdef PROFILE endProfile(pro3); @@ -304,9 +331,7 @@ template void Integrator::integrateStep MPIcheckPoint(); #endif // is_mpi - // calc forces - calcForce(calcPot, calcStress); #ifdef IS_MPI @@ -341,6 +366,7 @@ template void Integrator::moveA(void){ double Tb[3], ji[3]; double vel[3], pos[3], frc[3]; double mass; + double omega; for (i = 0; i < integrableObjects.size() ; i++){ integrableObjects[i]->getVel(vel); @@ -379,9 +405,7 @@ template void Integrator::moveA(void){ } } - if (nConstrained){ - constrainA(); - } + rattle->doRattleA(); } @@ -422,11 +446,10 @@ template void Integrator::moveB(void){ } } - if (nConstrained){ - constrainB(); - } + rattle->doRattleB(); } +/* template void Integrator::preMove(void){ int i, j; double pos[3]; @@ -685,7 +708,7 @@ template void Integrator::constrainB(vo simError(); } } - +*/ template void Integrator::rotationPropagation ( StuntDouble* sd, double ji[3] ){ @@ -724,6 +747,7 @@ template void Integrator::rotationPropa // rotate about the z-axis angle = dt * ji[2] / I[2][2]; + sd->addZangle(angle); this->rotate( 0, 1, angle, ji, A); // rotate about the y-axis