diff --git a/dune/istl/io.hh b/dune/istl/io.hh index f0f22c0348f1893f79afb4854470cf09cde999b5..f478bee7e0f71d77379f87af354d37405fb1f3c4 100644 --- a/dune/istl/io.hh +++ b/dune/istl/io.hh @@ -267,13 +267,13 @@ namespace Dune { * @param width The number of nonzero blocks to print in one line. * @param precision The precision to use when printing the numbers. */ - template<class B, int n, int m, class A> + template<class A, class InnerMatrixType> void printSparseMatrix(std::ostream& s, - const BCRSMatrix<FieldMatrix<B,n,m>,A>& mat, + const BCRSMatrix<InnerMatrixType,A>& mat, std::string title, std::string rowtext, int width=3, int precision=2) { - typedef BCRSMatrix<FieldMatrix<B,n,m>,A> Matrix; + typedef BCRSMatrix<InnerMatrixType,A> Matrix; // remember old flags std::ios_base::fmtflags oldflags = s.flags(); // set the output format @@ -290,6 +290,8 @@ namespace Dune { typedef typename Matrix::ConstRowIterator Row; + int n = InnerMatrixType::rows; + int m = InnerMatrixType::cols; for(Row row=mat.begin(); row != mat.end(); ++row) { int skipcols=0; bool reachedEnd=false; @@ -323,7 +325,7 @@ namespace Dune { } for(int innercol=0; innercol < m; ++innercol) { s.width(9); - s<<(*col)[innerrow][innercol]<<" "; + printInnerMatrixElement(s,*col,innerrow,innercol); } s<<"|"; @@ -344,6 +346,25 @@ namespace Dune { s.precision(oldprec); } + template<class B, int n> + void printInnerMatrixElement(std::ostream& s, + const ScaledIdentityMatrix<B,n> innerMatrixElement, + int innerrow, int innercol) + { + if (innerrow == innercol) + s<<innerMatrixElement.scalar()<<" "; + else + s<<"-"; + } + + template<class B, int n, int m, class A> + void printInnerMatrixElement(std::ostream& s, + const FieldMatrix<B,n,m> innerMatrixElement, + int innerrow, int innercol) + { + s<<innerMatrixElement[innerrow][innercol]<<" "; + } + namespace { template<typename T>