--- trunk/OOPSE/libmdtools/OOPSEMinimizer.cpp 2004/02/24 15:44:45 1064 +++ trunk/OOPSE/libmdtools/OOPSEMinimizer.cpp 2004/04/12 20:32:20 1097 @@ -5,8 +5,6 @@ OOPSEMinimizer::OOPSEMinimizer( SimInfo *theInfo, Forc MinimizerParameterSet * param) :RealIntegrator(theInfo, the_ff), bVerbose(false), bShake(true){ - atoms = info->atoms; - tStats = new Thermo(info); dumpOut = new DumpWriter(info); statOut = new StatWriter(info); @@ -18,6 +16,7 @@ OOPSEMinimizer::OOPSEMinimizer( SimInfo *theInfo, Forc curX = getCoor(); curG.resize(ndim); + preMove(); } OOPSEMinimizer::~OOPSEMinimizer(){ @@ -53,12 +52,12 @@ void OOPSEMinimizer::calcEnergyGradient(vector index = 0; - for(int i = 0; i < nAtoms; i++){ + for(int i = 0; i < integrableObjects.size(); i++){ - if(atoms[i]->isDirectional()){ - dAtom = (DirectionalAtom*) atoms[i]; - dAtom->getGrad(dAtomGrad); + if (integrableObjects[i]->isDirectional()) { + integrableObjects[i]->getGrad(dAtomGrad); + //gradient is equal to -f grad[index++] = -dAtomGrad[0]; grad[index++] = -dAtomGrad[1]; @@ -69,7 +68,7 @@ void OOPSEMinimizer::calcEnergyGradient(vector } else{ - atoms[i]->getFrc(force); + integrableObjects[i]->getFrc(force); grad[index++] = -force[0]; grad[index++] = -force[1]; @@ -98,22 +97,23 @@ void OOPSEMinimizer::setCoor(vector& x){ index = 0; - for(int i = 0; i < nAtoms; i++){ + for(int i = 0; i < integrableObjects.size(); i++){ position[0] = x[index++]; position[1] = x[index++]; position[2] = x[index++]; - atoms[i]->setPos(position); + integrableObjects[i]->setPos(position); - if (atoms[i]->isDirectional()){ - dAtom = (DirectionalAtom*) atoms[i]; + if (integrableObjects[i]->isDirectional()){ eulerAngle[0] = x[index++]; eulerAngle[1] = x[index++]; eulerAngle[2] = x[index++]; - dAtom->setEuler(eulerAngle[0], eulerAngle[1], eulerAngle[2]); + integrableObjects[i]->setEuler(eulerAngle[0], + eulerAngle[1], + eulerAngle[2]); } @@ -136,17 +136,17 @@ vector OOPSEMinimizer::getCoor(){ index = 0; - for(int i = 0; i < nAtoms; i++){ - atoms[i]->getPos(position); + for(int i = 0; i < integrableObjects.size(); i++){ + integrableObjects[i]->getPos(position); x[index++] = position[0]; x[index++] = position[1]; x[index++] = position[2]; - if (atoms[i]->isDirectional()){ - dAtom = (DirectionalAtom*) atoms[i]; - dAtom->getEulerAngles(eulerAngle); + if (integrableObjects[i]->isDirectional()){ + integrableObjects[i]->getEulerAngles(eulerAngle); + x[index++] = eulerAngle[0]; x[index++] = eulerAngle[1]; x[index++] = eulerAngle[2]; @@ -424,9 +424,9 @@ void OOPSEMinimizer::calcDim(){ ndim = 0; - for(int i = 0; i < nAtoms; i++){ + for(int i = 0; i < integrableObjects.size(); i++){ ndim += 3; - if (atoms[i]->isDirectional()) + if (integrableObjects[i]->isDirectional()) ndim += 3; } } @@ -517,6 +517,7 @@ int OOPSEMinimizer::doLineSearch(vector& direc double mu; double eta; double ftol; + double lsTol; xa.resize(ndim); xb.resize(ndim); @@ -532,6 +533,7 @@ int OOPSEMinimizer::doLineSearch(vector& direc ga = curG; c = a + stepSize; ftol = paramSet->getFTol(); + lsTol = paramSet->getLineSearchTol(); //calculate the derivative at a = 0 for (size_t i = 0; i < ndim; i++) @@ -598,6 +600,12 @@ int OOPSEMinimizer::doLineSearch(vector& direc eta = 3 *(fa -fc) /(c - a) + slopeA + slopeC; mu = sqrt(eta * eta - slopeA * slopeC); b = a + (c - a) * (1 - (slopeC + mu - eta) /(slopeC - slopeA + 2 * mu)); + + if (b < lsTol){ + if (bVerbose) + cout << "stepSize is less than line search tolerance" << endl; + break; + } //} // Take a trial step to this new point - new coords in xb