bool NOX::Direction::SteepestDescent::compute(Abstract::Vector& dir, Abstract::Group& soln, const Solver::Generic& solver) { NOX::Abstract::Group::ReturnType status; // Compute F at current solution status = soln.computeF(); if (status != NOX::Abstract::Group::Ok) throwError("compute", "Unable to compute F"); // Compute Jacobian at current solution status = soln.computeJacobian(); if (status != NOX::Abstract::Group::Ok) throwError("compute", "Unable to compute Jacobian"); // Scale switch (scaleType) { case NOX::Direction::SteepestDescent::TwoNorm: meritFuncPtr->computeGradient(soln, dir); dir.scale(-1.0/dir.norm()); break; case NOX::Direction::SteepestDescent::FunctionTwoNorm: meritFuncPtr->computeGradient(soln, dir); dir.scale(-1.0/soln.getNormF()); break; case NOX::Direction::SteepestDescent::QuadMin: meritFuncPtr->computeQuadraticMinimizer(soln, dir); break; case NOX::Direction::SteepestDescent::None: meritFuncPtr->computeGradient(soln, dir); dir.scale( -1.0 ); break; default: throwError("compute", "Invalid scaleType"); } return true; }