6#include <boost/numeric/mtl/utility/irange.hpp>
7#include <boost/numeric/mtl/utility/iset.hpp>
8#include <boost/numeric/mtl/utility/srange.hpp>
9#include <boost/numeric/mtl/vector/strided_vector_ref.hpp>
11#include <dune/functions/functionspacebases/basistags.hh>
13#include <amdis/functions/BlockedBasisMapping.hpp>
14#include <amdis/linearalgebra/mtl/BlockMatrix.hpp>
15#include <amdis/linearalgebra/mtl/PreconditionerInterface.hpp>
21 void initMtlIndexSet(std::vector<std::size_t>
const& sizes, std::vector<mtl::irange>& indexSet)
23 indexSet.resize(sizes.size());
24 std::size_t start = 0;
25 for (std::size_t i = 0; i < sizes.size(); ++i) {
26 indexSet[i].set(start, start + sizes[i]);
31 void initMtlIndexSet(std::vector<std::size_t>
const& sizes, std::vector<mtl::srange>& indexSet)
34 std::size_t blocks = sizes.size();
35 std::size_t dimension = sizes[0];
38 std::for_each(sizes.begin(), sizes.end(), [&](std::size_t s) { assert(s == dimension); });
40 for (std::size_t i = 0; i < blocks; ++i)
41 indexSet.emplace_back(i, blocks*dimension, blocks);
44 void initMtlIndexSet(std::vector<std::size_t>
const& sizes, std::vector<mtl::iset>& indexSet)
47 std::size_t blocks = sizes.size();
48 std::size_t dimension = sizes[0];
51 std::for_each(sizes.begin(), sizes.end(), [&](std::size_t s) { assert(s == dimension); });
53 indexSet.resize(blocks);
54 for (std::size_t i = 0; i < dimension; ++i) {
55 for (std::size_t b = 0; b < blocks; ++b)
56 indexSet[b].push_back(i*blocks + b);
61 using IMS_FlatLexicographic = Dune::Functions::BasisFactory::FlatLexicographic;
62 using IMS_FlatInterleaved = Dune::Functions::BasisFactory::FlatInterleaved;
65 template <
class RowBasis,
class ColBasis>
66 class BlockPreconditionerImpl
68 using RowIMS =
typename RowBasis::PreBasis::IndexMergingStrategy;
69 using RowIndexSet = std::conditional_t<
70 std::is_same<RowIMS, IMS_FlatLexicographic>::value, mtl::irange, std::conditional_t<
71 std::is_same<RowIMS, IMS_FlatInterleaved>::value, mtl::srange,
void>>;
73 using ColIMS =
typename ColBasis::PreBasis::IndexMergingStrategy;
74 using ColIndexSet = std::conditional_t<
75 std::is_same<ColIMS, IMS_FlatLexicographic>::value, mtl::irange, std::conditional_t<
76 std::is_same<ColIMS, IMS_FlatInterleaved>::value, mtl::srange,
void>>;
80 void initIndexSets(std::vector<std::size_t>
const& rowSizes, std::vector<std::size_t>
const& colSizes)
82 initMtlIndexSet(rowSizes, rowIndexSet_);
83 initMtlIndexSet(colSizes, colIndexSet_);
86 RowIndexSet
const& rowIndices(std::size_t i)
const
88 return rowIndexSet_[i];
91 ColIndexSet
const& colIndices(std::size_t i)
const
93 return colIndexSet_[i];
98 std::vector<RowIndexSet> rowIndexSet_;
99 std::vector<ColIndexSet> colIndexSet_;
104 template <
class Basis>
105 class BlockPreconditionerImpl<Basis, Basis>
107 using IMS =
typename Basis::PreBasis::IndexMergingStrategy;
108 using IndexSet = std::conditional_t<
109 std::is_same<IMS, IMS_FlatLexicographic>::value, mtl::irange, std::conditional_t<
110 std::is_same<IMS, IMS_FlatInterleaved>::value, mtl::srange,
void>>;
114 void initIndexSets(std::vector<std::size_t>
const& rowSizes, std::vector<std::size_t>
const& )
116 initMtlIndexSet(rowSizes, indexSet_);
119 IndexSet
const& rowIndices(std::size_t i)
const
124 IndexSet
const& colIndices(std::size_t i)
const
131 std::vector<IndexSet> indexSet_;
138 template <
class M,
class V,
class RowBasis,
class ColBasis = RowBasis>
140 :
public Impl::BlockPreconditionerImpl<RowBasis, ColBasis>
147 : blockMapping_(std::move(rowBasis), std::move(colBasis))
152 : blockMapping_(std::move(rowBasis))
164 subMatrix_.copyFrom(A, blockMapping_, diagonalsOnly);
165 this->initIndexSets(subMatrix_.rowSizes_, subMatrix_.colSizes_);
173 return subMatrix_[i][j];
179 return subMatrix_[i][j];
185 template <
class Vector>
186 auto subVector(Vector&& vec, mtl::irange
const& ir)
const
188 return mtl::vec::sub_vector(FWD(vec), ir.start(), ir.finish());
195 return StridedVector{sr.size()/sr.stride(), vec.address_data() + sr.start(), sr.stride()};
201 return subVector(
const_cast<V&
>(vec), sr);
209 return subMatrix_.
rows();
215 return subMatrix_.
cols();
A block matrix supporting assignment from flat matrices.
Definition BlockMatrix.hpp:17
std::size_t rows() const
Return the number of row blocks.
Definition BlockMatrix.hpp:76
std::size_t cols() const
Return the number of columns blocks.
Definition BlockMatrix.hpp:88
Preconditioner for block-preconditioners using row/column sub-ranges.
Definition BlockPreconditioner.hpp:142
void init(M const &A) override
Initialize the preconditioner by initializing all sub precons.
Definition BlockPreconditioner.hpp:156
BlockPreconditioner(std::shared_ptr< RowBasis > rowBasis, std::shared_ptr< ColBasis > colBasis)
Constructor, constructs a block mapping for row and column basis.
Definition BlockPreconditioner.hpp:146
mtl::vec::strided_vector_ref< typename V::value_type > StridedVector
Return a view on a sub-vector block for indices given in a strided range.
Definition BlockPreconditioner.hpp:192
std::size_t rows() const
Return the number of row blocks.
Definition BlockPreconditioner.hpp:207
M & subMatrix(std::size_t i, std::size_t j)
Return the sub-matrix block (i,j)
Definition BlockPreconditioner.hpp:177
BlockPreconditioner(std::shared_ptr< RowBasis > rowBasis)
Constructor, constructs a block mapping for row and column basis.
Definition BlockPreconditioner.hpp:151
M const & subMatrix(std::size_t i, std::size_t j) const
Return the sub-matrix block (i,j)
Definition BlockPreconditioner.hpp:171
StridedVector const subVector(V const &vec, mtl::srange const &sr) const
Return a view on a sub-vector block for indices given in a strided range.
Definition BlockPreconditioner.hpp:199
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
Mapping of a pair of flat bases to the corresponding outer-level blocked bases.
Definition BlockedBasisMapping.hpp:17
Interface for Preconditioner y = M*x.
Definition PreconditionerInterface.hpp:10