3 #ifndef DUNE_PDELAB_BACKEND_ISTL_BLOCKMATRIXDIAGONAL_HH
4 #define DUNE_PDELAB_BACKEND_ISTL_BLOCKMATRIXDIAGONAL_HH
23 struct matrix_element_vector;
26 template<
typename E,
int n,
int m>
27 struct matrix_element_vector<
31 typedef FieldMatrix<E,n,m> type;
36 template<
typename Block,
typename Allocator>
37 struct matrix_element_vector<
38 BCRSMatrix<Block,Allocator>
42 typename matrix_element_vector<Block>::type,
50 template<
typename FieldMatrix>
51 void matrix_element_vector_from_matrix(tags::field_matrix, FieldMatrix& c,
const FieldMatrix& matrix)
57 template<
typename BlockVector,
typename BCRSMatrix>
58 void matrix_element_vector_from_matrix(tags::block_vector, BlockVector& c,
const BCRSMatrix& m)
60 const std::size_t rows = m.N();
62 for (std::size_t i = 0; i < rows; ++i)
63 matrix_element_vector_from_matrix(
container_tag(c[i]),c[i],m[i][i]);
69 template<
typename FieldMatrix>
70 void invert_blocks(tags::field_matrix, FieldMatrix& c)
76 template<
typename BlockVector>
77 void invert_blocks(tags::block_vector, BlockVector& c)
79 const std::size_t rows = c.size();
80 for (std::size_t i = 0; i < rows; ++i)
88 template<
typename FieldMatrix,
typename X,
typename Y>
89 void mv(tags::field_matrix,
const FieldMatrix& c,
const X& x, Y& y)
96 template<
typename BlockVector,
typename X,
typename Y>
97 void mv(tags::block_vector,
const BlockVector& c,
const X& x, Y& y)
99 const std::size_t rows = c.size();
100 for (std::size_t i = 0; i < rows; ++i)
105 template<
typename FieldMatrix,
typename CI>
106 std::size_t row_size(tags::field_matrix,
const FieldMatrix& c,
const CI& ci,
int i)
108 return FieldMatrix::cols;
111 template<
typename FieldMatrix>
112 std::size_t row_size(tags::field_matrix,
const FieldMatrix& c)
114 return FieldMatrix::cols;
117 template<
typename BlockVector,
typename CI>
118 std::size_t row_size(tags::block_vector,
const BlockVector& c,
const CI& ci,
int i)
123 template<
typename BlockVector>
124 std::size_t row_size(tags::block_vector,
const BlockVector& c)
129 template<
typename FieldMatrix,
typename CI>
130 typename FieldMatrix::field_type* row_begin(tags::field_matrix_1_any, FieldMatrix& c,
const CI& ci,
int i)
133 return &(*c[0].begin());
136 template<
typename FieldMatrix,
typename CI>
137 typename FieldMatrix::field_type* row_begin(tags::field_matrix_n_any, FieldMatrix& c,
const CI& ci,
int i)
140 return &(*c[ci[0]].begin());
143 template<
typename FieldMatrix,
typename CI>
144 typename FieldMatrix::field_type* row_end(tags::field_matrix_1_any, FieldMatrix& c,
const CI& ci,
int i)
147 return &(*c[0].end());
150 template<
typename FieldMatrix,
typename CI>
151 typename FieldMatrix::field_type* row_end(tags::field_matrix_n_any, FieldMatrix& c,
const CI& ci,
int i)
154 return &(*c[ci[0]].end());
158 template<
typename BlockVector,
typename CI>
159 typename BlockVector::field_type* row_begin(tags::block_vector, BlockVector& c,
const CI& ci, std::size_t i)
164 template<
typename BlockVector,
typename CI>
165 typename BlockVector::field_type* row_end(tags::block_vector, BlockVector& c,
const CI& ci, std::size_t i)
185 typedef typename diagonal::matrix_element_vector<Matrix>::type
Container;
201 template<
typename X,
typename Y>
202 void mv(
const X& x, Y& y)
const
207 template<
typename ContainerIndex>
208 std::size_t
row_size(
const ContainerIndex& ci)
const
213 template<
typename ContainerIndex>
219 template<
typename ContainerIndex>
228 template<
typename GFS>
230 :
public Dune::CommDataHandleIF<AddMatrixElementVectorDataHandle<GFS>,typename Matrix::field_type>
247 return _gfs.dataHandleContains(codim);
253 return _gfs.dataHandleFixedSize(codim);
260 template<
typename Entity>
272 template<
typename MessageBuffer,
typename Entity>
273 void gather(MessageBuffer& buff,
const Entity&
e)
const
291 template<
typename MessageBuffer,
typename Entity>
317 mutable IndexCache _index_cache;
328 #endif // DUNE_PDELAB_BACKEND_ISTL_BLOCKMATRIXDIAGONAL_HH
void update(const Entity &e)
Definition: entityindexcache.hh:49
bool fixedsize(int dim, int codim) const
returns true if size per entity of given dim and codim is a constant
Definition: blockmatrixdiagonal.hh:251
Definition: blockmatrixdiagonal.hh:229
Container _container
Definition: blockmatrixdiagonal.hh:189
void mv(const X &x, Y &y) const
Definition: blockmatrixdiagonal.hh:202
AddMatrixElementVectorDataHandle(const GFS &gfs, MatrixElementVector &v)
Definition: blockmatrixdiagonal.hh:238
const CI & containerIndex(size_type i) const
Definition: entityindexcache.hh:64
size_type size(Entity &e) const
how many objects of type DataType have to be sent for a given entity
Definition: blockmatrixdiagonal.hh:261
void scatter(MessageBuffer &buff, const Entity &e, size_type n)
unpack data from message buffer to user
Definition: blockmatrixdiagonal.hh:292
static const int dim
Definition: adaptivity.hh:82
diagonal::matrix_element_vector< Matrix >::type Container
Definition: blockmatrixdiagonal.hh:185
std::size_t row_size(const ContainerIndex &ci) const
Definition: blockmatrixdiagonal.hh:208
C type
Definition: backend/istl/utility.hh:42
size_type size() const
Definition: entityindexcache.hh:74
V & raw(V &v)
Returns the raw ISTL object associated with v, or v itself it is already an ISTL object.
Definition: backend/istl/utility.hh:26
void invert()
Definition: blockmatrixdiagonal.hh:196
field_type * iterator
Definition: blockmatrixdiagonal.hh:187
Definition: blockmatrixdiagonal.hh:182
iterator row_begin(const ContainerIndex &ci)
Definition: blockmatrixdiagonal.hh:214
raw_type< M >::type Matrix
Definition: blockmatrixdiagonal.hh:180
MatrixElementVector(const M &m)
Definition: blockmatrixdiagonal.hh:191
GFS::Traits::SizeType size_type
Definition: blockmatrixdiagonal.hh:236
void gather(MessageBuffer &buff, const Entity &e) const
pack data from user to message buffer
Definition: blockmatrixdiagonal.hh:273
bool contains(int dim, int codim) const
returns true if data for this codim should be communicated
Definition: blockmatrixdiagonal.hh:245
tags::container< T >::type container_tag(const T &)
Gets instance of container tag associated with T.
Definition: backend/istl/tags.hh:247
Container::field_type field_type
Definition: blockmatrixdiagonal.hh:186
Matrix::field_type DataType
Definition: blockmatrixdiagonal.hh:235
Definition: blockmatrixdiagonal.hh:177
const E & e
Definition: interpolate.hh:172
iterator row_end(const ContainerIndex &ci)
Definition: blockmatrixdiagonal.hh:220
const std::string s
Definition: function.hh:1103
Ordering::Traits::ContainerIndex ContainerIndex
Definition: entityindexcache.hh:23