dune-pdelab  2.5-dev
simple/vector.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 #ifndef DUNE_PDELAB_BACKEND_SIMPLE_VECTOR_HH
4 #define DUNE_PDELAB_BACKEND_SIMPLE_VECTOR_HH
5 
6 #include <algorithm>
7 #include <functional>
8 #include <memory>
9 #include <numeric>
10 
11 #include <dune/common/fvector.hh>
12 #include <dune/istl/bvector.hh>
13 
20 
21 namespace Dune {
22  namespace PDELab {
23 
24  namespace Simple {
25 
26  namespace {
27 
28  // For some reason std::bind cannot directly deduce the correct version
29  // of Dune::fvmeta::abs2, so we package it into a functor to help it along.
30  template<typename K>
31  struct abs2
32  {
33  typename FieldTraits<K>::real_type operator()(const K& k) const
34  {
35  return Dune::fvmeta::abs2(k);
36  }
37  };
38 
39  }
40 
41  template<typename GFS, typename C>
43  : public Backend::impl::Wrapper<C>
44  {
45 
46  friend Backend::impl::Wrapper<C>;
47 
48  public:
49  typedef C Container;
50  typedef typename Container::value_type ElementType;
51  typedef ElementType E;
52 
53  // for ISTL solver compatibility
54  typedef ElementType field_type;
55 
56  typedef GFS GridFunctionSpace;
57  typedef typename Container::size_type size_type;
58 
59  typedef typename GFS::Ordering::Traits::ContainerIndex ContainerIndex;
60 
61  typedef typename Container::iterator iterator;
62  typedef typename Container::const_iterator const_iterator;
63 
64  template<typename LFSCache>
66 
67  template<typename LFSCache>
69 
70 
72  : _gfs(rhs._gfs)
73  , _container(std::make_shared<Container>(*(rhs._container)))
74  {}
75 
77  : _gfs(gfs)
78  , _container(std::make_shared<Container>(gfs.ordering().blockCount()))
79  {}
80 
83  : _gfs(gfs)
84  {}
85 
91  VectorContainer (const GFS& gfs, Container& container)
92  : _gfs(gfs)
93  , _container(stackobject_to_shared_ptr(container))
94  {
95  _container->resize(gfs.ordering().blockCount());
96  }
97 
98  VectorContainer (const GFS& gfs, const E& e)
99  : _gfs(gfs)
100  , _container(std::make_shared<Container>(gfs.ordering().blockCount(),e))
101  {}
102 
103  void detach()
104  {
105  _container.reset();
106  }
107 
108  void attach(std::shared_ptr<Container> container)
109  {
110  _container = container;
111  }
112 
113  bool attached() const
114  {
115  return bool(_container);
116  }
117 
118  const std::shared_ptr<Container>& storage() const
119  {
120  return _container;
121  }
122 
123  size_type N() const
124  {
125  return _container->size();
126  }
127 
129  {
130  if (this == &r)
131  return *this;
132  if (attached())
133  {
134  (*_container) = (*r._container);
135  }
136  else
137  {
138  _container = std::make_shared<Container>(*(r._container));
139  }
140  return *this;
141  }
142 
144  {
145  std::fill(_container->begin(),_container->end(),e);
146  return *this;
147  }
148 
150  {
151  std::transform(_container->begin(),_container->end(),_container->begin(),
152  std::bind(std::multiplies<E>(),e,std::placeholders::_1));
153  return *this;
154  }
155 
156 
158  {
159  std::transform(_container->begin(),_container->end(),_container->begin(),
160  std::bind(std::plus<E>(),e,std::placeholders::_1));
161  return *this;
162  }
163 
165  {
166  std::transform(_container->begin(),_container->end(),y._container->begin(),
167  _container->begin(),std::plus<E>());
168  return *this;
169  }
170 
171  VectorContainer& operator-= (const VectorContainer& y)
172  {
173  std::transform(_container->begin(),_container->end(),y._container->begin(),
174  _container->begin(),std::minus<E>());
175  return *this;
176  }
177 
178  E& operator[](const ContainerIndex& ci)
179  {
180  return (*_container)[ci[0]];
181  }
182 
183  const E& operator[](const ContainerIndex& ci) const
184  {
185  return (*_container)[ci[0]];
186  }
187 
188  typename Dune::template FieldTraits<E>::real_type two_norm() const
189  {
190  using namespace std::placeholders;
191  typedef typename Dune::template FieldTraits<E>::real_type Real;
192  return std::sqrt(std::accumulate(_container->begin(),_container->end(),Real(0),std::bind(std::plus<Real>(),_1,std::bind(abs2<E>(),_2))));
193  }
194 
195  typename Dune::template FieldTraits<E>::real_type one_norm() const
196  {
197  using namespace std::placeholders;
198  typedef typename Dune::template FieldTraits<E>::real_type Real;
199  return std::accumulate(_container->begin(),_container->end(),Real(0),std::bind(std::plus<Real>(),_1,std::bind(std::abs<E>,_2)));
200  }
201 
202  typename Dune::template FieldTraits<E>::real_type infinity_norm() const
203  {
204  if (_container->size() == 0)
205  return 0;
206  using namespace std::placeholders;
207  typedef typename Dune::template FieldTraits<E>::real_type Real;
208  return *std::max_element(_container->begin(),_container->end(),std::bind(std::less<Real>(),std::bind(std::abs<E>,_1),std::bind(std::abs<E>,_2)));
209  }
210 
211  E operator*(const VectorContainer& y) const
212  {
213  return std::inner_product(_container->begin(),_container->end(),y._container->begin(),E(0));
214  }
215 
216  E dot(const VectorContainer& y) const
217  {
218  return std::inner_product(_container->begin(),_container->end(),y._container->begin(),E(0),std::plus<E>(),Dune::dot<E,E>);
219  }
220 
221  VectorContainer& axpy(const E& a, const VectorContainer& y)
222  {
223  using namespace std::placeholders;
224  std::transform(_container->begin(),_container->end(),y._container->begin(),
225  _container->begin(),std::bind(std::plus<E>(),_1,std::bind(std::multiplies<E>(),a,_2)));
226  return *this;
227  }
228 
229  // for debugging and AMG access
230  Container& base ()
231  {
232  return *_container;
233  }
234 
235  const Container& base () const
236  {
237  return *_container;
238  }
239 
240  private:
241 
242  Container& native ()
243  {
244  return *_container;
245  }
246 
247  const Container& native () const
248  {
249  return *_container;
250  }
251 
252  public:
253 
254  iterator begin()
255  {
256  return _container->begin();
257  }
258 
259  const_iterator begin() const
260  {
261  return _container->begin();
262  }
263 
264  iterator end()
265  {
266  return _container->end();
267  }
268 
269  const_iterator end() const
270  {
271  return _container->end();
272  }
273 
274  size_t flatsize() const
275  {
276  return _container->size();
277  }
278 
279  const GFS& gridFunctionSpace() const
280  {
281  return _gfs;
282  }
283 
284  private:
285  const GFS& _gfs;
286  std::shared_ptr<Container> _container;
287  };
288 
289 
290  } // namespace Simple
291 
292 
293 #ifndef DOXYGEN
294 
295  template<typename GFS, typename E>
296  struct SimpleVectorSelectorHelper
297  {
298 
299  using vector_type = typename GFS::Traits::Backend::template vector_type<E>;
300 
302 
303  };
304 
305  namespace Backend {
306  namespace impl {
307 
308  template<template<typename> class Container, typename GFS, typename E>
309  struct BackendVectorSelectorHelper<Simple::VectorBackend<Container>, GFS, E>
310  : public SimpleVectorSelectorHelper<GFS,E>
311  {};
312 
313  } // namespace impl
314  } // namespace Backend
315 
316 #endif // DOXYGEN
317 
318  } // namespace PDELab
319 } // namespace Dune
320 
321 #endif // DUNE_PDELAB_BACKEND_SIMPLE_VECTOR_HH
Tag for requesting a vector or matrix container without a pre-attached underlying object...
Definition: backend/common/tags.hh:25
void detach()
Definition: simple/vector.hh:103
C Container
Definition: simple/vector.hh:49
Container::const_iterator const_iterator
Definition: simple/vector.hh:62
iterator end()
Definition: simple/vector.hh:264
const Entity & e
Definition: localfunctionspace.hh:111
std::enable_if< std::is_base_of< impl::WrapperBase, T >::value, Native< T > &>::type native(T &t)
Definition: backend/interface.hh:192
VectorContainer(const VectorContainer &rhs)
Definition: simple/vector.hh:71
Definition: uncachedvectorview.hh:135
VectorContainer & operator+=(const E &e)
Definition: simple/vector.hh:157
VectorContainer & operator*=(const E &e)
Definition: simple/vector.hh:149
Container::iterator iterator
Definition: simple/vector.hh:61
VectorContainer & operator+=(const VectorContainer &y)
Definition: simple/vector.hh:164
GFS::Ordering::Traits::ContainerIndex ContainerIndex
Definition: simple/vector.hh:59
void attach(std::shared_ptr< Container > container)
Definition: simple/vector.hh:108
Dune::template FieldTraits< E >::real_type infinity_norm() const
Definition: simple/vector.hh:202
const std::shared_ptr< Container > & storage() const
Definition: simple/vector.hh:118
ElementType E
Definition: simple/vector.hh:51
VectorContainer(const GFS &gfs, const E &e)
Definition: simple/vector.hh:98
VectorContainer & axpy(const E &a, const VectorContainer &y)
Definition: simple/vector.hh:221
bool attached() const
Definition: simple/vector.hh:113
For backward compatibility – Do not use this!
Definition: adaptivity.hh:27
Various tags for influencing backend behavior.
const E & operator[](const ContainerIndex &ci) const
Definition: simple/vector.hh:183
VectorContainer & operator=(const VectorContainer &r)
Definition: simple/vector.hh:128
Dune::template FieldTraits< E >::real_type one_norm() const
Definition: simple/vector.hh:195
E dot(const VectorContainer &y) const
Definition: simple/vector.hh:216
VectorContainer(const GFS &gfs, Backend::unattached_container)
Creates a VectorContainer without allocating storage.
Definition: simple/vector.hh:82
const_iterator begin() const
Definition: simple/vector.hh:259
Container & base()
Definition: simple/vector.hh:230
iterator begin()
Definition: simple/vector.hh:254
GFS GridFunctionSpace
Definition: simple/vector.hh:56
size_type N() const
Definition: simple/vector.hh:123
STL namespace.
Definition: simple/descriptors.hh:39
const Container & base() const
Definition: simple/vector.hh:235
size_t flatsize() const
Definition: simple/vector.hh:274
VectorContainer & operator=(const E &e)
Definition: simple/vector.hh:143
E operator*(const VectorContainer &y) const
Definition: simple/vector.hh:211
Container::value_type ElementType
Definition: simple/vector.hh:50
E & operator[](const ContainerIndex &ci)
Definition: simple/vector.hh:178
const GFS & gridFunctionSpace() const
Definition: simple/vector.hh:279
Dune::template FieldTraits< E >::real_type two_norm() const
Definition: simple/vector.hh:188
Container::size_type size_type
Definition: simple/vector.hh:57
Definition: uncachedvectorview.hh:15
Tag for requesting a vector or matrix container with a pre-attached underlying object.
Definition: backend/common/tags.hh:29
VectorContainer(const GFS &gfs, Backend::attached_container=Backend::attached_container())
Definition: simple/vector.hh:76
const_iterator end() const
Definition: simple/vector.hh:269
VectorContainer(const GFS &gfs, Container &container)
Constructs an VectorContainer for an explicitly given vector object.
Definition: simple/vector.hh:91
ElementType field_type
Definition: simple/vector.hh:54
Definition: simple/vector.hh:42