49 #include <Xyce_config.h>
54 #include "NOX_Abstract_Vector.H"
55 #include "NOX_Abstract_Group.H"
56 #include "NOX_Common.H"
57 #include "NOX_GlobalData.H"
58 #include "Teuchos_ParameterList.hpp"
59 #include "NOX_Utils.H"
60 #include "NOX_StatusTest_FiniteValue.H"
62 #include "N_ERH_ErrorMgr.h"
64 #include "NOX_Direction_Factory.H"
65 #include "NOX_LineSearch_Factory.H"
66 #include "NOX_Solver_SolverUtils.H"
74 const Teuchos::RCP<NOX::Abstract::Group>& xGrp,
75 const Teuchos::RCP<NOX::StatusTest::Generic>& t,
76 const Teuchos::RCP<Teuchos::ParameterList>& p,
77 double initialStepSize,
80 globalData(Teuchos::rcp(new
NOX::GlobalData(p))),
81 augmentLSStrategy(als),
83 oldSolnPtr(xGrp->clone(
NOX::DeepCopy)),
85 dirPtr(xGrp->getX().clone(
NOX::ShapeCopy)),
89 utils(*(globalData->getUtils())),
90 lineSearch(
NOX::LineSearch::buildLineSearch(globalData, paramsPtr->sublist(
"Line Search"))),
91 direction(
NOX::
Direction::buildDirection(globalData, paramsPtr->sublist(
"Direction"))),
92 prePostOperator(globalData->getUtils(), paramsPtr->sublist(
"Solver Options")),
93 initialStepSize_(initialStepSize),
94 minStepSize_(minStepSize),
95 maxStepSize_(maxStepSize),
96 stepSize_(initialStepSize),
97 previousStepSize_(0.0),
111 status = NOX::StatusTest::Unconverged;
114 if (
utils.isPrintType(NOX::Utils::Parameters))
116 utils.out() <<
"\n" << NOX::Utils::fill(72) <<
"\n";
117 utils.out() <<
"\n-- Parameters Passed to Nonlinear Solver --\n\n";
121 checkType = NOX::Solver::parseStatusTestCheckType(
paramsPtr->sublist(
"Solver Options"));
125 reset(
const NOX::Abstract::Vector& initial_guess)
132 reset(
const NOX::Abstract::Vector& initial_guess,
133 const Teuchos::RCP<NOX::StatusTest::Generic>& t)
158 NOX::Abstract::Group::ReturnType rtype =
solnPtr->computeF();
159 if (rtype != NOX::Abstract::Group::Ok) {
160 dout() <<
"NOX::Solver::PseudoTransientBased::step - Unable to compute F" << std::endl;
166 if ((
status == NOX::StatusTest::Converged) &&
167 (
utils.isPrintType(NOX::Utils::Warning))) {
168 utils.out() <<
"Warning: NOX::Solver::PseudoTransientBased::step() - The solution passed "
169 <<
"into the solver (either through constructor or reset method) "
170 <<
"is already converged! The solver will not "
171 <<
"attempt to solve this system since status is flagged as "
172 <<
"converged." << std::endl;
176 if (
utils.isPrintType(NOX::Utils::Parameters)) {
177 utils.out() <<
"\n-- Status Tests Passed to Nonlinear Solver --\n\n";
179 utils.out() <<
"\n" << NOX::Utils::fill(72) <<
"\n";
182 if (
status != NOX::StatusTest::Unconverged) {
213 if (
status != NOX::StatusTest::Unconverged) {
219 NOX::Abstract::Group& soln = *
solnPtr;
220 NOX::StatusTest::Generic& test = *
testPtr;
227 dout() <<
"PseudoTransientBased::iterate - unable to calculate direction" << std::endl;
228 status = NOX::StatusTest::Failed;
245 dout() <<
"PseudoTransientBased::iterate - line search failed" << std::endl;
246 status = NOX::StatusTest::Failed;
250 else if (
utils.isPrintType(NOX::Utils::Warning))
251 utils.out() <<
"PseudoTransientBased::iterate - using recovery step for line search" << std::endl;
255 NOX::Abstract::Group::ReturnType rtype = soln.computeF();
256 if (rtype != NOX::Abstract::Group::Ok)
258 utils.out() <<
"PseudoTransientBased::iterate - unable to compute F" << std::endl;
259 status = NOX::StatusTest::Failed;
264 NOX::StatusTest::FiniteValue fv;
265 NOX::StatusTest::StatusType fvStatus = fv.checkStatus(*
this,
checkType);
266 if (fvStatus == NOX::StatusTest::Failed) {
272 return (NOX::StatusTest::Unconverged);
274 return (NOX::StatusTest::Failed);
294 NOX::Abstract::Group* tmpGroup =
300 NOX::Abstract::Group* tmpPreviousGroup =
305 std::string message =
"PrePostOperator\n Failed to dynamic_cast the old and new groups to N_NLS_LOCA::Groups! ";
306 N_ERH_ErrorMgr::report(N_ERH_ErrorMgr::DEV_FATAL, message);
316 while (
status == NOX::StatusTest::Unconverged)
325 Teuchos::ParameterList& outputParams =
paramsPtr->sublist(
"Output");
326 outputParams.set(
"Nonlinear Iterations",
nIter);
327 outputParams.set(
"2-Norm of Residual",
solnPtr->getNormF());
334 const NOX::Abstract::Group&
340 const NOX::Abstract::Group&
351 const Teuchos::ParameterList&
364 if ((
status == NOX::StatusTest::Unconverged) &&
365 (
utils.isPrintType(NOX::Utils::OuterIterationStatusTest)))
367 utils.out() << NOX::Utils::fill(72) <<
"\n";
368 utils.out() <<
"-- Status Test Results --\n";
370 utils.out() << NOX::Utils::fill(72) <<
"\n";
374 if (
utils.isPrintType(NOX::Utils::OuterIteration))
376 normSoln =
solnPtr->getNormF();
377 normStep = (
nIter > 0) ?
dir.norm() : 0;
381 if (
utils.isPrintType(NOX::Utils::OuterIteration))
383 utils.out() <<
"\n" << NOX::Utils::fill(72) <<
"\n";
384 utils.out() <<
"-- Nonlinear Solver Step " <<
nIter <<
" -- \n";
385 utils.out() <<
"f = " <<
utils.sciformat(normSoln);
387 utils.out() <<
" dx = " <<
utils.sciformat(normStep);
388 if (
status == NOX::StatusTest::Converged)
389 utils.out() <<
" (Converged!)";
390 if (
status == NOX::StatusTest::Failed)
391 utils.out() <<
" (Failed!)";
392 utils.out() <<
"\n" << NOX::Utils::fill(72) <<
"\n" << std::endl;
396 if ((
status != NOX::StatusTest::Unconverged) &&
397 (
utils.isPrintType(NOX::Utils::OuterIteration)))
399 utils.out() << NOX::Utils::fill(72) <<
"\n";
400 utils.out() <<
"-- Final Status Test Results --\n";
402 utils.out() << NOX::Utils::fill(72) <<
"\n";
NOX::StatusTest::StatusType status
Status of nonlinear solver.
void setX(const Vector &input)
Teuchos::RCP< NOX::StatusTest::Generic > testPtr
Stopping test.
N_NLS_LOCA::Group * previousGroup_
const NOX::Abstract::Vector & getX() const
Pure virtual class to augment a linear system.
virtual int getNumIterations() const
virtual NOX::StatusTest::StatusType solve()
NOX::Solver::PrePostOperator prePostOperator
Pointer to a user defined NOX::Abstract::PrePostOperator object.
double step_
Current step.
NOX::Abstract::Vector & dir
Current search direction.reference.
Teuchos::RCP< NOX::Abstract::Group > solnPtr
Current solution.
virtual double getStepSize() const
Return the line search step size from the current iteration.
virtual const NOX::Abstract::Group & getPreviousSolutionGroup() const
Teuchos::RCP< AugmentLinSys > augmentLSStrategy
RCP to the strategy for augmenting the linear system.
virtual NOX::StatusTest::StatusType getStatus()
Teuchos::RCP< NOX::LineSearch::Generic > lineSearch
Linesearch.
virtual void reset(const NOX::Abstract::Vector &initial_guess)
virtual NOX::StatusTest::StatusType step()
N_NLS_LOCA::Group * group_
virtual const Teuchos::ParameterList & getList() const
NOX::Abstract::Group & oldSoln
Previous solution reference.
virtual void init()
Print out initialization information and calcuation the RHS.
Teuchos::RCP< Teuchos::ParameterList > paramsPtr
Input parameters.
virtual ~PseudoTransientBased()
Destructor.
NOX::StatusTest::CheckType checkType
Type of check to use for status tests.
PseudoTransientBased(const Teuchos::RCP< AugmentLinSys > &als, const Teuchos::RCP< NOX::Abstract::Group > &grp, const Teuchos::RCP< NOX::StatusTest::Generic > &tests, const Teuchos::RCP< Teuchos::ParameterList > ¶ms, double initialStepSize, double minStepSize, double maxStepSize)
Constructor.
int nIter
Number of nonlinear iterations.
virtual void printUpdate()
Prints the current iteration information.
void setAugmentLinearSystem(bool enable, const Teuchos::RCP< N_NLS_NOX::AugmentLinSys > &ls)
virtual const NOX::Abstract::Group & getSolutionGroup() const
Teuchos::RCP< NOX::Direction::Generic > direction
Search Direction.
virtual double getPseudoTransientStepSize() const
Return the pseudo transient step size.