2 #ifndef DUNE_PDELAB_BACKEND_SIMPLE_MATRIX_HH
3 #define DUNE_PDELAB_BACKEND_SIMPLE_MATRIX_HH
10 #include <dune/common/typetraits.hh>
11 #include <dune/common/shared_ptr.hh>
21 template<
typename GFSV,
typename GFSU,
typename C>
29 typedef ElementType
E;
37 typedef typename GFSV::Ordering::Traits::ContainerIndex
RowIndex;
38 typedef typename GFSU::Ordering::Traits::ContainerIndex
ColIndex;
40 template<
typename RowCache,
typename ColCache>
43 template<
typename RowCache,
typename ColCache>
49 : _rows(go.testGridFunctionSpace().size())
50 , _cols(go.trialGridFunctionSpace().size())
51 , _container(make_shared<Container>(_rows*_cols,E(0)))
56 : _rows(go.testGridFunctionSpace().size())
57 , _cols(go.trialGridFunctionSpace().size())
58 , _container(make_shared<Container>(_rows*_cols,e))
71 , _container(make_shared<Container>())
77 , _container(make_shared<Container>(*(rhs._container)))
84 if (_rows == 0 && _cols == 0)
91 (*_container) = (*(rhs._container));
95 _container = make_shared<Container>(*(rhs._container));
105 void attach(shared_ptr<Container> container)
107 _container = container;
112 return bool(_container);
132 std::fill(_container->begin(),_container->end(),
e);
138 using namespace std::placeholders;
139 std::transform(_container->begin(),_container->end(),_container->begin(),std::bind(std::multiplies<E>(),e,_1));
144 void mv(
const V& x, V& y)
const
146 auto rowit = _container->begin();
149 v = std::inner_product(rowit,rowit + _cols,x.begin(),
E(0));
155 void usmv(
const E alpha,
const V& x, V& y)
const
157 auto rowit = _container->begin();
160 v += alpha * std::inner_product(rowit,rowit + _cols,x.begin(),
E(0));
167 return (*_container)[ri[0]*_cols + ci[0]];
170 const E&
operator()(
const RowIndex& ri,
const ColIndex& ci)
const
172 return (*_container)[ri[0]*_cols + ci[0]];
191 void clear_row(
const RowIndex& ri,
const E& diagonal_entry)
193 std::fill(_container->begin() + ri[0]*_cols,_container->begin() + (ri[0]+1)*_cols,
E(0));
194 (*this)(ri,ri) = diagonal_entry;
201 shared_ptr<Container> _container;
210 #endif // DUNE_PDELAB_BACKEND_SIMPLE_MATRIX_HH
Tag for requesting a vector or matrix container without a pre-attached underlying object...
Definition: backend/tags.hh:23
MatrixContainer & operator=(const E &e)
Definition: simple/matrix.hh:130
Container::size_type size_type
Definition: simple/matrix.hh:32
void clear_row(const RowIndex &ri, const E &diagonal_entry)
Definition: simple/matrix.hh:191
bool attached() const
Definition: simple/matrix.hh:110
void attach(shared_ptr< Container > container)
Definition: simple/matrix.hh:105
MatrixContainer(tags::unattached_container=tags::unattached_container())
Creates an ISTLMatrixContainer without allocating an underlying ISTL matrix.
Definition: simple/matrix.hh:62
void mv(const V &x, V &y) const
Definition: simple/matrix.hh:144
Various tags for influencing backend behavior.
ElementType E
Definition: simple/matrix.hh:29
const shared_ptr< Container > & storage() const
Definition: simple/matrix.hh:115
Container & base()
Definition: simple/matrix.hh:180
size_type M() const
Definition: simple/matrix.hh:125
const E & operator()(const RowIndex &ri, const ColIndex &ci) const
Definition: simple/matrix.hh:170
Definition: adaptivity.hh:26
size_type N() const
Definition: simple/matrix.hh:120
MatrixContainer(const GO &go, const E &e)
Definition: simple/matrix.hh:55
MatrixContainer & operator*=(const E &e)
Definition: simple/matrix.hh:136
MatrixContainer(tags::attached_container)
Creates an ISTLMatrixContainer with an empty underlying ISTL matrix.
Definition: simple/matrix.hh:68
GFSU TrialGridFunctionSpace
Definition: simple/matrix.hh:34
C Container
Definition: simple/matrix.hh:27
GFSU::Ordering::Traits::ContainerIndex ColIndex
Definition: simple/matrix.hh:38
void flush()
Definition: simple/matrix.hh:185
const E & e
Definition: interpolate.hh:172
void finalize()
Definition: simple/matrix.hh:188
MatrixContainer(const GO &go)
Definition: simple/matrix.hh:48
Definition: uncachedmatrixview.hh:14
void usmv(const E alpha, const V &x, V &y) const
Definition: simple/matrix.hh:155
GFSV TestGridFunctionSpace
Definition: simple/matrix.hh:35
MatrixContainer(const MatrixContainer &rhs)
Definition: simple/matrix.hh:74
ElementType field_type
Definition: simple/matrix.hh:31
Container::value_type ElementType
Definition: simple/matrix.hh:28
const Container & base() const
Definition: simple/matrix.hh:175
GFSV::Ordering::Traits::ContainerIndex RowIndex
Definition: simple/matrix.hh:37
Definition: uncachedmatrixview.hh:159
void detach()
Definition: simple/matrix.hh:100
Tag for requesting a vector or matrix container with a pre-attached underlying object.
Definition: backend/tags.hh:27
E & operator()(const RowIndex &ri, const ColIndex &ci)
Definition: simple/matrix.hh:165
MatrixContainer & operator=(const MatrixContainer &rhs)
Definition: simple/matrix.hh:80
Definition: simple/matrix.hh:22