304 if (this->user_presolve)
305 this->user_presolve(this->system());
310 NOX::Epetra::Vector x(*x_epetra->
vec());
312 Teuchos::RCP<Teuchos::ParameterList> nlParamsPtr = Teuchos::rcp(
new Teuchos::ParameterList);
313 Teuchos::ParameterList & nlParams = *(nlParamsPtr.get());
314 nlParams.set(
"Nonlinear Solver",
"Line Search Based");
317 Teuchos::ParameterList & printParams = nlParams.sublist(
"Printing");
318 printParams.set(
"Output Precision", 3);
319 printParams.set(
"Output Processor", 0);
320 printParams.set(
"Output Information",
321 NOX::Utils::OuterIteration +
322 NOX::Utils::OuterIterationStatusTest +
323 NOX::Utils::InnerIteration +
324 NOX::Utils::LinearSolverDetails +
325 NOX::Utils::Parameters +
326 NOX::Utils::Details +
327 NOX::Utils::Warning);
329 Teuchos::ParameterList & dirParams = nlParams.sublist(
"Direction");
330 dirParams.set(
"Method",
"Newton");
331 Teuchos::ParameterList & newtonParams = dirParams.sublist(
"Newton");
332 newtonParams.set(
"Forcing Term Method",
"Constant");
334 Teuchos::ParameterList & lsParams = newtonParams.sublist(
"Linear Solver");
335 lsParams.set(
"Aztec Solver",
"GMRES");
336 lsParams.set(
"Max Iterations",
static_cast<int>(this->max_linear_iterations));
337 lsParams.set(
"Tolerance", this->initial_linear_tolerance);
338 lsParams.set(
"Output Frequency", 1);
339 lsParams.set(
"Size of Krylov Subspace", 1000);
342 Teuchos::RCP<NOX::Epetra::Interface::Required> iReq(_interface);
343 Teuchos::RCP<NOX::Epetra::LinearSystemAztecOO> linSys;
344 Teuchos::RCP<Epetra_Operator> pc;
346 if (this->jacobian || this->jacobian_object || this->residual_and_jacobian_object)
348 if (this->_preconditioner)
351 lsParams.set(
"Preconditioner",
"User Defined");
354 cast_ptr<TrilinosPreconditioner<Number> *>(this->_preconditioner);
355 pc = Teuchos::rcp(trilinos_pc);
357 Teuchos::RCP<NOX::Epetra::Interface::Preconditioner> iPrec(_interface);
358 linSys = Teuchos::rcp(
new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iReq, iPrec, pc, x));
362 lsParams.set(
"Preconditioner",
"None");
369 Teuchos::RCP<Epetra_RowMatrix> jacMat = Teuchos::rcp(jacSys.
mat());
371 Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac(_interface);
372 linSys = Teuchos::rcp(
new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iReq, iJac, jacMat, x));
378 Teuchos::RCP<NOX::Epetra::MatrixFree> MF = Teuchos::rcp(
new NOX::Epetra::MatrixFree(printParams, iReq, x));
380 Teuchos::RCP<NOX::Epetra::Interface::Jacobian> iJac(MF);
381 linSys = Teuchos::rcp(
new NOX::Epetra::LinearSystemAztecOO(printParams, lsParams, iReq, iJac, MF, x));
385 Teuchos::RCP<NOX::Epetra::Group> grpPtr = Teuchos::rcp(
new NOX::Epetra::Group(printParams, iReq, x, linSys));
386 NOX::Epetra::Group & grp = *(grpPtr.get());
388 if (this->relative_step_tolerance != 0)
389 libmesh_warning(
"Setting the relative step tolerance is currently not supported with the trilinos nox nonlinear solver.");
391 Teuchos::RCP<NOX::StatusTest::NormF> absresid =
392 Teuchos::rcp(
new NOX::StatusTest::NormF(this->absolute_residual_tolerance, NOX::StatusTest::NormF::Unscaled));
393 Teuchos::RCP<NOX::StatusTest::NormF> relresid =
394 Teuchos::rcp(
new NOX::StatusTest::NormF(grp, this->relative_residual_tolerance));
395 Teuchos::RCP<NOX::StatusTest::MaxIters> maxiters =
396 Teuchos::rcp(
new NOX::StatusTest::MaxIters(this->max_nonlinear_iterations));
397 Teuchos::RCP<NOX::StatusTest::FiniteValue> finiteval =
398 Teuchos::rcp(
new NOX::StatusTest::FiniteValue());
399 Teuchos::RCP<NOX::StatusTest::NormUpdate> normupdate =
400 Teuchos::rcp(
new NOX::StatusTest::NormUpdate(this->absolute_step_tolerance));
401 Teuchos::RCP<NOX::StatusTest::Combo> combo =
402 Teuchos::rcp(
new NOX::StatusTest::Combo(NOX::StatusTest::Combo::OR));
403 combo->addStatusTest(absresid);
404 combo->addStatusTest(relresid);
405 combo->addStatusTest(maxiters);
406 combo->addStatusTest(finiteval);
407 combo->addStatusTest(normupdate);
409 Teuchos::RCP<Teuchos::ParameterList> finalPars = nlParamsPtr;
411 Teuchos::RCP<NOX::Solver::Generic> solver = NOX::Solver::buildSolver(grpPtr, combo, nlParamsPtr);
412 NOX::StatusTest::StatusType status = solver->solve();
413 this->converged = (status == NOX::StatusTest::Converged);
415 const NOX::Epetra::Group & finalGroup =
dynamic_cast<const NOX::Epetra::Group &
>(solver->getSolutionGroup());
416 const NOX::Epetra::Vector & noxFinalSln =
dynamic_cast<const NOX::Epetra::Vector &
>(finalGroup.getX());
418 *x_epetra->
vec() = noxFinalSln.getEpetraVector();
421 Real residual_norm = finalGroup.getNormF();
422 unsigned int total_iters = solver->getNumIterations();
423 _n_linear_iterations = finalPars->sublist(
"Direction").sublist(
"Newton").sublist(
"Linear Solver").sublist(
"Output").get(
"Total Number of Linear Iterations", -1);
429 return std::make_pair(total_iters, residual_norm);