Go to the documentation of this file.
3 #ifndef DUNE_ISTL_MATRIXUTILS_HH
4 #define DUNE_ISTL_MATRIXUTILS_HH
9 #include <dune/common/typetraits.hh>
10 #include <dune/common/fmatrix.hh>
11 #include <dune/common/dynmatrix.hh>
12 #include <dune/common/diagonalmatrix.hh>
13 #include <dune/common/unused.hh>
21 template<
typename B,
typename A>
24 template<
typename K,
int n,
int m>
27 template<
class T,
class A>
47 static typename M::size_type count(
const M& matrix)
49 typedef typename M::ConstRowIterator RowIterator;
51 RowIterator endRow = matrix.end();
52 typename M::size_type nonZeros = 0;
54 for(RowIterator row = matrix.begin(); row != endRow; ++row) {
55 typedef typename M::ConstColIterator Entry;
56 Entry endEntry = row->end();
57 for(Entry entry = row->begin(); entry != endEntry; ++entry) {
58 nonZeros += NonZeroCounter<i-1>::count(*entry);
66 struct NonZeroCounter<1>
69 static typename M::size_type count(
const M& matrix)
71 return matrix.N()*matrix.M();
81 template<
class Matrix, std::
size_t blocklevel, std::
size_t l=blocklevel>
90 DUNE_UNUSED_PARAMETER(
mat);
91 #ifdef DUNE_ISTL_WITH_CHECKING
94 for(Row row =
mat.begin(); row!=
mat.end(); ++row) {
95 Entry diagonal = row->find(row.index());
96 if(diagonal==row->end())
97 DUNE_THROW(
ISTLError,
"Missing diagonal value in row "<<row.index()
98 <<
" at block recursion level "<<l-blocklevel);
106 template<
class Matrix, std::
size_t l>
112 for(Row row =
mat.begin(); row!=
mat.end(); ++row) {
113 if(row->find(row.index())==row->end())
114 DUNE_THROW(
ISTLError,
"Missing diagonal value in row "<<row.index()
115 <<
" at block recursion level "<<l);
120 template<
typename FirstRow,
typename... Args>
123 template<std::size_t blocklevel, std::size_t l,
typename T1,
typename... Args>
135 #ifdef DUNE_ISTL_WITH_CHECKING
155 return NonZeroCounter<M::blocklevel>::count(matrix);
166 template<
class G,
class M>
167 bool operator()(
const std::pair<G,M>& p1,
const std::pair<G,M>& p2)
const
169 return p1.first<p2.first;
174 template<
class M,
class C>
177 typedef typename C::ParallelIndexSet::const_iterator IIter;
178 typedef typename C::OwnerSet OwnerSet;
179 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex;
183 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
185 gmax=std::max(gmax,idx->global());
187 gmax=ooc.communicator().max(gmax);
188 ooc.buildGlobalLookup();
190 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
192 if(OwnerSet::contains(idx->local().attribute()))
194 typedef typename M::block_type Block;
196 std::set<std::pair<GlobalIndex,Block>,CompPair> entries;
199 typedef typename M::ConstColIterator CIter;
200 for(CIter c=
mat[idx->local()].
begin(), cend=
mat[idx->local()].
end();
202 const typename C::ParallelIndexSet::IndexPair* pair
203 =ooc.globalLookup().pair(c.index());
205 entries.insert(std::make_pair(pair->global(), *c));
209 GlobalIndex rowidx = idx->global();
210 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
212 cur=ooc.communicator().min(rowidx);
215 typedef typename std::set<std::pair<GlobalIndex,Block>,CompPair>::iterator SIter;
216 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s)
217 os<<idx->global()<<
" "<<s->first<<
" "<<s->second<<std::endl;
223 ooc.freeGlobalLookup();
225 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
226 while(cur!=ooc.communicator().min(cur)) ;
230 struct MatrixDimension
234 template<
typename B,
typename TA>
243 const B* row = A.r[i].getptr();
256 if (A.j_.get()[k] == c) {
266 B* a = A.r[i].getptr();
267 for (
size_type k=0; k<A.r[i].getsize(); k++)
292 std::vector<size_type> coldims(A.M(),
293 std::numeric_limits<size_type>::max());
295 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row)
296 for (ConstColIterator
col=row->begin();
col!=row->end(); ++
col)
298 if (coldims[
col.index()]==std::numeric_limits<size_type>::max())
302 for (
typename std::vector<size_type>::iterator it=coldims.begin();
303 it!=coldims.end(); ++it)
313 template<
typename B,
int n,
int m,
typename TA>
338 template<
typename K,
int n,
int m>
392 template<
typename K,
int n,
int m,
typename TA>
419 template<
typename K,
int n>
446 template<
typename K,
int n>
499 template<
typename T,
typename A>
static size_type rowdim(const Matrix &A, size_type i)
Definition: matrixutils.hh:241
static size_type coldim(const Matrix &)
Definition: matrixutils.hh:467
A Matrix class to support different block types.
Definition: matrixutils.hh:121
Matrix< FieldMatrix< K, n, m >, TA > ThisMatrix
Definition: matrixutils.hh:395
static size_type rowdim(const Matrix &A)
Definition: matrixutils.hh:329
ThisMatrix::size_type size_type
Definition: matrixutils.hh:396
static size_type rowdim(const Matrix &, size_type)
Definition: matrixutils.hh:319
ScaledIdentityMatrix< K, n > Matrix
Definition: matrixutils.hh:449
static size_type rowdim(const MatrixType &, size_type)
Definition: matrixutils.hh:371
A::size_type size_type
Type for indices and sizes.
Definition: matrix.hh:571
RowIterator end()
Get iterator to one beyond last row.
Definition: matrix.hh:615
Matrix & mat
Definition: matrixmatrix.hh:345
FieldMatrix< K, n, m > Matrix
Definition: matrixutils.hh:341
static size_type rowdim(const Matrix &A)
Definition: matrixutils.hh:278
static size_type coldim(const Matrix &A)
Definition: matrixutils.hh:285
static void check(const Matrix &mat)
Definition: matrixutils.hh:109
static size_type rowdim(const Matrix &, size_type)
Definition: matrixutils.hh:425
A generic dynamic dense matrix.
Definition: matrix.hh:554
static void check(const Matrix &)
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition: matrixutils.hh:133
static size_type coldim(const Matrix &A)
Definition: matrixutils.hh:333
A multiple of the identity matrix of static size.
Definition: scaledidmatrix.hh:27
Definition: matrixutils.hh:511
@ value
True if T is an ISTL matrix.
Definition: matrixutils.hh:483
int countNonZeros(const M &matrix)
Get the number of nonzero fields in the matrix.
Definition: matrixutils.hh:153
static size_type coldim(const Matrix &)
Definition: matrixutils.hh:440
Definition: matrixutils.hh:25
BCRSMatrix< B, TA > Matrix
Definition: matrixutils.hh:237
ConstIterator class for sequential access.
Definition: matrix.hh:397
A sparse block matrix with compressed row storage.
Definition: bcrsmatrix.hh:422
A::size_type size_type
The type for the index access and the size.
Definition: bcrsmatrix.hh:457
Matrix::size_type size_type
Definition: matrixutils.hh:317
Dune::DynamicMatrix< T > MatrixType
Definition: matrixutils.hh:368
Iterator access to matrix rows
Definition: bcrsmatrix.hh:536
Matrix::size_type size_type
Definition: matrixutils.hh:239
static size_type rowdim(const ThisMatrix &A)
Definition: matrixutils.hh:408
static size_type coldim(const Matrix &, size_type)
Definition: matrixutils.hh:430
static size_type coldim(const MatrixType &, size_type)
Definition: matrixutils.hh:376
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition: matrix.hh:583
RowIterator begin()
Get iterator to first row.
Definition: matrix.hh:609
static size_type rowdim(const Matrix &, size_type)
Definition: matrixutils.hh:344
static size_type rowdim(const MatrixType &A)
Definition: matrixutils.hh:381
Test whether a type is an ISTL Matrix.
Definition: matrixutils.hh:477
Matrix::size_type size_type
Definition: matrixutils.hh:450
static size_type rowdim(const ThisMatrix &, size_type)
Definition: matrixutils.hh:398
DiagonalMatrix< K, n > Matrix
Definition: matrixutils.hh:422
MatrixType::size_type size_type
Definition: matrixutils.hh:369
void printGlobalSparseMatrix(const M &mat, C &ooc, std::ostream &os)
Definition: matrixutils.hh:175
Matrix::size_type size_type
Definition: matrixutils.hh:423
static void check(const Matrix &mat)
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition: matrixutils.hh:88
This file implements a quadratic matrix of fixed size which is a multiple of the identity.
static size_type coldim(const MatrixType &A)
Definition: matrixutils.hh:386
row_type::ConstIterator ConstColIterator
Const iterator to the entries of a row.
Definition: bcrsmatrix.hh:700
bool operator()(const T *l, const T *r)
Definition: matrixutils.hh:513
static size_type rowdim(const Matrix &)
Definition: matrixutils.hh:354
static size_type coldim(const Matrix &A, size_type c)
Definition: matrixutils.hh:250
BCRSMatrix< FieldMatrix< B, n, m >,TA > Matrix
Definition: matrixutils.hh:316
static size_type coldim(const ThisMatrix &A)
Definition: matrixutils.hh:413
std::size_t size_type
The type used for the index access and size operations.
Definition: scaledidmatrix.hh:41
static size_type rowdim(const Matrix &)
Definition: matrixutils.hh:435
B block_type
export the type representing the components
Definition: bcrsmatrix.hh:448
static size_type coldim(const Matrix &, size_type)
Definition: matrixutils.hh:324
static size_type coldim(const Matrix &, size_type)
Definition: matrixutils.hh:349
Definition: allocator.hh:7
static size_type rowdim(const Matrix &, size_type)
Definition: matrixutils.hh:452
static size_type rowdim(const Matrix &)
Definition: matrixutils.hh:462
static size_type coldim(const ThisMatrix &, size_type)
Definition: matrixutils.hh:403
Matrix::size_type size_type
Definition: matrixutils.hh:342
Matrix::block_type block_type
Definition: matrixutils.hh:238
static size_type coldim(const Matrix &, size_type)
Definition: matrixutils.hh:457
Col col
Definition: matrixmatrix.hh:349
Definition: bcrsmatrix.hh:70
static size_type coldim(const Matrix &)
Definition: matrixutils.hh:359
derive error class from the base class in common
Definition: istlexception.hh:16
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition: matrixutils.hh:82
MultiTypeBlockMatrix< T1, Args... > Matrix
Definition: matrixutils.hh:127