1 #ifndef DUNE_PDELAB_BACKEND_EIGEN_VECTOR_HH 2 #define DUNE_PDELAB_BACKEND_EIGEN_VECTOR_HH 8 #include <dune/istl/bvector.hh> 13 #include "descriptors.hh" 14 #include <Eigen/Dense> 21 template<
typename GFS,
typename ET>
23 :
public Backend::impl::Wrapper<Eigen::Matrix<ET, Eigen::Dynamic, 1>>
26 typedef Eigen::Matrix<ET, Eigen::Dynamic, 1> Container;
30 friend Backend::impl::Wrapper<Container>;
33 typedef ET ElementType;
37 typedef ElementType field_type;
39 typedef GFS GridFunctionSpace;
40 typedef std::size_t size_type;
42 typedef typename GFS::Ordering::Traits::ContainerIndex ContainerIndex;
44 typedef ElementType* iterator;
45 typedef const ElementType* const_iterator;
50 template<
typename LFSCache>
51 using LocalView = UncachedVectorView<VectorContainer,LFSCache>;
53 template<
typename LFSCache>
54 using ConstLocalView = ConstUncachedVectorView<const VectorContainer,LFSCache>;
56 VectorContainer(
const VectorContainer& rhs)
58 , _container(
std::make_shared<Container>(*(rhs._container)))
63 , _container(
std::make_shared<Container>(gfs.ordering().blockCount()))
76 VectorContainer (
const GFS& gfs, Container& container)
78 , _container(stackobject_to_shared_ptr(container))
80 _container->resize(gfs.ordering().blockCount());
83 VectorContainer (
const GFS& gfs,
const E&
e)
85 , _container(
std::make_shared<Container>(Container::Constant(gfs.ordering().blockCount(),e)))
93 void attach(std::shared_ptr<Container> container)
95 _container = container;
100 return bool(_container);
103 const std::shared_ptr<Container>& storage()
const 110 return _container->size();
113 VectorContainer& operator=(
const VectorContainer& r)
119 (*_container) = (*r._container);
123 _container = std::make_shared<Container>(*(r._container));
128 VectorContainer& operator=(
const E&
e)
130 (*_container) = Container::Constant(N(),e);
134 VectorContainer& operator*=(
const E& e)
141 VectorContainer& operator+=(
const E& e)
143 (*_container) += Container::Constant(N(),e);
147 VectorContainer& operator+=(
const VectorContainer& y)
149 (*_container) += (*y._container);
153 VectorContainer& operator-= (
const VectorContainer& y)
155 (*_container) -= (*y._container);
159 E& operator[](
const ContainerIndex& ci)
161 return (*_container)(ci[0]);
164 const E& operator[](
const ContainerIndex& ci)
const 166 return (*_container)(ci[0]);
169 typename Dune::template FieldTraits<E>::real_type two_norm()
const 171 return _container->norm();
174 typename Dune::template FieldTraits<E>::real_type one_norm()
const 176 return _container->template lpNorm<1>();
179 typename Dune::template FieldTraits<E>::real_type infinity_norm()
const 181 return _container->template lpNorm<Eigen::Infinity>();
185 E operator*(
const VectorContainer& y)
const 187 return _container->transpose() * (*y._container);
191 E dot(
const VectorContainer& y)
const 193 return _container->dot(*y._container);
197 VectorContainer& axpy(
const E& a,
const VectorContainer& y)
199 (*_container) += a * (*y._container);
209 const Container& base ()
const 221 const Container&
native ()
const 230 return _container->data();
233 const_iterator begin()
const 235 return _container->data();
240 return _container->data() + N();
243 const_iterator end()
const 245 return _container->data() + N();
248 size_t flatsize()
const 250 return _container->size();
253 const GFS& gridFunctionSpace()
const 260 std::shared_ptr<Container> _container;
269 template<
typename GFS,
typename E>
270 struct EigenVectorSelectorHelper
272 using Type = EIGEN::VectorContainer<GFS, E>;
278 template<
typename GFS,
typename E>
279 struct BackendVectorSelectorHelper<EigenVectorBackend, GFS, E>
280 :
public EigenVectorSelectorHelper<GFS,E>
293 #endif // DUNE_PDELAB_BACKEND_EIGEN_VECTOR_HH std::enable_if< std::is_base_of< impl::WrapperBase, T >::value, Native< T > & >::type native(T &t)
Definition: backend/interface.hh:199
Definition: adaptivity.hh:27
Backend::unattached_container unattached_container
Definition: backend/common/tags.hh:38
Backend::attached_container attached_container
Definition: backend/common/tags.hh:39
const Entity & e
Definition: localfunctionspace.hh:111
Various tags for influencing backend behavior.