1 #ifndef DUNE_PDELAB_EIGENMATRIXBACKEND_HH 2 #define DUNE_PDELAB_EIGENMATRIXBACKEND_HH 13 #include <Eigen/Sparse> 23 struct MatrixPatternInserter
25 MatrixPatternInserter(M & mat)
29 template<
typename RI,
typename CI>
30 void add_link(
const RI& ri,
const CI& ci)
32 _matrix.coeffRef(ri.back(),ci.back()) = 0.0;
38 template<
typename GFSV,
typename GFSU,
typename ET,
int _Options>
40 :
public Backend::impl::Wrapper<Eigen::SparseMatrix<ET,_Options>>
45 typedef Eigen::SparseMatrix<ET,_Options> Container;
49 friend Backend::impl::Wrapper<Container>;
53 typedef ET ElementType;
55 typedef ElementType field_type;
56 typedef typename Container::Index size_type;
57 typedef typename Container::Index index_type;
59 typedef GFSU TrialGridFunctionSpace;
60 typedef GFSV TestGridFunctionSpace;
62 typedef typename GFSV::Ordering::Traits::ContainerIndex RowIndex;
63 typedef typename GFSU::Ordering::Traits::ContainerIndex ColIndex;
65 template<
typename RowCache,
typename ColCache>
66 using LocalView = UncachedMatrixView<MatrixContainer,RowCache,ColCache>;
68 template<
typename RowCache,
typename ColCache>
69 using ConstLocalView = ConstUncachedMatrixView<const MatrixContainer,RowCache,ColCache>;
72 typename GFSV::Ordering::Traits::DOFIndex,
73 typename GFSV::Ordering::Traits::ContainerIndex
77 typename GFSU::Ordering::Traits::DOFIndex,
78 typename GFSU::Ordering::Traits::ContainerIndex
81 typedef MatrixPatternInserter<Container> Pattern;
84 MatrixContainer(
const GO& go,
int avg_per_row)
85 : _container(
std::make_shared<Container>())
87 allocate_matrix(_container, go, avg_per_row, ElementType(0));
91 MatrixContainer(
const GO& go,
int avg_per_row,
const ElementType&
e)
92 : _container(
std::make_shared<Container>())
94 allocate_matrix(_container, go, avg_per_row, e);
103 : _container(
std::make_shared<Container>())
106 MatrixContainer(
const MatrixContainer& rhs)
107 : _container(
std::make_shared<Container>(*(rhs._container)))
110 MatrixContainer& operator=(
const MatrixContainer& rhs)
120 _container = std::make_shared<Container>(rhs.base());
130 void attach(std::shared_ptr<Container> container)
132 _container = container;
135 bool attached()
const 137 return bool(_container);
140 const std::shared_ptr<Container>& storage()
const 147 return _container->rows();
152 return _container->cols();
155 MatrixContainer& operator=(
const ElementType&
e)
157 if(!_container->isCompressed()) _container->makeCompressed();
158 for (
int i=0; i<_container->nonZeros(); i++)
159 _container->valuePtr()[i] =
e;
165 MatrixContainer& operator*=(
const ElementType& e)
172 void mv(
const V& x, V& y)
const 174 y.base() = base() * x.base();
178 void usmv(
const ElementType alpha,
const V& x, V& y)
const 180 y.base() += alpha * (base() * x.base());
183 ElementType& operator()(
const RowIndex& ri,
const ColIndex& ci)
185 return _container->coeffRef(ri[0],ci[0]);
188 const ElementType operator()(
const RowIndex& ri,
const ColIndex& ci)
const 190 return _container->coeffRef(ri[0],ci[0]);
193 const Container& base()
const 205 const Container&
native()
const 223 void clear_row(
const RowIndex& ri,
const ElementType& diagonal_entry)
225 _container->middleRows(ri[0],1) *= 0.0;
226 _container->coeffRef(ri[0],ri[0]) = diagonal_entry;
230 template<
typename GO>
231 static void allocate_matrix(std::shared_ptr<Container> & c,
const GO & go,
int avg_per_row,
const ElementType& e)
234 int rows = go.testGridFunctionSpace().ordering().blockCount();
235 int cols = go.trialGridFunctionSpace().ordering().blockCount();
236 c->resize(rows,cols);
237 c->reserve(Eigen::VectorXi::Constant(rows,avg_per_row));
240 go.fill_pattern(pattern);
245 std::shared_ptr< Container > _container;
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.