3#ifndef DUNE_PDELAB_BACKEND_ISTL_VECTOR_HH
4#define DUNE_PDELAB_BACKEND_ISTL_VECTOR_HH
9#include <dune/typetree/typetree.hh>
11#include <dune/pdelab/backend/interface.hh>
13#include <dune/pdelab/backend/common/uncachedvectorview.hh>
14#include <dune/pdelab/backend/common/aliasedvectorview.hh>
15#include <dune/pdelab/backend/istl/descriptors.hh>
16#include <dune/pdelab/backend/istl/vectorhelpers.hh>
17#include <dune/pdelab/backend/istl/vectoriterator.hh>
18#include <dune/pdelab/gridfunctionspace/gridfunctionspace.hh>
19#include <dune/pdelab/gridfunctionspace/lfsindexcache.hh>
20#include <dune/pdelab/gridfunctionspace/tags.hh>
26 template<
typename GFS,
typename C>
28 :
public Backend::impl::Wrapper<C>
31 friend Backend::impl::Wrapper<C>;
34 typedef typename C::field_type ElementType;
35 typedef ElementType E;
37 typedef GFS GridFunctionSpace;
38 typedef typename Container::field_type field_type;
39 typedef typename Container::block_type block_type;
40 typedef typename Container::size_type size_type;
44 typedef typename GFS::Ordering::Traits::ContainerIndex ContainerIndex;
46 typedef ISTL::vector_iterator<C> iterator;
47 typedef ISTL::vector_iterator<const C> const_iterator;
50 template<
typename LFSCache>
51 using LocalView = UncachedVectorView<BlockVector,LFSCache>;
53 template<
typename LFSCache>
54 using ConstLocalView = ConstUncachedVectorView<const BlockVector,LFSCache>;
56 template<
typename LFSCache>
57 using AliasedLocalView = AliasedVectorView<BlockVector,LFSCache>;
59 template<
typename LFSCache>
60 using ConstAliasedLocalView = ConstAliasedVectorView<const BlockVector,LFSCache>;
62 BlockVector(
const BlockVector& rhs)
64 , _container(
std::make_shared<Container>(_gfs->ordering().blockCount()))
66 ISTL::dispatch_vector_allocation(_gfs->ordering(),*_container,
typename GFS::Ordering::ContainerAllocationTag());
67 (*_container) = rhs.native();
70 BlockVector(BlockVector&& rhs)
72 , _container(
std::move(rhs._container))
75 BlockVector (std::shared_ptr<const GFS> gfs, Backend::attached_container = Backend::attached_container())
77 , _container(
std::make_shared<Container>(gfs->ordering().blockCount()))
79 ISTL::dispatch_vector_allocation(gfs->ordering(),*_container,
typename GFS::Ordering::ContainerAllocationTag());
83 BlockVector(std::shared_ptr<const GFS> gfs, Backend::unattached_container)
92 BlockVector (std::shared_ptr<const GFS> gfs, Container& container)
96 _container->resize(gfs->ordering().blockCount());
97 ISTL::dispatch_vector_allocation(gfs->ordering(),*_container,
typename GFS::Ordering::ContainerAllocationTag());
100 BlockVector (std::shared_ptr<const GFS> gfs,
const E& e)
102 , _container(
std::make_shared<Container>(gfs->ordering().blockCount()))
104 ISTL::dispatch_vector_allocation(gfs->ordering(),*_container,
typename GFS::Ordering::ContainerAllocationTag());
108 BlockVector (
const GFS& gfs, Backend::attached_container tag = Backend::attached_container())
113 BlockVector(
const GFS& gfs, Backend::unattached_container tag)
122 BlockVector (
const GFS& gfs, Container& container)
126 BlockVector (
const GFS& gfs,
const E& e)
135 template<
typename LFSCache>
136 value_type* data(
const LFSCache& lfs_cache)
138 return &((*this)[lfs_cache.containerIndex(0)]);
141 template<
typename LFSCache>
142 const value_type* data(
const LFSCache& lfs_cache)
const
144 return &((*this)[lfs_cache.containerIndex(0)]);
147 void attach(std::shared_ptr<Container> container)
149 _container = container;
152 bool attached()
const
154 return bool(_container);
157 const std::shared_ptr<Container>& storage()
const
164 return _container->N();
167 BlockVector& operator= (
const BlockVector& r)
173 (*_container) = r.native();
177 _container = std::make_shared<Container>(r.native());
182 BlockVector& operator= (
const E& e)
188 BlockVector& operator*= (
const E& e)
195 BlockVector& operator+= (
const E& e)
201 BlockVector& operator+= (
const BlockVector& e)
203 (*_container)+= e.native();
207 BlockVector& operator-= (
const BlockVector& e)
209 (*_container)-= e.native();
213 block_type& block(std::size_t i)
215 return (*_container)[i];
218 const block_type& block(std::size_t i)
const
220 return (*_container)[i];
223 E& operator[](
const ContainerIndex& ci)
225 return ISTL::access_vector_element(ISTL::container_tag(*_container),*_container,ci,ci.size()-1);
228 const E& operator[](
const ContainerIndex& ci)
const
230 return ISTL::access_vector_element(ISTL::container_tag(*_container),*_container,ci,ci.size()-1);
233 typename Dune::template FieldTraits<E>::real_type two_norm2()
const
235 return _container->two_norm2();
238 typename Dune::template FieldTraits<E>::real_type two_norm()
const
240 return _container->two_norm();
243 typename Dune::template FieldTraits<E>::real_type one_norm()
const
245 return _container->one_norm();
248 typename Dune::template FieldTraits<E>::real_type infinity_norm()
const
250 return _container->infinity_norm();
253 E operator*(
const BlockVector& y)
const
255 return (*_container)*y.native();
258 E
dot(
const BlockVector& y)
const
260 return _container->dot(y.native());
263 BlockVector& axpy(
const E& a,
const BlockVector& y)
265 _container->axpy(a, y.native());
277 const Container& native ()
const
284 operator Container&()
289 operator const Container&()
const
296 return iterator(*_container,
false);
300 const_iterator begin()
const
302 return const_iterator(*_container,
false);
307 return iterator(*_container,
true);
311 const_iterator end()
const
313 return const_iterator(*_container,
true);
316 size_t flatsize()
const
318 return _container->dim();
321 const GFS& gridFunctionSpace()
const
326 std::shared_ptr<const GFS> gridFunctionSpaceStorage()
const
332 std::shared_ptr<const GFS> _gfs;
333 std::shared_ptr<Container> _container;
339 template<
typename GFS,
typename E>
340 struct BlockVectorSelectorHelper
343 typedef typename TypeTree::AccumulateType<
345 ISTL::vector_creation_policy<E>
346 >::type vector_descriptor;
348 typedef BlockVector<GFS,typename vector_descriptor::vector_type> Type;
362 template<Dune::PDELab::ISTL::Blocking blocking, std::
size_t block_size,
typename GFS,
typename E>
363 struct BackendVectorSelectorHelper<ISTL::VectorBackend<blocking,block_size>, GFS, E>
364 :
public ISTL::BlockVectorSelectorHelper<GFS,E>
This file implements a vector space as a tensor product of a given vector space. The number of compon...
Implements a vector constructed from a given type representing a field and a compile-time given size.
auto dot(const A &a, const B &b) -> typename std::enable_if<!IsVector< A >::value &&!std::is_same< typename FieldTraits< A >::field_type, typename FieldTraits< A >::real_type > ::value, decltype(conj(a) *b)>::type
computes the dot product for fundamental data types according to Petsc's VectDot function: dot(a,...
Definition: dotproduct.hh:40
Dune namespace.
Definition: alignedallocator.hh:14
shared_ptr< T > stackobject_to_shared_ptr(T &t)
Create a shared_ptr for a stack-allocated object.
Definition: shared_ptr.hh:75
This file implements the class shared_ptr (a reference counting pointer), for those systems that don'...