diff --git a/dune/matrix-vector/singlenonzerorowmatrix.hh b/dune/matrix-vector/singlenonzerorowmatrix.hh index 8346739bb27102b9aaf25dbf4cf156cb422428ec..1dd1bc7567ac4ef10eee9b5ce433576e8cae1a70 100644 --- a/dune/matrix-vector/singlenonzerorowmatrix.hh +++ b/dune/matrix-vector/singlenonzerorowmatrix.hh @@ -9,137 +9,6 @@ #include <dune/fufem/arithmetic.hh> #include <dune/fufem/indexedsliceiterator.hh> - - -/** - * \brief A static matrix that has only a single nonzero column - * - * The number and values of this column are dynamic. - * For simplicity this derives from FieldMatrix and sets - * all entries accordingly. So it will not reduce memory - * requirements but allows to implement methods more efficiently. - */ -template<class K, int ROWS, int COLS> -class SingleNonZeroColumnMatrix -{ - class RowProxy - { - public: - typedef IndexedSliceIterator<const K*, const K> ConstIterator; - typedef ConstIterator const_iterator; - - RowProxy(const K& value, size_type nzCol) : - value_(value), - nzCol_(nzCol) - {} - - ConstIterator begin() const - { - return ConstIterator(value_, nzCol, 0, 1); - } - - ConstIterator end() const - { - return ConstIterator(value_, nzCol+1, 0, 1); - } - - protected: - const K* value_; - size_type nzCol_; - }; - -public: - typedef RowProxy row_type; - typedef row_type const_row_reference; - typedef std::size_t size_type; - typedef RowProxy::ConstIterator ConstColIterator; - - typedef typename Dune::FieldMatrix<K, ROWS, 1> SingleColumnMatrix; - - /** - * \brief Create from single column matrix and column index - */ - SingleNonZeroColumnMatrix(const SingleColumnMatrix& c, size_type columnIndex) : - nonZeroColumn_(c), - columnIndex_(columnIndex) - {} - - size_type N() const - { - return ROWS; - } - - size_type M() const - { - return COLS; - } - - template<class X , class Y > - void umv(const X& x, Y& y) const - { - for(size_type i=0; i<N(); ++i) - y[i] += nonZeroColumn_[i] * x[columnIndex_]; - } - - template<class X , class Y > - void umtv(const X& x, Y& y) const - { - for(size_type i=0; i<N()::rows; ++i) - y[columnIndex_] = nonZeroColumn_[i] * x[i]; - } - - template<class X , class Y > - void mtv(const X& x, Y& y) const - { - y = 0.0; - umtv(x, y); - } - - const_row_reference operator[] (size_type rowIndex) const - { - return const_row_reference(nonZeroColumn_[rowIndex], columnIndex_); - } - - size_type nonZeroColumnIndex() const - { - return columnIndex_; - } - -protected: - SingleColumnMatrix nonZeroColumn_; - - const size_type columnIndex_; -}; - - - -namespace Arithmetic -{ - template<class K, int ROWS, int COLS> - struct MatrixTraits<SingleNonZeroColumnMatrix<K, ROWS, COLS> > - { - enum { isMatrix = true }; - enum { sizeIsStatic = true }; - enum { rows = ROWS}; - enum { cols = COLS}; - typedef SingleNonZeroColumnMatrix<K, ROWS, COLS>::ConstColIterator ConstColIterator; - - static ConstColIterator rowBegin(const typename SingleNonZeroColumnMatrix<K, ROWS, COLS>::row_type& m, int row) - { - int nzCol = m.nonZeroColumnIndex(); - return ConstColIterator(m[row][nzCol], nzCol); - } - - static ConstColIterator rowEnd(const typename SingleNonZeroColumnMatrix<K, ROWS, COLS>::row_type& m, int row) - { - int nzCol = m.nonZeroColumnIndex(); - return ConstColIterator(m[row][nzCol], nzCol+1); - } - }; -}; - - - /** * \brief A static matrix that has only a single nonzero row *