5#ifndef DUNE_ISTL_MATRIXMATRIX_HH
6#define DUNE_ISTL_MATRIXMATRIX_HH
11#include <dune/common/fmatrix.hh>
12#include <dune/common/timer.hh>
38 struct NonzeroPatternTraverser
43 struct NonzeroPatternTraverser<0>
45 template<
class T,
class A1,
class A2,
class F,
int n,
int m,
int k>
46 static void traverse(
const Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>& A,
47 const Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>& B,
51 DUNE_THROW(ISTLError,
"The sizes of the matrices do not match: "<<A.M()<<
"!="<<B.N());
53 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstRowIterator Row;
54 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,k>,A1>::ConstColIterator Col;
55 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
56 for(Row row= A.begin(); row != A.end(); ++row) {
58 for(Col
col = row->begin();
col != row->end(); ++
col) {
61 for(BCol bcol = B[
col.index()].begin(); bcol != B[
col.index()].end(); ++bcol) {
62 func(*
col, *bcol, row.index(), bcol.index());
71 struct NonzeroPatternTraverser<1>
73 template<
class T,
class A1,
class A2,
class F,
int n,
int m,
int k>
74 static void traverse(
const Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>& A,
75 const Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>& B,
80 DUNE_THROW(ISTLError,
"The sizes of the matrices do not match: "<<A.N()<<
"!="<<B.N());
82 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstRowIterator Row;
83 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,n>,A1>::ConstColIterator Col;
84 typedef typename Dune::BCRSMatrix<Dune::FieldMatrix<T,k,m>,A2>::ConstColIterator BCol;
86 for(Row row=A.begin(); row!=A.end(); ++row) {
87 for(Col
col=row->begin();
col!=row->end(); ++
col) {
88 for(BCol bcol = B[row.index()].begin(); bcol != B[row.index()].end(); ++bcol) {
89 func(*
col, *bcol,
col.index(), bcol.index());
97 struct NonzeroPatternTraverser<2>
99 template<
class T,
class A1,
class A2,
class F,
int n,
int m,
int k>
100 static void traverse(
const BCRSMatrix<FieldMatrix<T,n,m>,A1>& mat,
101 const BCRSMatrix<FieldMatrix<T,k,m>,A2>& matt,
104 if(mat.M()!=matt.M())
105 DUNE_THROW(ISTLError,
"The sizes of the matrices do not match: "<<mat.M()<<
"!="<<matt.M());
107 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstRowIterator row_iterator;
108 typedef typename BCRSMatrix<FieldMatrix<T,n,m>,A1>::ConstColIterator col_iterator;
109 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstRowIterator row_iterator_t;
110 typedef typename BCRSMatrix<FieldMatrix<T,k,m>,A2>::ConstColIterator col_iterator_t;
112 for(row_iterator mrow=mat.begin(); mrow != mat.end(); ++mrow) {
119 for(row_iterator_t mtcol=matt.begin(); mtcol != matt.end(); ++mtcol) {
122 col_iterator_t mtrow=mtcol->begin();
123 bool funcCalled =
false;
124 for(col_iterator mcol=mrow->begin(); mcol != mrow->end(); ++mcol) {
127 for( ; mtrow != mtcol->end(); ++mtrow)
128 if(mtrow.index()>=mcol.index())
130 if(mtrow != mtcol->end() && mtrow.index()==mcol.index()) {
131 func(*mcol, *mtrow, mtcol.index());
151 template<
class T,
class A,
int n,
int m>
152 class SparsityPatternInitializer
163 template<
class T1,
class T2>
164 void operator()(
const T1&,
const T2&,
size_type j)
181 template<
int transpose,
class T,
class TA,
int n,
int m>
182 class MatrixInitializer
193 template<
class T1,
class T2>
194 void operator()(
const T1&,
const T2&,
int)
205 std::size_t nonzeros()
210 template<
class A1,
class A2,
int n2,
int m2,
int n3,
int m3>
211 void initPattern(
const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>& mat1,
212 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>& mat2)
214 SparsityPatternInitializer<T, TA, n, m> sparsity(A.createbegin());
215 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,sparsity);
223 template<
class T,
class TA,
int n,
int m>
224 class MatrixInitializer<1,T,TA,n,m>
233 : A(A_), entries(rows)
236 template<
class T1,
class T2>
239 entries[i].insert(j);
248 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
249 for(Iter iter = entries.begin(); iter != entries.end(); ++iter)
253 template<
class A1,
class A2,
int n2,
int m2,
int n3,
int m3>
254 void initPattern(
const BCRSMatrix<FieldMatrix<T,n2,m2>,A1>&,
255 const BCRSMatrix<FieldMatrix<T,n3,m3>,A2>&)
257 typedef typename std::vector<std::set<size_t> >::const_iterator Iter;
259 for(Iter iter = entries.begin(); iter != entries.end(); ++iter, ++citer) {
260 typedef std::set<size_t>::const_iterator SetIter;
261 for(SetIter index=iter->begin(); index != iter->end(); ++index)
262 citer.insert(*index);
268 std::vector<std::set<size_t> > entries;
271 template<
class T,
class TA,
int n,
int m>
272 struct MatrixInitializer<0,T,TA,n,m>
273 :
public MatrixInitializer<1,T,TA,n,m>
275 MatrixInitializer(Dune::BCRSMatrix<Dune::FieldMatrix<T,n,m>,TA>& A_,
276 typename Dune::BCRSMatrix<Dune::FieldMatrix<T,n,m>,TA>
::size_type rows)
277 : MatrixInitializer<1,T,TA,n,m>(A_,rows)
282 template<
class T,
class T1,
class T2,
int n,
int m,
int k>
291 res[row][
col]+=mat[row][i]*matt[
col][i];
295 template<
class T,
class T1,
class T2,
int n,
int m,
int k>
303 res[row][
col]+=mat[i][row]*matt[i][
col];
307 template<
class T,
class T1,
class T2,
int n,
int m,
int k>
315 res[row][
col]+=mat[row][i]*matt[i][
col];
320 template<
class T,
class A,
int n,
int m>
321 class EntryAccumulatorFather
329 EntryAccumulatorFather(
Matrix& mat_)
330 :
mat(mat_), row(
mat.begin())
354 template<
class T,
class A,
int n,
int m,
int transpose>
355 class EntryAccumulator
356 :
public EntryAccumulatorFather<T,A,n,m>
362 EntryAccumulator(
Matrix& mat_)
363 : EntryAccumulatorFather<T,A,n,m>(mat_)
366 template<
class T1,
class T2>
367 void operator()(
const T1& t1,
const T2& t2,
size_type i)
369 assert(this->
col.index()==i);
370 addMatMultMat(*(this->
col),t1,t2);
374 template<
class T,
class A,
int n,
int m>
375 class EntryAccumulator<T,A,n,m,0>
376 :
public EntryAccumulatorFather<T,A,n,m>
382 EntryAccumulator(
Matrix& mat_)
383 : EntryAccumulatorFather<T,A,n,m>(mat_)
386 template<
class T1,
class T2>
389 addMatMultMat(this->mat[i][j], t1, t2);
393 template<
class T,
class A,
int n,
int m>
394 class EntryAccumulator<T,A,n,m,1>
395 :
public EntryAccumulatorFather<T,A,n,m>
401 EntryAccumulator(
Matrix& mat_)
402 : EntryAccumulatorFather<T,A,n,m>(mat_)
405 template<
class T1,
class T2>
408 addTransposeMatMultMat(this->mat[i][j], t1, t2);
412 template<
class T,
class A,
int n,
int m>
413 class EntryAccumulator<T,A,n,m,2>
414 :
public EntryAccumulatorFather<T,A,n,m>
420 EntryAccumulator(
Matrix& mat_)
421 : EntryAccumulatorFather<T,A,n,m>(mat_)
424 template<
class T1,
class T2>
425 void operator()(
const T1& t1,
const T2& t2, [[maybe_unused]]
size_type i)
427 assert(this->
col.index()==i);
428 addMatMultTransposeMat(*this->
col,t1,t2);
433 template<
int transpose>
438 struct SizeSelector<0>
440 template<
class M1,
class M2>
441 static std::tuple<typename M1::size_type, typename M2::size_type>
442 size(
const M1& m1,
const M2& m2)
444 return std::make_tuple(m1.N(), m2.M());
449 struct SizeSelector<1>
451 template<
class M1,
class M2>
452 static std::tuple<typename M1::size_type, typename M2::size_type>
453 size(
const M1& m1,
const M2& m2)
455 return std::make_tuple(m1.M(), m2.M());
461 struct SizeSelector<2>
463 template<
class M1,
class M2>
464 static std::tuple<typename M1::size_type, typename M2::size_type>
465 size(
const M1& m1,
const M2& m2)
467 return std::make_tuple(m1.N(), m2.N());
471 template<
int transpose,
class T,
class A,
class A1,
class A2,
int n1,
int m1,
int n2,
int m2,
int n3,
int m3>
477 std::tie(rows,cols)=SizeSelector<transpose>::size(mat1, mat2);
478 MatrixInitializer<transpose,T,A,n1,m1> patternInit(res, rows);
480 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,patternInit);
481 res.setSize(rows, cols, patternInit.nonzeros());
488 patternInit.initPattern(mat1, mat2);
494 EntryAccumulator<T,A,n1,m1, transpose> entriesAccu(res);
495 NonzeroPatternTraverser<transpose>::traverse(mat1,mat2,entriesAccu);
508 template<
typename M1,
typename M2>
512 template<
typename T,
int n,
int k,
int m>
518 template<
typename T,
typename A,
typename A1,
int n,
int k,
int m>
533 template<
typename M1,
typename M2>
537 template<
typename T,
int n,
int k,
int m>
543 template<
typename T,
typename A,
typename A1,
int n,
int k,
int m>
559 template<
class T,
class A,
class A1,
class A2,
int n,
int m,
int k>
574 template<
class T,
class A,
class A1,
class A2,
int n,
int m,
int k>
589 template<
class T,
class A,
class A1,
class A2,
int n,
int m,
int k>
Implementation of the BCRSMatrix class.
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:379
FieldMatrix< T, n, m > type
Definition matrixmatrix.hh:515
void transposeMatMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, k, n >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
Calculate product of a transposed sparse matrix with another sparse matrices ( ).
Definition matrixmatrix.hh:590
*The type for the index access and the size typedef A::size_type size_type
Definition bcrsmatrix.hh:497
void matMultMat(BCRSMatrix< FieldMatrix< T, n, m >, A > &res, const BCRSMatrix< FieldMatrix< T, n, k >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
Calculate product of two sparse matrices ( ).
Definition matrixmatrix.hh:575
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:359
Matrix::RowIterator Row
Definition matrixmatrix.hh:326
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:417
Dune::BCRSMatrix< Dune::FieldMatrix< T, n, m >, TA > Matrix
Definition matrixmatrix.hh:228
Matrix::size_type size_type
Definition matrixmatrix.hh:360
Matrix::size_type size_type
Definition matrixmatrix.hh:380
Matrix::ColIterator Col
Definition matrixmatrix.hh:327
Matrix::size_type size_type
Definition matrixmatrix.hh:188
Col col
Definition matrixmatrix.hh:351
Matrix & mat
Definition matrixmatrix.hh:347
Matrix::size_type size_type
Definition matrixmatrix.hh:230
FieldMatrix< T, n, m > type
Definition matrixmatrix.hh:540
void matMultTransposeMat(BCRSMatrix< FieldMatrix< T, n, k >, A > &res, const BCRSMatrix< FieldMatrix< T, n, m >, A1 > &mat, const BCRSMatrix< FieldMatrix< T, k, m >, A2 > &matt, bool tryHard=false)
Calculate product of a sparse matrix with a transposed sparse matrices ( ).
Definition matrixmatrix.hh:560
BCRSMatrix< FieldMatrix< T, n, m >, A >::CreateIterator CreateIterator
Definition matrixmatrix.hh:156
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:398
Dune::BCRSMatrix< FieldMatrix< T, n, m >, TA > Matrix
Definition matrixmatrix.hh:186
BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type > > type
Definition matrixmatrix.hh:522
Matrix::CreateIterator CreateIterator
Definition matrixmatrix.hh:229
BCRSMatrix< FieldMatrix< T, n, m >, A > Matrix
Definition matrixmatrix.hh:325
Matrix::size_type size_type
Definition matrixmatrix.hh:399
Matrix::CreateIterator CreateIterator
Definition matrixmatrix.hh:187
BCRSMatrix< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type, std::allocator< typename MatMultMatResult< FieldMatrix< T, n, k >, FieldMatrix< T, k, m > >::type > > type
Definition matrixmatrix.hh:547
Matrix::size_type size_type
Definition matrixmatrix.hh:418
BCRSMatrix< FieldMatrix< T, n, m >, A >::size_type size_type
Definition matrixmatrix.hh:157
@ do_break
Definition matrixmatrix.hh:185
@ do_break
Definition matrixmatrix.hh:227
@ do_break
Definition matrixmatrix.hh:324
@ row_wise
Build in a row-wise manner.
Definition bcrsmatrix.hh:517
@ do_break
Definition matrixmatrix.hh:155
Definition allocator.hh:11
MatrixSparsityPatternGatherScatter< M, I >::ColIter MatrixSparsityPatternGatherScatter< M, I >::col
Definition matrixredistribute.hh:591
A::size_type size_type
Type for indices and sizes.
Definition matrix.hh:577
row_type::iterator ColIterator
Iterator for the entries of each row.
Definition matrix.hh:583
MatrixImp::DenseMatrixBase< T, A >::Iterator RowIterator
Iterator over the matrix rows.
Definition matrix.hh:580
Helper TMP to get the result type of a sparse matrix matrix multiplication ( ).
Definition matrixmatrix.hh:510
Helper TMP to get the result type of a sparse matrix matrix multiplication ( ).
Definition matrixmatrix.hh:535
Definition matrixutils.hh:24
Definition matrixutils.hh:27