20#ifndef LIBMESH_LINEAR_SOLVER_H
21#define LIBMESH_LINEAR_SOLVER_H
24#include "libmesh/libmesh_common.h"
25#include "libmesh/enum_subset_solve_mode.h"
26#include "libmesh/reference_counted_object.h"
27#include "libmesh/libmesh.h"
28#include "libmesh/parallel_object.h"
40template <
typename T>
class SparseMatrix;
41template <
typename T>
class NumericVector;
42template <
typename T>
class ShellMatrix;
43template <
typename T>
class Preconditioner;
45class SolverConfiguration;
96 virtual void init (
const char * name =
nullptr) = 0;
168 const std::optional<double> tol = std::nullopt,
169 const std::optional<unsigned int> m_its = std::nullopt) = 0;
181 const std::optional<double> tol = std::nullopt,
182 const std::optional<unsigned int> m_its = std::nullopt);
193 const std::optional<double> tol = std::nullopt,
194 const std::optional<unsigned int> m_its = std::nullopt) = 0;
206 const std::optional<double> tol = std::nullopt,
207 const std::optional<unsigned int> m_its = std::nullopt);
217 const std::optional<double> tol = std::nullopt,
218 const std::optional<unsigned int> m_its = std::nullopt) = 0;
230 const std::optional<double> tol = std::nullopt,
231 const std::optional<unsigned int> m_its = std::nullopt) = 0;
242 const std::optional<double> tol = std::nullopt,
243 const std::optional<unsigned int> m_its = std::nullopt);
302 const std::optional<double> & setting,
303 const std::optional<double> default_value = std::nullopt);
310 const std::optional<int> & setting,
311 const std::optional<int> default_value = std::nullopt);
329 return same_preconditioner;
334std::pair<unsigned int, Real>
339 const std::optional<double> tol,
340 const std::optional<unsigned int> n_iter)
343 return this->solve(mat, *pc_mat, sol, rhs, tol, n_iter);
345 return this->solve(mat, sol, rhs, tol, n_iter);
351std::pair<unsigned int, Real>
356 const std::optional<double> tol,
357 const std::optional<unsigned int> n_iter)
360 return this->solve(mat, *pc_mat, sol, rhs, tol, n_iter);
362 return this->solve(mat, sol, rhs, tol, n_iter);
void ErrorVector unsigned int
This base class can be inherited from to provide interfaces to linear solvers from different packages...
virtual std::pair< unsigned int, Real > solve(const ShellMatrix< T > &shell_matrix, const SparseMatrix< T > &precond_matrix, NumericVector< T > &, NumericVector< T > &, const std::optional< double > tol=std::nullopt, const std::optional< unsigned int > m_its=std::nullopt)=0
This function solves a system whose matrix is a shell matrix, but a sparse matrix is used as precondi...
virtual void restrict_solve_to(const std::vector< unsigned int > *const dofs, const SubsetSolveMode subset_solve_mode=SUBSET_ZERO)
After calling this method, all successive solves will be restricted to the given set of dofs,...
virtual void clear()
Release all memory and clear data structures.
Preconditioner< T > * _preconditioner
Holds the Preconditioner object to be used for the linear solves.
int get_int_solver_setting(const std::string &setting_name, const std::optional< int > &setting, const std::optional< int > default_value=std::nullopt)
Get solver settings based on optional parameters and the solver configuration object.
PreconditionerType preconditioner_type() const
static std::unique_ptr< LinearSolver< T > > build(const libMesh::Parallel::Communicator &comm_in, const SolverPackage solver_package=libMesh::default_solver_package())
Builds a LinearSolver using the linear solver package specified by solver_package.
std::pair< unsigned int, Real > solve(const ShellMatrix< T > &matrix, const SparseMatrix< T > *precond_matrix, NumericVector< T > &, NumericVector< T > &, const std::optional< double > tol=std::nullopt, const std::optional< unsigned int > m_its=std::nullopt)
This function solves a system whose matrix is a shell matrix, but an optional sparse matrix may be us...
virtual std::pair< unsigned int, Real > solve(SparseMatrix< T > &, SparseMatrix< T > &, NumericVector< T > &, NumericVector< T > &, const std::optional< double > tol=std::nullopt, const std::optional< unsigned int > m_its=std::nullopt)=0
This function calls the solver "_solver_type" preconditioned with the "_preconditioner_type" precondi...
double get_real_solver_setting(const std::string &setting_name, const std::optional< double > &setting, const std::optional< double > default_value=std::nullopt)
Get solver settings based on optional parameters and the solver configuration object.
bool get_same_preconditioner()
virtual LinearConvergenceReason get_converged_reason() const =0
SolverType _solver_type
Enum stating which type of iterative solver to use.
virtual void init(const char *name=nullptr)=0
Initialize data structures if not done so already.
virtual void print_converged_reason() const
Prints a useful message about why the latest linear solve con(di)verged.
bool same_preconditioner
Boolean flag to indicate whether we want to use an identical preconditioner to the previous solve.
PreconditionerType _preconditioner_type
Enum stating with type of preconditioner to use.
virtual void init_systems(const System &)
Apply names to the system to be solved and set auxiliary preconditioner data.
bool _is_initialized
Flag indicating if the data structures have been initialized.
void set_preconditioner_type(const PreconditionerType pct)
Sets the type of preconditioner to use.
SolverConfiguration * _solver_configuration
Optionally store a SolverOptions object that can be used to set parameters like solver type,...
SolverType solver_type() const
void set_solver_configuration(SolverConfiguration &solver_configuration)
Set the solver configuration object.
virtual void reuse_preconditioner(bool)
Set the same_preconditioner flag, which indicates if we reuse the same preconditioner for subsequent ...
virtual ~LinearSolver()
Destructor.
virtual std::pair< unsigned int, Real > solve(const ShellMatrix< T > &shell_matrix, NumericVector< T > &, NumericVector< T > &, const std::optional< double > tol=std::nullopt, const std::optional< unsigned int > m_its=std::nullopt)=0
This function solves a system whose matrix is a shell matrix.
std::pair< unsigned int, Real > solve(SparseMatrix< T > &matrix, SparseMatrix< T > *precond_matrix, NumericVector< T > &, NumericVector< T > &, const std::optional< double > tol=std::nullopt, const std::optional< unsigned int > m_its=std::nullopt)
This function calls the solver "_solver_type" preconditioned with the "_preconditioner_type" precondi...
void set_solver_type(const SolverType st)
Sets the type of solver to use.
void attach_preconditioner(Preconditioner< T > *preconditioner)
Attaches a Preconditioner object to be used.
virtual std::pair< unsigned int, Real > solve(SparseMatrix< T > &, NumericVector< T > &, NumericVector< T > &, const std::optional< double > tol=std::nullopt, const std::optional< unsigned int > m_its=std::nullopt)=0
This function calls the solver _solver_type preconditioned with the _preconditioner_type precondition...
virtual std::pair< unsigned int, Real > adjoint_solve(SparseMatrix< T > &, NumericVector< T > &, NumericVector< T > &, const std::optional< double > tol=std::nullopt, const std::optional< unsigned int > m_its=std::nullopt)
Function to solve the adjoint system.
Provides a uniform interface to vector storage schemes for different linear algebra libraries.
An object whose state is distributed along a set of processors.
This class provides a uniform interface for preconditioners.
This class implements reference counting.
Generic shell matrix, i.e.
This class stores solver configuration data, e.g.
Manages consistently variables, degrees of freedom, and coefficient vectors.
The libMesh namespace provides an interface to certain functionality in the library.
SubsetSolveMode
defines an enum for the question what happens to the dofs outside the given subset when a system is s...
SolverPackage default_solver_package()
SolverPackage
Defines an enum for various linear solver packages.
PreconditionerType
Defines an enum for preconditioner types.
SolverType
Defines an enum for iterative solver types.
LinearConvergenceReason
Linear solver convergence flags (taken from the PETSc flags).