22 #ifndef __HERMES_COMMON_NEWTON_SOLVER_NOX_H_
23 #define __HERMES_COMMON_NEWTON_SOLVER_NOX_H_
25 #include "linear_matrix_solver.h"
28 #if(defined HAVE_NOX && defined HAVE_EPETRA && defined HAVE_TEUCHOS)
30 #ifdef _POSIX_C_SOURCE
31 # undef _POSIX_C_SOURCE // pyconfig.h included by NOX_Epetra defines it
34 # undef _XOPEN_SOURCE // pyconfig.h included by NOX_Epetra defines it
36 #include <NOX_Epetra.H>
45 template <
typename Scalar>
46 class HERMES_API DiscreteProblemNOX :
47 public NOX::Epetra::Interface::Required,
48 public NOX::Epetra::Interface::Jacobian,
49 public NOX::Epetra::Interface::Preconditioner
52 DiscreteProblemNOX(DiscreteProblemInterface<Scalar> * problem);
55 void set_precond(Teuchos::RCP<Precond<Scalar> > &pc);
57 Teuchos::RCP<Precond<Scalar> > get_precond();
60 EpetraMatrix<Scalar> *get_jacobian();
63 virtual bool computeF(
const Epetra_Vector &x, Epetra_Vector &f, FillType flag = Residual);
66 virtual bool computeJacobian(
const Epetra_Vector &x, Epetra_Operator &op);
70 virtual bool computePreconditioner(
const Epetra_Vector &x, Epetra_Operator &m,
71 Teuchos::ParameterList *precParams = 0);
74 DiscreteProblemInterface<Scalar> * dp;
76 EpetraMatrix<Scalar> jacobian;
78 Teuchos::RCP<Precond<Scalar> > precond;
84 template <
typename Scalar>
85 class HERMES_API NewtonSolverNOX :
public NonlinearSolver<Scalar>
88 DiscreteProblemNOX<Scalar> ndp;
89 Teuchos::RCP<Teuchos::ParameterList> nl_pars;
92 NewtonSolverNOX(DiscreteProblemInterface<Scalar> *problem);
94 virtual ~NewtonSolverNOX();
97 virtual void set_time(
double time);
98 virtual void set_time_step(
double time_step);
100 virtual void solve(Scalar* coeff_vec);
102 virtual int get_num_iters();
103 virtual double get_residual();
104 int get_num_lin_iters();
105 double get_achieved_tol();
114 void set_output_flags(
int flags);
125 void set_ls_type(
const char *type);
127 void set_ls_max_iters(
int iters);
129 void set_ls_tolerance(
double tolerance);
131 void set_ls_sizeof_krylov_subspace(
int size);
140 void set_norm_type(NOX::Abstract::Vector::NormType type);
144 void set_scale_type(NOX::StatusTest::NormF::ScaleType type);
146 void set_conv_iters(
int iters);
148 void set_conv_abs_resid(
double resid);
150 void set_conv_rel_resid(
double resid);
152 void disable_abs_resid();
154 void disable_rel_resid();
156 void set_conv_update(
double update);
160 void set_conv_wrms(
double rtol,
double atol);
175 void set_precond_reuse(
const char * pc_reuse);
179 void set_precond_max_age(
int max_age);
182 virtual void set_precond(Precond<Scalar> &pc);
189 virtual void set_precond(
const char *pc);
203 NOX::Abstract::Vector::NormType norm_type;
204 NOX::StatusTest::NormF::ScaleType stype;