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