20 #ifndef LIBMESH_PETSC_NONLINEAR_SOLVER_H 21 #define LIBMESH_PETSC_NONLINEAR_SOLVER_H 23 #include "libmesh/libmesh_config.h" 26 #ifdef LIBMESH_HAVE_PETSC 29 #include "libmesh/nonlinear_solver.h" 30 #include "libmesh/petsc_macro.h" 31 #include "libmesh/wrapped_petsc.h" 35 # define LIBMESH_SAW_I 37 #include <petscsnes.h> 39 # undef I // Avoid complex.h contamination 44 class ResidualContext;
58 PetscErrorCode
libmesh_petsc_snes_postcheck(SNESLineSearch, Vec x, Vec y, Vec w, PetscBool * changed_y, PetscBool * changed_w,
void * context);
61 #ifdef LIBMESH_ENABLE_DEPRECATED 102 virtual void clear ()
override;
108 virtual void init (
const char *
name =
nullptr)
override;
119 virtual std::pair<unsigned int, Real>
124 const unsigned int)
override;
307 #endif // #ifdef LIBMESH_HAVE_PETSC 308 #endif // LIBMESH_PETSC_NONLINEAR_SOLVER_H unsigned _current_nonlinear_iteration_number
Stores the current nonlinear iteration number.
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
friend PetscErrorCode libmesh_petsc_snes_residual(SNES snes, Vec x, Vec r, void *ctx)
PetscErrorCode __libmesh_petsc_snes_jacobian(SNES, Vec x, Mat jac, Mat pc, void *ctx)
virtual unsigned int reuse_preconditioner_max_linear_its() const override
Getter for the maximum iterations flag for preconditioner reuse.
PetscErrorCode libmesh_petsc_snes_fd_residual(SNES, Vec x, Vec r, void *ctx)
PetscNonlinearSolver(sys_type &system)
Constructor.
void use_default_monitor(bool state)
Set to true to use the libMesh's default monitor, set to false to use your own.
WrappedPetsc< SNES > _snes
Nonlinear solver context.
PetscErrorCode __libmesh_petsc_snes_monitor(SNES, PetscInt its, PetscReal fnorm, void *)
friend PetscErrorCode libmesh_petsc_snes_jacobian(SNES snes, Vec x, Mat jac, Mat pc, void *ctx)
Provides a uniform interface to vector storage schemes for different linear algebra libraries...
This base class can be inherited from to provide interfaces to nonlinear solvers from different packa...
virtual void clear() override
Release all memory and clear data structures.
PetscErrorCode libmesh_petsc_snes_postcheck(SNESLineSearch, Vec x, Vec y, Vec w, PetscBool *changed_y, PetscBool *changed_w, void *context)
PetscErrorCode __libmesh_petsc_snes_residual(SNES, Vec x, Vec r, void *ctx)
virtual int get_total_linear_iterations() override
Get the total number of linear iterations done in the last solve.
bool _zero_out_residual
true to zero out residual before going into application level call-back, otherwise false ...
The libMesh namespace provides an interface to certain functionality in the library.
PetscErrorCode libmesh_petsc_snes_monitor(SNES, PetscInt its, PetscReal fnorm, void *)
PetscErrorCode __libmesh_petsc_snes_mffd_interface(void *ctx, Vec x, Vec r)
This class provides an interface to PETSc iterative solvers that is compatible with the libMesh Nonli...
bool _setup_reuse
Whether we've triggered the preconditioner reuse.
~PetscNonlinearSolver()
Destructor.
bool snes_mf_reuse_base() const
PetscErrorCode libmesh_petsc_snes_mffd_residual(SNES snes, Vec x, Vec r, void *ctx)
const sys_type & system() const
friend PetscErrorCode libmesh_petsc_snes_fd_residual(SNES snes, Vec x, Vec r, void *ctx)
bool _zero_out_jacobian
true to zero out jacobian before going into application level call-back, otherwise false ...
PetscInt _n_linear_iterations
Stores the total number of linear iterations from the last solve.
friend PetscErrorCode libmesh_petsc_snes_mffd_residual(SNES snes, Vec x, Vec r, void *ctx)
friend ResidualContext libmesh_petsc_snes_residual_helper(SNES snes, Vec x, void *ctx)
Manages consistently variables, degrees of freedom, coefficient vectors, matrices and non-linear solv...
PetscErrorCode __libmesh_petsc_snes_fd_residual(SNES, Vec x, Vec r, void *ctx)
void setup_default_monitor()
Setup the default monitor if required.
virtual unsigned get_current_nonlinear_iteration_number() const override
void set_residual_zero_out(bool state)
Set if the residual should be zeroed out in the callback.
SNESConvergedReason _reason
Store the reason for SNES convergence/divergence for use even after the _snes has been cleared...
void set_jacobian_zero_out(bool state)
Set if the jacobian should be zeroed out in the callback.
PetscErrorCode libmesh_petsc_snes_mffd_interface(void *ctx, Vec x, Vec r)
virtual void linesearch(SNESLineSearch linesearch)=0
SNESConvergedReason get_converged_reason()
PetscErrorCode libmesh_petsc_linesearch_shellfunc(SNESLineSearch linesearch, void *ctx)
Abstract base class to be used to implement a custom line-search algorithm.
std::unique_ptr< ComputeLineSearchObject > linesearch_object
A callable object that can be used to specify a custom line-search.
virtual void force_new_preconditioner() override
Immediately force a new preconditioner, even if reuse is set.
PetscErrorCode libmesh_petsc_snes_jacobian(SNES, Vec x, Mat jac, Mat pc, void *ctx)
virtual void print_converged_reason() override
Prints a useful message about why the latest nonlinear solve con(di)verged.
PetscErrorCode libmesh_petsc_snes_precheck(SNESLineSearch, Vec X, Vec Y, PetscBool *changed, void *context)
void set_snesmf_reuse_base(bool state)
Set to true to let PETSc reuse the base vector.
void build_mat_null_space(NonlinearImplicitSystem::ComputeVectorSubspace *computeSubspaceObject, void(*)(std::vector< NumericVector< Number > *> &, sys_type &), MatNullSpace *)
bool _default_monitor
true if we want the default monitor to be set, false for no monitor (i.e.
virtual void init(const char *name=nullptr) override
Initialize data structures if not done so already.
friend PetscErrorCode libmesh_petsc_snes_precheck(SNESLineSearch, Vec X, Vec Y, PetscBool *changed, void *context)
virtual std::pair< unsigned int, Real > solve(SparseMatrix< T > &, NumericVector< T > &, NumericVector< T > &, const double, const unsigned int) override
Call the Petsc solver.
PetscErrorCode __libmesh_petsc_snes_postcheck(SNESLineSearch, Vec x, Vec y, Vec w, PetscBool *changed_y, PetscBool *changed_w, void *context)
virtual bool reuse_preconditioner() const override
Getter for preconditioner reuse.
virtual ~ComputeLineSearchObject()=default
bool _computing_base_vector
Whether we are computing the base vector for matrix-free finite differencing.
void set_computing_base_vector(bool computing_base_vector)
Set whether we are computing the base vector for matrix-free finite-differencing. ...
NonlinearImplicitSystem sys_type
The type of system.
PetscErrorCode libmesh_petsc_snes_residual(SNES, Vec x, Vec r, void *ctx)
bool _snesmf_reuse_base
True, If we want the base vector to be used for differencing even if the function provided to SNESSet...
PetscErrorCode libmesh_petsc_recalculate_monitor(SNES snes, PetscInt it, PetscReal norm, void *mctx)
bool computing_base_vector() const
Callable abstract base class to be used as a callback to provide the solver with a basis for the syst...