Skip to content
Snippets Groups Projects
Commit 4f2f7660 authored by Max Kahnt's avatar Max Kahnt
Browse files

Use SingleNonZeroRowMatrix implementation that was in ComponentwiseMatrixMap.

parent af9869d7
Branches
No related tags found
No related merge requests found
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
#include <dune/fufem/arithmetic.hh> #include <dune/fufem/arithmetic.hh>
#include <dune/fufem/indexedsliceiterator.hh> #include <dune/fufem/indexedsliceiterator.hh>
/** /**
* \brief A static matrix that has only a single nonzero row * \brief A static matrix that has only a single nonzero row
* *
...@@ -17,39 +16,81 @@ ...@@ -17,39 +16,81 @@
* all entries accordingly. So it will not reduce memory * all entries accordingly. So it will not reduce memory
* requirements but allows to implement methods more efficiently. * requirements but allows to implement methods more efficiently.
*/ */
template<class K, int ROWS, int COLS> template<class K, int ROWS, int COLS> //TODO allow to set storage type as in singlenonzerocolumnmatrix. Update docu accordingly.
class SingleNonZeroRowMatrix : class SingleNonZeroRowMatrix
public Dune::FieldMatrix<K, ROWS, COLS>
{ {
typedef typename Dune::FieldMatrix<K, ROWS, COLS> Base; public:
typedef typename Dune::FieldMatrix<K, 1, COLS> SingleRowMatrix;
protected:
class RowProxy
{
public:
typedef std::size_t size_type;
typedef typename SingleRowMatrix::ConstColIterator ConstIterator;
typedef ConstIterator const_iterator;
RowProxy(const SingleRowMatrix* nzRow, size_type rowIndex, size_type nzRowIndex) :
nzRow_(nzRow),
isNonZero_(rowIndex==nzRowIndex)
{}
ConstIterator begin() const
{
if (isNonZero_)
return (*nzRow_)[0].begin();
else
return (*nzRow_)[0].end();
}
ConstIterator end() const
{
return (*nzRow_)[0].end();
}
protected:
const SingleRowMatrix* nzRow_;
bool isNonZero_;
};
public: public:
enum { rows = ROWS, cols = COLS};
typedef typename Dune::FieldMatrix<K, 1, Base::cols> SingleRowMatrix; typedef RowProxy row_type;
typedef row_type const_row_reference;
typedef typename std::size_t size_type;
typedef typename RowProxy::ConstIterator ConstColIterator;
/** /**
* \brief Create from single row matrix and row index * \brief Create from single row matrix and row index
*/ */
SingleNonZeroRowMatrix(const SingleRowMatrix& c, int row) : SingleNonZeroRowMatrix(const SingleRowMatrix& r, size_type nzRowIndex) :
Base(0.0), nzRow_(r),
row_(row) nzRowIndex_(nzRowIndex)
{}
size_type N() const
{
return ROWS;
}
size_type M() const
{ {
for(int i=0; i<Base::cols; ++i) return COLS;
(*this)[row_][i] = c[0][i];
} }
template<class X , class Y > template<class X , class Y >
void umv(const X& x, Y& y) const void umv(const X& x, Y& y) const
{ {
for(int i=0; i<Base::cols; ++i) for(size_type i=0; i<M(); ++i)
y[row_] += (*this)[row_][i] * x[i]; y[nzRowIndex_] += nzRow_[0][i] * x[i];
} }
template<class X , class Y > template<class X , class Y >
void umtv(const X& x, Y& y) const void umtv(const X& x, Y& y) const
{ {
for(int i=0; i<Base::cols; ++i) for(size_type i=0; i<N(); ++i)
y[i] = (*this)[row_][i] * x[row_]; y[i] = nzRow_[0][i] * x[nzRowIndex_];
} }
template<class X , class Y > template<class X , class Y >
...@@ -59,19 +100,19 @@ public: ...@@ -59,19 +100,19 @@ public:
umtv(x, y); umtv(x, y);
} }
int nonZeroRowIndex() const const_row_reference operator[] (size_type rowIndex) const
{ {
return row_; return const_row_reference(&nzRow_, rowIndex, nzRowIndex_);
} }
const Base::row_type& nonZeroRow() const size_type nonZeroRowIndex() const
{ {
return (*this)[row_]; return nzRowIndex_;
} }
protected: protected:
SingleRowMatrix nzRow_;
const int row_; const size_type nzRowIndex_;
}; };
...@@ -81,27 +122,14 @@ namespace Arithmetic ...@@ -81,27 +122,14 @@ namespace Arithmetic
template<class K, int ROWS, int COLS> template<class K, int ROWS, int COLS>
struct MatrixTraits<SingleNonZeroRowMatrix<K, ROWS, COLS> > struct MatrixTraits<SingleNonZeroRowMatrix<K, ROWS, COLS> >
{ {
enum { isMatrix=true }; enum { isMatrix = true };
enum { rows=ROWS}; enum { isDense = false };
enum { cols=COLS}; enum { sizeIsStatic = true }; //TODO only one of these should be used
typedef typename SingleNonZeroRowMatrix<K, ROWS, COLS>::row_type::ConstColIterator ConstColIterator; enum { hasStaticSize = true }; //TODO only one of these should be used
enum { rows = ROWS};
static ConstColIterator rowBegin(const typename SingleNonZeroRowMatrix<K, ROWS, COLS>::row_type& m, int row) enum { cols = COLS};
{
if (row == m.nonZeroRowIndex())
return m.nonZeroRow().begin();
else
return m.nonZeroRow().end();
}
static ConstColIterator rowEnd(const typename SingleNonZeroRowMatrix<K, ROWS, COLS>::row_type& m, int row)
{
return m.nonZeroRow().end();
}
}; };
}
};
#endif #endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment