libMesh
Loading...
Searching...
No Matches
petsc_nonlinear_solver.h
Go to the documentation of this file.
1// The libMesh Finite Element Library.
2// Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3
4// This library is free software; you can redistribute it and/or
5// modify it under the terms of the GNU Lesser General Public
6// License as published by the Free Software Foundation; either
7// version 2.1 of the License, or (at your option) any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// Lesser General Public License for more details.
13
14// You should have received a copy of the GNU Lesser General Public
15// License along with this library; if not, write to the Free Software
16// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18
19
20#ifndef LIBMESH_PETSC_NONLINEAR_SOLVER_H
21#define LIBMESH_PETSC_NONLINEAR_SOLVER_H
22
23#include "libmesh/libmesh_config.h"
24
25// Petsc include files.
26#ifdef LIBMESH_HAVE_PETSC
27
28// Local includes
29#include "libmesh/nonlinear_solver.h"
30#include "libmesh/petsc_macro.h"
31#include "libmesh/wrapped_petsc.h"
32#include "libmesh/petsc_dm_wrapper.h"
33#include "libmesh/petsc_mffd_matrix.h"
34
35// PETSc includes
36#ifdef I
37# define LIBMESH_SAW_I
38#endif
39#include <petscsnes.h>
40#ifndef LIBMESH_SAW_I
41# undef I // Avoid complex.h contamination
42#endif
43
44namespace libMesh
45{
46class ResidualContext;
47
48// Allow users access to these functions in case they want to reuse them. Users shouldn't
49// need access to these most of the time as they are used internally by this object.
50extern "C"
51{
52 PetscErrorCode libmesh_petsc_recalculate_monitor(SNES snes, PetscInt it, PetscReal norm, void* mctx);
53 PetscErrorCode libmesh_petsc_snes_monitor (SNES, PetscInt its, PetscReal fnorm, void *);
54 PetscErrorCode libmesh_petsc_snes_residual (SNES, Vec x, Vec r, void * ctx);
55 PetscErrorCode libmesh_petsc_snes_fd_residual (SNES, Vec x, Vec r, void * ctx);
56 PetscErrorCode libmesh_petsc_snes_mffd_residual (SNES snes, Vec x, Vec r, void * ctx);
57 PetscErrorCode libmesh_petsc_snes_mffd_interface (void * ctx, Vec x, Vec r);
58 PetscErrorCode libmesh_petsc_snes_jacobian (SNES, Vec x, Mat jac, Mat pc, void * ctx);
59 PetscErrorCode libmesh_petsc_snes_precheck(SNESLineSearch, Vec X, Vec Y, PetscBool * changed, void * context);
60 PetscErrorCode libmesh_petsc_snes_postcheck(SNESLineSearch, Vec x, Vec y, Vec w, PetscBool * changed_y, PetscBool * changed_w, void * context);
61 PetscErrorCode libmesh_petsc_linesearch_shellfunc(SNESLineSearch linesearch, void * ctx);
62}
63
72template <typename T>
74{
75public:
80
84 explicit
86
91
95 virtual void clear () override;
96
101 virtual void init (const char * name = nullptr) override;
102
107 SNES snes(const char * name = nullptr);
108
113 virtual std::pair<unsigned int, Real>
114 solve (SparseMatrix<T> &, // System Jacobian Matrix
115 NumericVector<T> &, // Solution vector
116 NumericVector<T> &, // Residual vector
117 const double, // Stopping tolerance
118 const unsigned int) override; // N. Iterations
119
124 virtual void print_converged_reason() override;
125
133 SNESConvergedReason get_converged_reason();
134
138 virtual int get_total_linear_iterations() override;
139
145 virtual unsigned get_current_nonlinear_iteration_number() const override
147
151 void set_residual_zero_out(bool state) { _zero_out_residual = state; }
152
156 void set_jacobian_zero_out(bool state) { _zero_out_jacobian = state; }
157
161 void use_default_monitor(bool state) { _default_monitor = state; }
162
166 void set_snesmf_reuse_base(bool state) { _snesmf_reuse_base = state; }
167
172 bool snes_mf_reuse_base() const { return _snesmf_reuse_base; }
173
178
183
188 {
189 public:
190 virtual ~ComputeLineSearchObject () = default;
191
192 virtual void linesearch (SNESLineSearch linesearch) = 0;
193 };
194
198 std::unique_ptr<ComputeLineSearchObject> linesearch_object;
199
204
208 virtual bool reuse_preconditioner() const override;
209
213 virtual unsigned int reuse_preconditioner_max_linear_its() const override;
214
218 virtual void force_new_preconditioner() override;
219
220protected:
221
226
237 SNESConvergedReason _reason;
238
243
248
253
258
263
270
272 void (*)(std::vector<NumericVector<Number> *> &, sys_type &),
273 MatNullSpace *);
274
279
284
285#if defined(LIBMESH_ENABLE_AMR) && defined(LIBMESH_HAVE_METAPHYSICL)
292#endif
293
296
297private:
298 friend ResidualContext libmesh_petsc_snes_residual_helper (SNES snes, Vec x, void * ctx);
299 friend PetscErrorCode libmesh_petsc_snes_residual (SNES snes, Vec x, Vec r, void * ctx);
300 friend PetscErrorCode libmesh_petsc_snes_fd_residual (SNES snes, Vec x, Vec r, void * ctx);
301 friend PetscErrorCode libmesh_petsc_snes_mffd_residual (SNES snes, Vec x, Vec r, void * ctx);
302 friend PetscErrorCode libmesh_petsc_snes_jacobian (SNES snes, Vec x, Mat jac, Mat pc, void * ctx);
303 friend PetscErrorCode libmesh_petsc_snes_precheck (SNESLineSearch,
304 Vec X,
305 Vec Y,
306 PetscBool * changed,
307 void * context);
308};
309
310} // namespace libMesh
311
312
313#endif // #ifdef LIBMESH_HAVE_PETSC
314#endif // LIBMESH_PETSC_NONLINEAR_SOLVER_H
Callable abstract base class to be used as a callback to provide the solver with a basis for the syst...
Manages consistently variables, degrees of freedom, coefficient vectors, matrices and non-linear solv...
This base class can be inherited from to provide interfaces to nonlinear solvers from different packa...
const sys_type & system() const
Provides a uniform interface to vector storage schemes for different linear algebra libraries.
This class defines a wrapper around the PETSc DM infrastructure.
This class allows to use a PETSc shell matrix as a PetscMatrix.
Abstract base class to be used to implement a custom line-search algorithm.
virtual void linesearch(SNESLineSearch linesearch)=0
This class provides an interface to PETSc iterative solvers that is compatible with the libMesh Nonli...
virtual void clear() override
Release all memory and clear data structures.
unsigned _current_nonlinear_iteration_number
Stores the current nonlinear iteration number.
friend ResidualContext libmesh_petsc_snes_residual_helper(SNES snes, Vec x, void *ctx)
friend PetscErrorCode libmesh_petsc_snes_jacobian(SNES snes, Vec x, Mat jac, Mat pc, void *ctx)
virtual int get_total_linear_iterations() override
Get the total number of linear iterations done in the last solve.
friend PetscErrorCode libmesh_petsc_snes_fd_residual(SNES snes, Vec x, Vec r, void *ctx)
std::unique_ptr< ComputeLineSearchObject > linesearch_object
A callable object that can be used to specify a custom line-search.
bool _computing_base_vector
Whether we are computing the base vector for matrix-free finite differencing.
virtual std::pair< unsigned int, Real > solve(SparseMatrix< T > &, NumericVector< T > &, NumericVector< T > &, const double, const unsigned int) override
Call the Petsc solver.
friend PetscErrorCode libmesh_petsc_snes_residual(SNES snes, Vec x, Vec r, void *ctx)
void setup_default_monitor()
Setup the default monitor if required.
bool _zero_out_residual
true to zero out residual before going into application level call-back, otherwise false
bool _default_monitor
true if we want the default monitor to be set, false for no monitor (i.e.
void set_computing_base_vector(bool computing_base_vector)
Set whether we are computing the base vector for matrix-free finite-differencing.
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.
void set_residual_zero_out(bool state)
Set if the residual should be zeroed out in the callback.
bool _setup_reuse
Whether we've triggered the preconditioner reuse.
virtual void init(const char *name=nullptr) override
Initialize data structures if not done so already.
virtual void print_converged_reason() override
Prints a useful message about why the latest nonlinear solve con(di)verged.
friend PetscErrorCode libmesh_petsc_snes_mffd_residual(SNES snes, Vec x, Vec r, void *ctx)
void build_mat_null_space(NonlinearImplicitSystem::ComputeVectorSubspace *computeSubspaceObject, void(*)(std::vector< NumericVector< Number > * > &, sys_type &), MatNullSpace *)
friend 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.
virtual bool reuse_preconditioner() const override
Getter for preconditioner reuse.
virtual void force_new_preconditioner() override
Immediately force a new preconditioner, even if reuse is set.
bool _snesmf_reuse_base
True, If we want the base vector to be used for differencing even if the function provided to SNESSet...
SNESConvergedReason _reason
Store the reason for SNES convergence/divergence for use even after the _snes has been cleared.
SNES snes(const char *name=nullptr)
void set_jacobian_zero_out(bool state)
Set if the jacobian should be zeroed out in the callback.
NonlinearImplicitSystem sys_type
The type of system.
virtual unsigned int reuse_preconditioner_max_linear_its() const override
Getter for the maximum iterations flag for preconditioner reuse.
WrappedPetsc< SNES > _snes
Nonlinear solver context.
PetscDMWrapper _dm_wrapper
Wrapper object for interacting with the "new" libMesh PETSc DM.
virtual unsigned get_current_nonlinear_iteration_number() const override
PetscMFFDMatrix< Number > _mffd_jac
Wrapper for matrix-free finite-difference Jacobians.
void use_default_monitor(bool state)
Set to true to use the libMesh's default monitor, set to false to use your own.
Generic sparse matrix.
The libMesh namespace provides an interface to certain functionality in the library.
PetscErrorCode libmesh_petsc_snes_jacobian(SNES, Vec x, Mat jac, Mat pc, void *ctx)
PetscErrorCode libmesh_petsc_linesearch_shellfunc(SNESLineSearch linesearch, void *ctx)
PetscErrorCode libmesh_petsc_snes_postcheck(SNESLineSearch, Vec x, Vec y, Vec w, PetscBool *changed_y, PetscBool *changed_w, void *context)
PetscErrorCode libmesh_petsc_snes_fd_residual(SNES, Vec x, Vec r, void *ctx)
PetscErrorCode libmesh_petsc_snes_residual(SNES, Vec x, Vec r, void *ctx)
PetscErrorCode libmesh_petsc_snes_monitor(SNES, PetscInt its, PetscReal fnorm, void *)
PetscErrorCode libmesh_petsc_snes_mffd_residual(SNES snes, Vec x, Vec r, void *ctx)
PetscErrorCode libmesh_petsc_recalculate_monitor(SNES snes, PetscInt it, PetscReal norm, void *mctx)
PetscErrorCode libmesh_petsc_snes_precheck(SNESLineSearch, Vec X, Vec Y, PetscBool *changed, void *context)
PetscErrorCode libmesh_petsc_snes_mffd_interface(void *ctx, Vec x, Vec r)