void LOCA::MultiPredictor::AbstractStrategy::setPredictorOrientation( bool baseOnSecant, const vector<double>& stepSize, const LOCA::MultiContinuation::ExtendedGroup& grp, const LOCA::MultiContinuation::ExtendedVector& prevXVec, const LOCA::MultiContinuation::ExtendedVector& xVec, LOCA::MultiContinuation::ExtendedVector& secant, LOCA::MultiContinuation::ExtendedMultiVector& tangent) { // If orientation is not based on a secant vector (i.e., first or last // steps in a continuation run) make parameter component of predictor // positive if (!baseOnSecant) { for (int i=0; i<tangent.numVectors(); i++) if (tangent.getScalar(i,i) < 0.0) tangent[i].scale(-1.0); return; } // compute secant secant.update(1.0, xVec, -1.0, prevXVec, 0.0); for (int i=0; i<tangent.numVectors(); i++) if (grp.computeScaledDotProduct(secant, tangent[i])*stepSize[i] < 0.0) tangent[i].scale(-1.0); }
double LOCA::MultiContinuation::ConstrainedGroup::getNormNewtonSolveResidual() const { std::string callingFunction = "LOCA::MultiContinuation::ConstrainedGroup::getNormNewtonSolveResidual()"; NOX::Abstract::Group::ReturnType finalStatus; LOCA::MultiContinuation::ExtendedVector residual = *fVec; finalStatus = applyJacobian(*newtonVec, residual); globalData->locaErrorCheck->checkReturnType(finalStatus, callingFunction); residual = residual.update(1.0, *fVec, 1.0); return residual.norm(); }