13#ifndef ASSEMBLERMATRIXEXTRACTION_HH
14#define ASSEMBLERMATRIXEXTRACTION_HH
16#include "dune/common/config.h"
24 template <
class Entry,
class Allocator>
30 template <
class Entry,
class Index>
45 template <
class IdxOutIter,
class DataOutIter>
48 BlockToTriplet(
size_t firstRowBlock_,
size_t firstColumnBlock_, std::vector<size_t>
const& rowOff_, std::vector<size_t>
const& colOff_,
49 IdxOutIter& ri_, IdxOutIter& ci_, DataOutIter& xi_,
bool onlyLowerTriangle_):
50 firstRowBlock(firstRowBlock_), firstColumnBlock(firstColumnBlock_), rowOff(rowOff_), colOff(colOff_),
51 ri(ri_), ci(ci_), xi(xi_), onlyLowerTriangle(onlyLowerTriangle_)
54 template <
class MatrixBlock>
55 void operator()(MatrixBlock
const& mb)
const
58 if (inRange(mb.rowId,mb.colId))
60 rowOff[MatrixBlock::rowId-firstRowBlock],colOff[MatrixBlock::colId-firstColumnBlock],
61 mb.rowId==mb.colId && onlyLowerTriangle,
67 if (MatrixBlock::mirror && inRange(mb.colId,mb.rowId) && onlyLowerTriangle==
false)
69 colOff[MatrixBlock::rowId-firstColumnBlock],rowOff[MatrixBlock::colId-firstRowBlock],
74 bool inRange(
size_t r,
size_t c)
const
76 return r>=firstRowBlock && r<firstRowBlock+rowOff.size() && c>=firstColumnBlock && c<firstColumnBlock+colOff.size();
80 size_t firstRowBlock, firstColumnBlock;
81 std::vector<size_t>
const& rowOff;
82 std::vector<size_t>
const& colOff;
86 bool onlyLowerTriangle;
114 template <
class Matrix>
struct Fill;
124 template <
class Scalar,
class SparseIndexInt>
129 template <
class MatrixBlockArray>
131 size_t firstRowBlock,
size_t firstColumnBlock,
132 std::vector<size_t>
const& rowOff, std::vector<size_t>
const& colOff,
133 bool extractOnlyLowerTriangle,
size_t nnz,
size_t,
size_t)
138 columnIterator = result.
cidx.begin();
143 rowIterator,columnIterator,dataIterator, extractOnlyLowerTriangle));
157 template <
class Scalar,
class Allocator>
158 struct Fill<
Dune::BCRSMatrix<Dune::FieldMatrix<Scalar,1,1>,Allocator> >
160 typedef Dune::BCRSMatrix<Dune::FieldMatrix<Scalar,1,1>,Allocator>
Matrix;
162 template <
class MatrixBlockArray>
163 static Matrix apply(MatrixBlockArray
const& block,
size_t firstRowBlock,
size_t firstColumnBlock,
164 std::vector<size_t>
const& rowOff, std::vector<size_t>
const& colOff,
165 bool onlyLowerTriangle,
size_t nnz,
size_t nrows,
size_t ncols)
169 Triplet triplet(
Fill<Triplet>::apply(block, firstRowBlock, firstColumnBlock, rowOff, colOff, onlyLowerTriangle, nnz, nrows, ncols) );
174 Matrix result(nrows,ncols,nnz,Matrix::row_wise);
176 for (
typename Matrix::CreateIterator row=result.createbegin(); row!=result.createend(); ++row)
177 for(
size_t col = 0; col < bcrsids[row.index()].size(); ++col)
178 row.insert(bcrsids[row.index()][col]);
181 for (
size_t i=0; i<nnz; ++i)
182 result[triplet.ridx[i]][triplet.cidx[i]] = triplet.data[i];
195 template <
class Scalar,
class Index>
200 template <
class MatrixBlockArray>
201 static Matrix apply(MatrixBlockArray
const& block,
size_t firstRowBlock,
size_t firstColumnBlock,
202 std::vector<size_t>
const& rowOff, std::vector<size_t>
const& colOff,
203 bool onlyLowerTriangle,
size_t nnz,
size_t nrows,
size_t ncols)
207 Triplet triplet(
Fill<Triplet>::apply(block, firstRowBlock, firstColumnBlock, rowOff, colOff, onlyLowerTriangle, nnz, nrows, ncols) );
210 return Matrix(triplet,onlyLowerTriangle,
false,onlyLowerTriangle);
std::vector< SparseIndexInt > ridx
row indices
std::vector< SparseIndexInt > cidx
column indices
std::vector< Scalar > data
data
std::vector< SparseIndexInt >::iterator index_iterator
std::vector< Scalar >::iterator iterator
A NUMA-aware compressed row storage matrix adhering mostly to the Dune ISTL interface (to complete....
std::vector< std::vector< SparseInt > > getBCRSIndicesFromTriplet(SparseInt nrows, std::vector< SparseInt > const &ridx, std::vector< SparseInt > const &cidx, int nr=1, int nc=1)
Sorts the sparse matrix nonzero positions into row buckets.
static Matrix apply(MatrixBlockArray const &block, size_t firstRowBlock, size_t firstColumnBlock, std::vector< size_t > const &rowOff, std::vector< size_t > const &colOff, bool onlyLowerTriangle, size_t nnz, size_t nrows, size_t ncols)
Dune::BCRSMatrix< Dune::FieldMatrix< Scalar, 1, 1 >, Allocator > Matrix
MatrixAsTriplet< Scalar, SparseIndexInt > Matrix
static Matrix apply(MatrixBlockArray const &block, size_t firstRowBlock, size_t firstColumnBlock, std::vector< size_t > const &rowOff, std::vector< size_t > const &colOff, bool extractOnlyLowerTriangle, size_t nnz, size_t, size_t)
NumaBCRSMatrix< Dune::FieldMatrix< Scalar, 1, 1 >, Index > Matrix
static Matrix apply(MatrixBlockArray const &block, size_t firstRowBlock, size_t firstColumnBlock, std::vector< size_t > const &rowOff, std::vector< size_t > const &colOff, bool onlyLowerTriangle, size_t nnz, size_t nrows, size_t ncols)
Specialize this template for your matrix type in order to use it with VariationalFunctionalAssembler:...
A class template that supports converting certain Dune matrices into the coordinate (triplet) format.