double NOX::LineSearch::Utils::Slope:: computeSlope(const Abstract::Vector& dir, const Abstract::Group& grp) { if (grp.isGradient()) return(dir.innerProduct(grp.getGradient())); // Allocate space for vecPtr if necessary if (Teuchos::is_null(vecPtr)) vecPtr = dir.clone(ShapeCopy); // v = J * dir NOX::Abstract::Group::ReturnType status = grp.applyJacobian(dir,*vecPtr); if (status != NOX::Abstract::Group::Ok) { utils.out() << "NOX::LineSearch::Utils::Slope::computeSlope - Unable to apply Jacobian!" << std::endl; throw "NOX Error"; } // Check that F exists if (!grp.isF()) { utils.out() << "NOX::LineSearch::Utils::Slope::computeSlope - Invalid F" << std::endl; throw "NOX Error"; } // Return <v, F> = F' * J * dir = <J'F, dir> = <g, dir> return(vecPtr->innerProduct(grp.getF())); }
double NOX::MeritFunction::SumOfSquares:: computeSlopeWithoutJacobianTranspose(const Abstract::Vector& dir, const Abstract::Group& grp) const { // Allocate space for vecPtr if necessary if (Teuchos::is_null(tmpVecPtr)) tmpVecPtr = grp.getF().clone(NOX::ShapeCopy); // v = J * dir NOX::Abstract::Group::ReturnType status = grp.applyJacobian(dir,*tmpVecPtr); if (status != NOX::Abstract::Group::Ok) { utils->out() << "NOX::MeritFunction::SumOfSquares::computeSlopeWithoutJacobianTranspose - Unable to apply Jacobian!" << std::endl; throw "NOX Error"; } // Check that F exists if (!grp.isF()) { utils->out() << "NOX::MeritFunction::SumOfSquares::computeSlopeWithoutJacobianTranspose - Invalid F" << std::endl; throw "NOX Error"; } // Return <v, F> = F' * J * dir = <J'F, dir> = <g, dir> return(tmpVecPtr->innerProduct(grp.getF())); }