1#ifndef DUNE_FEM_FUNCTION_BLOCKVECTORS_TUPLE_HH
2#define DUNE_FEM_FUNCTION_BLOCKVECTORS_TUPLE_HH
8#include <dune/common/hybridutilities.hh>
26 template<
class ... DofVectors >
29 public std::tuple< DofVectors& ... >
32 typedef std::tuple< DofVectors & ... > BaseType;
34 static_assert(
sizeof ... ( DofVectors ) > 0,
"TupleDofVector needs at least one DofVector." );
36 typedef std::tuple< DofVectors ... > DofVectorTuple;
38 typedef decltype ( std::index_sequence_for< DofVectors ... >() ) Sequence;
41 static_assert(
Std::are_all_same<
typename DofVectors::FieldType ... >::value,
"All blocks need to have the same FieldType." );
42 typedef typename std::tuple_element< 0, DofVectorTuple >::type::FieldType
FieldType;
63 : BaseType(
std::forward_as_tuple( dofVectors ... ) )
73 assign( other, Sequence() );
79 axpy( 1.0, other, Sequence() );
85 axpy( -1.0, other, Sequence() );
93 static void apply(
const ThisType &a,
const ThisType& b,
FieldType& result )
95 result += (a.template subDofVector< i >() * b.template subDofVector<i>());
103 static const int length = std::tuple_size< BaseType >::value;
110 scale( scalar, Sequence() );
116 scale( 1.0 / scalar, Sequence() );
122 axpy( scalar, other, Sequence() );
139 return blockAccess( index, std::integral_constant< std::size_t, 0 >() );
143 return blockAccess( index, std::integral_constant< std::size_t, 0 >() );
160 constexpr std::size_t
blocks ()
const {
return sizeof ... ( DofVectors ); }
163 const typename std::tuple_element< i, DofVectorTuple >::type &
167 typename std::tuple_element< i, DofVectorTuple >::type &
169 return std::get< i >( *
this );
173 template< std::size_t ... i >
176 std::ignore = std::make_tuple( (std::get< i >( *
this ) *=
scale, i ) ... );
179 template< std::size_t ... i >
182 std::ignore = std::make_tuple( ( std::get< i >( *this ).axpy( a, std::get< i >( other ) ), i ) ... );
185 template< std::size_t ... i >
188 std::ignore = std::make_tuple( ( std::get< i >( *
this ) = std::get< i >( other ), i ) ... );
191 template< std::size_t ... i >
194 return Std::sum( std::get< i >( *this ).size() *
195 std::tuple_element< i, DofVectorTuple >::type::blockSize ... );
198 template< std::size_t ... I >
199 void clear ( std::index_sequence< I ... > )
201 std::ignore = std::make_tuple( ( std::get< I >( *this ).clear(), I ) ... );
204 template< std::
size_t i >
207 const std::size_t thisBlockSize = std::tuple_element< i, DofVectorTuple >::type::blockSize;
208 std::size_t offset = std::get< i >( *this ).size() * thisBlockSize;
210 return &std::get< i >( *
this )[ index / thisBlockSize ][ index % thisBlockSize ];
212 return blockAccess( index - offset, std::integral_constant< std::size_t, i +1 >() );
217 DUNE_THROW( RangeError,
"Index out of range" );
220 template< std::
size_t i >
223 const std::size_t thisBlockSize = std::tuple_element< i, DofVectorTuple >::type::blockSize;
224 std::size_t offset = std::get< i >( *this ).size() * thisBlockSize;
226 return &std::get< i >( *
this )[ index / thisBlockSize ][ index % thisBlockSize ];
228 return blockAccess( index - offset, std::integral_constant< std::size_t, i +1 >() );
231 const FieldType *
blockAccess ( std::size_t index, std::integral_constant< std::size_t,
sizeof ... ( DofVectors ) > )
const
233 DUNE_THROW( RangeError,
"Index out of range" );
239 template<
class ... DofVectors >
244 : container_( container ), iterator_( it ) {}
250 FieldType *operator-> () {
return container_[ iterator_ ]; }
252 Iterator &operator++ () { iterator_++;
return *
this; }
268 template<
class ... DofVectors >
273 : container_( container ), iterator_( it ) {}
278 FieldType *operator-> ()
const {
return container_[ iterator_ ]; }
bool operator==(const DiscreteFunctionInterface< ImplX > &x, const DiscreteFunctionInterface< ImplY > &y)
Definition: common/discretefunction.hh:1053
bool operator!=(const DiscreteFunctionInterface< ImplX > &x, const DiscreteFunctionInterface< ImplY > &y)
Definition: common/discretefunction.hh:1059
Definition: bindguard.hh:11
static constexpr std::decay_t< T > sum(T a)
Definition: utility.hh:33
static DUNE_PRIVATE void apply(Args &&... args)
Definition: forloop.hh:23
Definition: utility.hh:147
Definition: defaultblockvectors.hh:26
Definition: tuplediscretefunction/dofvector.hh:30
constexpr std::size_t blocks() const
Definition: tuplediscretefunction/dofvector.hh:160
const ThisType & operator=(const ThisType &other)
Definition: tuplediscretefunction/dofvector.hh:71
void reserve(SizeType size)
Definition: tuplediscretefunction/dofvector.hh:157
void clear()
Definition: tuplediscretefunction/dofvector.hh:125
const ThisType & operator/=(const FieldType &scalar)
Definition: tuplediscretefunction/dofvector.hh:114
TupleDofVector(BaseType data)
Definition: tuplediscretefunction/dofvector.hh:67
Iterator IteratorType
Definition: tuplediscretefunction/dofvector.hh:47
FieldType value_type
Definition: tuplediscretefunction/dofvector.hh:51
const ThisType & operator-=(const ThisType &other)
Definition: tuplediscretefunction/dofvector.hh:83
SizeType size_type
Definition: tuplediscretefunction/dofvector.hh:52
FieldType operator*(const ThisType &other) const
Definition: tuplediscretefunction/dofvector.hh:100
Fem::Envelope< ConstDofBlockType > ConstDofBlockPtrType
Definition: tuplediscretefunction/dofvector.hh:60
const ThisType & operator+=(const ThisType &other)
Definition: tuplediscretefunction/dofvector.hh:77
ConstIterator ConstIteratorType
Definition: tuplediscretefunction/dofvector.hh:48
DofBlockPtrType blockPtr(std::size_t index)
Definition: tuplediscretefunction/dofvector.hh:146
static const int blockSize
Definition: tuplediscretefunction/dofvector.hh:54
void scale(FieldType scale, std::index_sequence< i ... >)
Definition: tuplediscretefunction/dofvector.hh:174
ConstIteratorType begin() const
Definition: tuplediscretefunction/dofvector.hh:132
IteratorType end()
Definition: tuplediscretefunction/dofvector.hh:134
void assign(const ThisType &other, std::index_sequence< i ... >)
Definition: tuplediscretefunction/dofvector.hh:186
FieldType * DofBlockType
Definition: tuplediscretefunction/dofvector.hh:56
ConstDofBlockType blockPtr(std::size_t index) const
Definition: tuplediscretefunction/dofvector.hh:150
DofBlockType operator[](std::size_t index)
Definition: tuplediscretefunction/dofvector.hh:137
const FieldType * ConstDofBlockType
Definition: tuplediscretefunction/dofvector.hh:57
Fem::Envelope< DofBlockType > DofBlockPtrType
Definition: tuplediscretefunction/dofvector.hh:59
std::tuple_element< 0, DofVectorTuple >::type::FieldType FieldType
Definition: tuplediscretefunction/dofvector.hh:42
SizeType size(std::index_sequence< i ... >) const
Definition: tuplediscretefunction/dofvector.hh:192
std::tuple_element< i, DofVectorTuple >::type & subDofVector()
Definition: tuplediscretefunction/dofvector.hh:168
const FieldType * blockAccess(std::size_t index, std::integral_constant< std::size_t, i >) const
Definition: tuplediscretefunction/dofvector.hh:221
const FieldType * blockAccess(std::size_t index, std::integral_constant< std::size_t, sizeof ...(DofVectors) >) const
Definition: tuplediscretefunction/dofvector.hh:231
SizeType size() const
Definition: tuplediscretefunction/dofvector.hh:127
ConstIteratorType end() const
Definition: tuplediscretefunction/dofvector.hh:135
TupleDofVector(DofVectors &... dofVectors)
Definition: tuplediscretefunction/dofvector.hh:62
std::size_t SizeType
Definition: tuplediscretefunction/dofvector.hh:50
TupleDofVector(const ThisType &)=default
const std::tuple_element< i, DofVectorTuple >::type & subDofVector() const
Definition: tuplediscretefunction/dofvector.hh:164
void resize(SizeType size)
Definition: tuplediscretefunction/dofvector.hh:158
void axpy(const FieldType &scalar, const ThisType &other)
Definition: tuplediscretefunction/dofvector.hh:120
IteratorType begin()
Definition: tuplediscretefunction/dofvector.hh:131
const ThisType & operator*=(const FieldType &scalar)
Definition: tuplediscretefunction/dofvector.hh:108
TupleDofVector(ThisType &&)=default
FieldType * blockAccess(std::size_t index, std::integral_constant< std::size_t, sizeof ...(DofVectors) >)
Definition: tuplediscretefunction/dofvector.hh:215
void axpy(FieldType a, const ThisType &other, std::index_sequence< i ... >)
Definition: tuplediscretefunction/dofvector.hh:180
void clear(std::index_sequence< I ... >)
Definition: tuplediscretefunction/dofvector.hh:199
FieldType * blockAccess(std::size_t index, std::integral_constant< std::size_t, i >)
Definition: tuplediscretefunction/dofvector.hh:205
Definition: tuplediscretefunction/dofvector.hh:242
std::size_t iterator_
Definition: tuplediscretefunction/dofvector.hh:265
TupleDofVector< DofVectors ... > & container_
Definition: tuplediscretefunction/dofvector.hh:264
Iterator(const Iterator &)=default
Iterator(TupleDofVector< DofVectors ... > &container, std::size_t it=0)
Definition: tuplediscretefunction/dofvector.hh:243
Definition: tuplediscretefunction/dofvector.hh:271
ConstIterator(const ConstIterator &)=default
std::size_t iterator_
Definition: tuplediscretefunction/dofvector.hh:293
const TupleDofVector< DofVectors ... > & container_
Definition: tuplediscretefunction/dofvector.hh:292
ConstIterator(const TupleDofVector< DofVectors ... > &container, std::size_t it=0)
Definition: tuplediscretefunction/dofvector.hh:272
Definition: envelope.hh:11