3#ifndef DUNE_MATRIX_UTILS_HH
4#define DUNE_MATRIX_UTILS_HH
15#include "istlexception.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>
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())
98 <<
" at block recursion level "<<l-blocklevel);
106 template<
class Matrix, std::
size_t l>
107 struct CheckIfDiagonalPresent<Matrix,0,l>
109 static void check(
const Matrix& mat)
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 T1,
typename T2,
typename T3,
typename T4,
typename T5,
121 typename T6,
typename T7,
typename T8,
typename T9>
122 class MultiTypeBlockMatrix;
124 template<
typename T1,
typename T2,
typename T3,
typename T4,
typename T5,
125 typename T6,
typename T7,
typename T8,
typename T9, std::size_t blocklevel, std::size_t l>
126 struct CheckIfDiagonalPresent<MultiTypeBlockMatrix<T1,T2,T3,T4,T5,T6,T7,T8,T9>,
129 typedef MultiTypeBlockMatrix<T1,T2,T3,T4,T5,T6,T7,T8,T9> Matrix;
135 static void check(
const Matrix& mat)
137#ifdef DUNE_ISTL_WITH_CHECKING
157 return NonZeroCounter<M::blocklevel>::count(matrix);
168 template<
class G,
class M>
169 bool operator()(
const std::pair<G,M>& p1,
const std::pair<G,M>& p2)
171 return p1.first<p2.first;
176 template<
class M,
class C>
177 void printGlobalSparseMatrix(
const M& mat, C& ooc, std::ostream& os)
179 typedef typename C::ParallelIndexSet::const_iterator IIter;
180 typedef typename C::OwnerSet OwnerSet;
181 typedef typename C::ParallelIndexSet::GlobalIndex GlobalIndex;
185 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
187 gmax=std::max(gmax,idx->global());
189 gmax=ooc.communicator().max(gmax);
190 ooc.buildGlobalLookup();
192 for(IIter idx=ooc.indexSet().begin(), eidx=ooc.indexSet().end();
194 if(OwnerSet::contains(idx->local().attribute()))
196 typedef typename M::block_type Block;
198 std::set<std::pair<GlobalIndex,Block>,CompPair> entries;
201 typedef typename M::ConstColIterator CIter;
202 for(CIter c=mat[idx->local()].begin(), cend=mat[idx->local()].end();
204 const typename C::ParallelIndexSet::IndexPair* pair
205 =ooc.globalLookup().pair(c.index());
207 entries.insert(std::make_pair(pair->global(), *c));
211 GlobalIndex rowidx = idx->global();
212 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
214 cur=ooc.communicator().min(rowidx);
217 typedef typename std::set<std::pair<GlobalIndex,Block>,CompPair>::iterator SIter;
218 for(SIter s=entries.begin(), send=entries.end(); s!=send; ++s)
219 os<<idx->global()<<
" "<<s->first<<
" "<<s->second<<std::endl;
225 ooc.freeGlobalLookup();
227 GlobalIndex cur=std::numeric_limits<GlobalIndex>::max();
228 while(cur!=ooc.communicator().min(cur)) ;
232 struct MatrixDimension
236 template<
typename B,
typename TA>
237 struct MatrixDimension<BCRSMatrix<B,TA> >
239 typedef BCRSMatrix<B,TA> Matrix;
243 static size_type rowdim (
const Matrix& A, size_type i)
245 const B* row = A.r[i].getptr();
247 return MatrixDimension<block_type>::rowdim(*row);
252 static size_type coldim (
const Matrix& A, size_type c)
257 for (size_type k=0; k<A.nnz; k++) {
258 if (A.j.get()[k]==c) {
259 return MatrixDimension<block_type>::coldim(A.a[k]);
265 for (size_type i=0; i<A.N(); i++)
267 size_type* j = A.r[i].getindexptr();
268 B* a = A.r[i].getptr();
269 for (size_type k=0; k<A.r[i].getsize(); k++)
271 return MatrixDimension<block_type>::coldim(a[k]);
280 static size_type rowdim (
const Matrix& A){
282 for (size_type i=0; i<A.N(); i++)
287 static size_type coldim (
const Matrix& A){
294 std::vector<size_type> coldims(A.M(),
295 std::numeric_limits<size_type>::max());
297 for (ConstRowIterator row=A.begin(); row!=A.end(); ++row)
298 for (ConstColIterator col=row->begin(); col!=row->end(); ++col)
300 if (coldims[col.index()]==std::numeric_limits<size_type>::max())
301 coldims[col.index()] = MatrixDimension<block_type>::coldim(*col);
304 for (
typename std::vector<size_type>::iterator it=coldims.begin();
305 it!=coldims.end(); ++it)
315 template<
typename B,
int n,
int m,
typename TA>
316 struct MatrixDimension<BCRSMatrix<FieldMatrix<B,n,m> ,TA> >
318 typedef BCRSMatrix<FieldMatrix<B,n,m> ,TA> Matrix;
321 static size_type rowdim (
const Matrix& , size_type )
326 static size_type coldim (
const Matrix& , size_type )
331 static size_type rowdim (
const Matrix& A) {
335 static size_type coldim (
const Matrix& A) {
340 template<
typename K,
int n,
int m>
341 struct MatrixDimension<FieldMatrix<K,n,m> >
343 typedef FieldMatrix<K,n,m> Matrix;
346 static size_type rowdim(
const Matrix& , size_type )
351 static size_type coldim(
const Matrix& , size_type )
356 static size_type rowdim(
const Matrix& )
361 static size_type coldim(
const Matrix& )
367 template<
typename K,
int n,
int m,
typename TA>
368 struct MatrixDimension<Matrix<FieldMatrix<K,n,m>, TA> >
370 typedef Matrix<FieldMatrix<K,n,m>, TA> ThisMatrix;
371 typedef typename ThisMatrix::size_type size_type;
373 static size_type rowdim(
const ThisMatrix& , size_type )
378 static size_type coldim(
const ThisMatrix& , size_type )
383 static size_type rowdim(
const ThisMatrix& A)
388 static size_type coldim(
const ThisMatrix& A)
394 template<
typename K,
int n>
395 struct MatrixDimension<DiagonalMatrix<K,n> >
397 typedef DiagonalMatrix<K,n> Matrix;
400 static size_type rowdim(
const Matrix& , size_type )
405 static size_type coldim(
const Matrix& , size_type )
410 static size_type rowdim(
const Matrix& )
415 static size_type coldim(
const Matrix& )
421 template<
typename K,
int n>
422 struct MatrixDimension<ScaledIdentityMatrix<K,n> >
424 typedef ScaledIdentityMatrix<K,n> Matrix;
427 static size_type rowdim(
const Matrix& , size_type )
432 static size_type coldim(
const Matrix& , size_type )
437 static size_type rowdim(
const Matrix& )
442 static size_type coldim(
const Matrix& )
463 struct IsMatrix<DenseMatrix<T> >
474 template<
typename T,
typename A>
475 struct IsMatrix<BCRSMatrix<T,A> >
486 struct PointerCompare
488 bool operator()(
const T* l,
const T* r)
derive error class from the base class in common
Definition: istlexception.hh:16
A generic dynamic dense matrix.
Definition: matrix.hh:25
A::size_type size_type
Type for indices and sizes.
Definition: matrix.hh:41
VariableBlockVector< T, A >::ConstIterator ConstRowIterator
Const iterator over the matrix rows.
Definition: matrix.hh:50
row_type::const_iterator ConstColIterator
Const iterator for the entries of each row.
Definition: matrix.hh:53
T block_type
Export the type representing the components.
Definition: matrix.hh:32
ConstIterator class for sequential access.
Definition: vbvector.hh:647
This file implements a quadratic diagonal matrix of fixed size.
Implements a matrix constructed from a given type representing a field and compile-time given number ...
#define DUNE_THROW(E, m)
Definition: exceptions.hh:244
int countNonZeros(const M &matrix)
Get the number of nonzero fields in the matrix.
Definition: matrixutils.hh:155
Dune namespace.
Definition: alignment.hh:14
This file implements a quadratic matrix of fixed size which is a multiple of the identity.
Fallback implementation of the C++0x static_assert feature.
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition: matrixutils.hh:83
static void check(const Matrix &mat)
Check whether the a matrix has diagonal values on blocklevel recursion levels.
Definition: matrixutils.hh:88
Test whether a type is an ISTL Matrix.
Definition: matrixutils.hh:453
@ value
True if T is an ISTL matrix.
Definition: matrixutils.hh:458
Traits for type conversions and type information.
Definition of the DUNE_UNUSED macro for the case that config.h is not available.
#define DUNE_UNUSED_PARAMETER(parm)
A macro to mark intentional unused function parameters with.
Definition: unused.hh:18