# Coupling Solvers with Preconditioners¶

These classes provide a convenient way to couple an iterative solver and a preconditioner. This may be used both for convenience and as a building block for a composite preconditioner.

## make_solver¶

template<class Precond, class IterSolver>
class amgcl::make_solver

Include <amgcl/make_solver.hpp>

The class has two template parameters: Precond and IterSolver, which specify the preconditioner and the iterative solver to use. During construction of the class, instances of both components are constructed and are ready to use as a whole.

typedef typename Backend::params backend_params

The backend parameters

typedef typename Backend::value_type value_type

The value type of the system matrix

typedef typename amgcl::math::scalar_of<value_type>::type scalar_type

The scalar type corresponding to the value type. For example, when the value type is std::complex<double>, then the scalar type is double.

class params

The coupled solver parameters

typename Precond::params precond

The preconditioner parameters

IterSolver::params solver

The iterative solver parameters

template<class Matrix>
make_solver(const Matrix &A, const params &prm = params(), const backend_params &bprm = backend_params())

The constructor

template<class Matrix, class VectorRHS, class VectorX>
std::tuple<size_t, scalar_type> operator()(const Matrix &A, const VectorRHS &rhs, VectorX &x) const

Computes the solution for the given system matrix A and the right-hand side rhs. Returns the number of iterations made and the achieved residual as a std::tuple. The solution vector x provides initial approximation on input and holds the computed solution on output.

The system matrix may differ from the matrix used during initialization. This may be used for the solution of non-stationary problems with slowly changing coefficients. There is a strong chance that a preconditioner built for a time step will act as a reasonably good preconditioner for several subsequent time steps [DeSh12].

template<class VectorRHS, class VectorX>
std::tuple<size_t, scalar_type> operator()(const VectorRHS &rhs, VectorX &x) const

Computes the solution for the given right-hand side rhs. Returns the number of iterations made and the achieved residual as a std::tuple. The solution vector x provides initial approximation on input and holds the computed solution on output.

const Precond &precond() const

Returns reference to the constructed preconditioner

const IterSolver &solver() const

Returns reference to the constructed iterative solver

## make_block_solver¶

template<class Precond, class IterSolver>
class amgcl::make_block_solver

Include <amgcl/make_block_solver.hpp>

Creates coupled solver which targets a block valued backend, but may be initialized with a scalar system matrix, and used with scalar vectors.

The scalar system matrix is transparently converted to the block-valued on using the amgcl::adapter::block_matrix() adapter in the class constructor, and the scalar vectors are reinterpreted to the block-valued ones upon application.

This class may be used as a building block in a composite preconditioner, when one (or more) of the subsystems has block values, but has to be computed as a scalar matrix.

The interface is the same as that of amgcl::make_solver.

## deflated_solver¶

template<class Precond, class IterSolver>
class amgcl::deflated_solver

Include <amgcl/deflated_solver.hpp>

Creates preconditioned deflated solver. Deflated Krylov subspace methods are supposed to solve problems with large jumps in the coefficients on layered domains. It appears that the convergence of a deflated solver is independent of the size of the jump in the coefficients. The specific variant of the deflation method used here is A-DEF2 from [TNVE09].

typedef typename Backend::params backend_params

The backend parameters

typedef typename Backend::value_type value_type

The value type of the system matrix

typedef typename amgcl::math::scalar_of<value_type>::type scalar_type

The scalar type corresponding to the value type. For example, when the value type is std::complex<double>, then the scalar type is double.

class params

The deflated solver parameters

int nvec = 0

The number of deflation vectors

scalar_type *vec = nullptr

The deflation vectors stored as a [nvec x n] matrix in row-major order

typename Precond::params precond

The preconditioner parameters

IterSolver::params solver

The iterative solver parameters