double NOX::StatusTest::NormF::computeNorm(const NOX::Abstract::Group& grp) { if (!grp.isF()) return -1.0; double norm; int n = grp.getX().length(); switch (normType) { case NOX::Abstract::Vector::TwoNorm: norm = grp.getNormF(); if (scaleType == Scaled) norm /= sqrt(1.0 * n); break; default: norm = grp.getF().norm(normType); if (scaleType == Scaled) norm /= n; break; } return norm; }
void NOX::MeritFunction::SumOfSquares:: computeGradient(const NOX::Abstract::Group& grp, NOX::Abstract::Vector& result) const { if ( !(grp.isF()) ) { utils->err() << "ERROR: NOX::MeritFunction::SumOfSquares::computeGradient() - " << "F has not been computed yet!. Please call " << "computeF() on the group passed into this function." << std::endl; throw "NOX Error"; } if ( !(grp.isJacobian()) ) { utils->err() << "ERROR: NOX::MeritFunction::SumOfSquares::computeGradient() - " << "Jacobian has not been computed yet!. Please call " << "computeJacobian() on the group passed into this function." << std::endl; throw "NOX Error"; } NOX::Abstract::Group::ReturnType status = grp.applyJacobianTranspose(grp.getF(), result); if (status != NOX::Abstract::Group::Ok) { utils->err() << "ERROR: NOX::MeritFunction::SumOfSquares::compute" << "Gradient - applyJacobianTranspose failed!" << std::endl; throw "NOX Error"; } return; }
double NOX::MeritFunction::SumOfSquares:: computef(const NOX::Abstract::Group& grp) const { if ( !(grp.isF()) ) { utils->err() << "ERROR: NOX::MeritFunction::SumOfSquares::computef() - " << "F has not been computed yet!. Please call " << "computeF() on the group passed into this function." << std::endl; throw "NOX Error"; } return (0.5 * grp.getNormF() * grp.getNormF()); }
void NOX::MeritFunction::SumOfSquares:: computeQuadraticMinimizer(const NOX::Abstract::Group& grp, NOX::Abstract::Vector& result) const { // Clone a temporary vector if (Teuchos::is_null(tmpVecPtr)) tmpVecPtr = grp.getF().clone(NOX::ShapeCopy); // Make sure the function and Jacobian have been evaluated if ( !(grp.isF()) ) { utils->err() << "ERROR: NOX::MeritFunction::SumOfSquares::" << "computeQuadraticMinimizer() - " << "F has not been computed yet!. Please call " << "computeF() on the group passed into this function." << std::endl; throw "NOX Error"; } if ( !(grp.isJacobian()) ) { utils->err() << "ERROR: NOX::MeritFunction::SumOfSquares::" << "computeQuadraticMinimizer() - " << "Jacobian has not been computed yet!. Please call " << "computeJacobian() on the group passed into this function." << std::endl; throw "NOX Error"; } // Compute the steepest descent direction = J^T F this->computeGradient(grp, result); // Compute = J (J^T F) NOX::Abstract::Group::ReturnType status = grp.applyJacobian(result, *tmpVecPtr); if (status != NOX::Abstract::Group::Ok) { utils->err() << "ERROR: NOX::MeritFunction::SumOfSquares::" << "computeQuadraticMinimizer() - grp->applyJacobian() has failed!" << std::endl; throw "NOX Error"; } result.scale( -1.0 * result.innerProduct(result) / tmpVecPtr->innerProduct(*tmpVecPtr) ); }