8#include <boost/numeric/mtl/utility/property_map.hpp>
9#include <boost/numeric/mtl/utility/range_wrapper.hpp>
11#include <amdis/CreatorInterface.hpp>
12#include <amdis/CreatorMap.hpp>
13#include <amdis/Initfile.hpp>
14#include <amdis/linearalgebra/mtl/BlockPreconditioner.hpp>
15#include <amdis/linearalgebra/mtl/MatrixBackend.hpp>
16#include <amdis/linearalgebra/mtl/VectorBackend.hpp>
21 template <
class M,
class V,
class Basis>
38 Creator(std::shared_ptr<Basis> basis)
39 : basis_(std::move(basis))
44 return std::make_unique<Self>(std::move(prefix), basis_);
47 std::shared_ptr<Basis> basis_;
53 :
Super(std::move(basis))
54 , prefix_(std::move(prefix))
58 void init(M
const& A)
override
68 subPrecon_.resize(
rows());
69 for (std::size_t i = 0; i < subPrecon_.size(); ++i) {
70 std::string subPreconName =
"default";
71 std::string subPreconPrefix = prefix_ +
"->sub precon[" + std::to_string(i) +
"]";
75 subPrecon_[i] = named(subCreator)->createWithString(subPreconPrefix);
85 void finishSubPrecons()
87 for (std::size_t i = 0; i < subPrecon_.size(); ++i)
96 void solve(X
const& x, Y& y)
const override
98 y.checked_change_resource(x);
100 for (std::size_t i = 0; i <
rows(); ++i)
103 Y y_i(resource(x_i));
105 subPrecon_[i]->solve(x_i, y_i);
117 y.checked_change_resource(x);
119 for (std::size_t i = 0; i <
cols(); ++i)
122 Y y_i(resource(x_i));
124 subPrecon_[i]->adjoint_solve(x_i, y_i);
135 std::vector<std::shared_ptr<PreconBase>> subPrecon_;
139 template <
class T =
double,
class Basis>
140 void registerBlockDiagonalPreconditioner(std::shared_ptr<Basis>
const& basis, std::string name =
"block_diag")
144 using Creator =
typename BlockDiagonalPreconditioner<M, V, Basis>::Creator;
Preconditioner that applies a precon for each diagonal block.
Definition BlockDiagonalPreconditioner.hpp:24
void init(M const &A) override
Extract the diagonal blocks of the fullMatrix into new matrices.
Definition BlockDiagonalPreconditioner.hpp:58
BlockDiagonalPreconditioner(std::string prefix, std::shared_ptr< Basis > basis)
Constructor.
Definition BlockDiagonalPreconditioner.hpp:52
void finish() override
Is called at the end of a solution procedure.
Definition BlockDiagonalPreconditioner.hpp:80
void adjoint_solve(X const &x, Y &y) const override
Apply the adjoint preconditioners block-wise.
Definition BlockDiagonalPreconditioner.hpp:115
void solve(X const &x, Y &y) const override
Apply the preconditioners block-wise.
Definition BlockDiagonalPreconditioner.hpp:96
Preconditioner for block-preconditioners using row/column sub-ranges.
Definition BlockPreconditioner.hpp:142
std::size_t rows() const
Return the number of row blocks.
Definition BlockPreconditioner.hpp:207
M const & subMatrix(std::size_t i, std::size_t j) const
Return the sub-matrix block (i,j)
Definition BlockPreconditioner.hpp:171
auto subVector(Vector &&vec, mtl::irange const &ir) const
Return a view on a sub-vector block for indices given in a range.
Definition BlockPreconditioner.hpp:186
std::size_t cols() const
Return the number of columns blocks.
Definition BlockPreconditioner.hpp:213
void initBlocks(M const &A, bool diagonalsOnly=false)
Fill block matrices from fullMatrix.
Definition BlockPreconditioner.hpp:162
Interface for creators with name.
Definition CreatorInterface.hpp:44
static CreatorInterface< BaseClass > * get(std::string key, std::string initFileStr)
Creates a object of the type corresponding to key.
Definition CreatorMap.hpp:44
static void addCreator(std::string key, CreatorInterface< BaseClass > *creator)
Adds a new creator together with the given key to the map.
Definition CreatorMap.hpp:36
static std::optional< T > get(std::string const &key)
Get parameter-values from parameter-tree.
Definition Initfile.hpp:31
mtl::compressed2D< T > BaseMatrix
The matrix type of the underlying base matrix.
Definition MatrixBackend.hpp:28
mtl::dense_vector< T > BaseVector
The type of the base vector.
Definition VectorBackend.hpp:25
Interface for Preconditioner y = M*x.
Definition PreconditionerInterface.hpp:10
A creator to be used instead of the constructor.
Definition BlockDiagonalPreconditioner.hpp:35
std::unique_ptr< Interface > createWithString(std::string prefix) override
Must be implemented by sub classes of CreatorInterfaceName. Creates a new instance of the sub class o...
Definition BlockDiagonalPreconditioner.hpp:42