6#ifndef DUNE_ISTL_SOLVERFACTORY_HH
7#define DUNE_ISTL_SOLVERFACTORY_HH
9#include <unordered_map>
13#include <dune/common/parametertree.hh>
14#include <dune/common/singleton.hh>
27 template<
class M,
class X,
class Y>
29 template<
class M,
class X,
class Y>
33 template<
class M,
class X,
class Y>
35 template<
class M,
class X,
class Y>
39 template<
class X,
class Y>
40 using IterativeSolverSignature = std::shared_ptr<InverseOperator<X,Y>>(
const std::shared_ptr<LinearOperator<X,Y>>&,
const std::shared_ptr<ScalarProduct<X>>&,
const std::shared_ptr<Preconditioner<X,Y>>,
const ParameterTree&);
41 template<
class X,
class Y>
54 int initSolverFactories(){
55 using M =
typename O::matrix_type;
56 using X =
typename O::range_type;
57 using Y =
typename O::domain_type;
58 using TL = Dune::TypeList<M,X,Y>;
60 addRegistryToFactory<TL>(dsfac, DirectSolverTag{});
62 addRegistryToFactory<TL>(pfac, PreconditionerTag{});
63 using TLS = Dune::TypeList<X,Y>;
65 return addRegistryToFactory<TLS>(isfac, IterativeSolverTag{});
70 template<
class O,
class Preconditioner>
77 template<
class M,
class X,
class Y,
class C,
class Preconditioner>
78 std::shared_ptr<Preconditioner>
82 return std::make_shared<BlockPreconditioner<X,Y,C,Preconditioner> >(prec, op->getCommunication());
85 template<
class M,
class X,
class Y,
class C,
class Preconditioner>
86 std::shared_ptr<Preconditioner>
90 return std::make_shared<NonoverlappingBlockPreconditioner<C,Preconditioner> >(prec, op->getCommunication());
93 template<
class M,
class X,
class Y>
96 return std::make_shared<SeqScalarProduct<X>>();
98 template<
class M,
class X,
class Y,
class C>
104 template<
class M,
class X,
class Y,
class C>
129 template<
class Operator>
131 using Domain =
typename Operator::domain_type;
132 using Range =
typename Operator::range_type;
137 using _matrix_type =
typename O::matrix_type;
138 using matrix_type = Std::detected_or_t<int, _matrix_type, Operator>;
139 static constexpr bool isAssembled = !std::is_same<matrix_type, int>::value;
141 static const matrix_type* getmat(std::shared_ptr<Operator> op){
142 std::shared_ptr<AssembledLinearOperator<matrix_type, Domain, Range>> aop
143 = std::dynamic_pointer_cast<AssembledLinearOperator<matrix_type, Domain, Range>>(op);
145 return &aop->getmat();
153 static std::shared_ptr<Solver>
get(std::shared_ptr<Operator> op,
154 const ParameterTree& config,
155 std::shared_ptr<Preconditioner> prec =
nullptr){
156 std::string type = config.get<std::string>(
"type");
157 std::shared_ptr<Solver> result;
158 const matrix_type*
mat = getmat(op);
162 DUNE_THROW(NotImplemented,
"The solver factory does not support parallel direct solvers!");
170 DUNE_THROW(Dune::InvalidStateException,
"Solver not found in the factory.");
173 const ParameterTree& precConfig = config.sub(
"preconditioner");
174 std::string prec_type = precConfig.get<std::string>(
"type");
189 const ParameterTree& config){
190 const matrix_type*
mat = getmat(op);
192 std::string prec_type = config.get<std::string>(
"type");
195 DUNE_THROW(InvalidStateException,
"Could not obtain matrix from operator. Please pass in an AssembledLinearOperator.");
210 template<
class Operator>
211 std::shared_ptr<InverseOperator<
typename Operator::domain_type,
213 const ParameterTree& config,
215 typename Operator::range_type>> prec =
nullptr){
Define general, extensible interface for inverse operators.
Matrix & mat
Definition matrixmatrix.hh:347
std::shared_ptr< InverseOperator< X, Y > >(const std::shared_ptr< LinearOperator< X, Y > > &, const std::shared_ptr< ScalarProduct< X > > &, const std::shared_ptr< Preconditioner< X, Y > >, const ParameterTree &) IterativeSolverSignature
Definition solverfactory.hh:40
std::shared_ptr< Preconditioner > wrapPreconditioner4Parallel(const std::shared_ptr< Preconditioner > &prec, const O &)
Definition solverfactory.hh:71
std::shared_ptr< Preconditioner< X, Y > >(const std::shared_ptr< M > &, const ParameterTree &) PreconditionerSignature
Definition solverfactory.hh:34
Singleton< ParameterizedObjectFactory< DirectSolverSignature< M, X, Y > > > DirectSolverFactory
Definition solverfactory.hh:30
std::shared_ptr< InverseOperator< X, Y > >(const M &, const ParameterTree &) DirectSolverSignature
Definition solverfactory.hh:28
std::shared_ptr< InverseOperator< typename Operator::domain_type, typename Operator::range_type > > getSolverFromFactory(std::shared_ptr< Operator > op, const ParameterTree &config, std::shared_ptr< Preconditioner< typename Operator::domain_type, typename Operator::range_type > > prec=nullptr)
Instantiates an InverseOperator from an Operator and a configuration given as a ParameterTree.
Definition solverfactory.hh:212
Singleton< ParameterizedObjectFactory< IterativeSolverSignature< X, Y > > > IterativeSolverFactory
Definition solverfactory.hh:42
Singleton< ParameterizedObjectFactory< PreconditionerSignature< M, X, Y > > > PreconditionerFactory
Definition solverfactory.hh:36
Definition allocator.hh:11
std::shared_ptr< ScalarProduct< X > > createScalarProduct(const Comm &comm, SolverCategory::Category category)
Definition scalarproducts.hh:242
A nonoverlapping operator with communication object.
Definition construction.hh:107
Adapter to turn a matrix into a linear operator.
Definition operators.hh:136
An overlapping Schwarz operator.
Definition schwarz.hh:75
Base class for matrix free definition of preconditioners.
Definition preconditioner.hh:33
@ sequential
Category for sequential solvers.
Definition solvercategory.hh:25
Factory to assembly solvers configured by a ParameterTree.
Definition solverfactory.hh:130
static std::shared_ptr< Solver > get(std::shared_ptr< Operator > op, const ParameterTree &config, std::shared_ptr< Preconditioner > prec=nullptr)
get a solver from the factory
Definition solverfactory.hh:153
static std::shared_ptr< Preconditioner > getPreconditioner(std::shared_ptr< Operator > op, const ParameterTree &config)
Construct a Preconditioner for a given Operator.
Definition solverfactory.hh:188