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;
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_ ]; }
Definition: bindguard.hh:11
bool operator==(const Double &a, const Double &b)
Definition: double.hh:600
bool operator!=(const Double &a, const Double &b)
Definition: double.hh:640
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
void reserve(SizeType size)
Definition: tuplediscretefunction/dofvector.hh:157
void clear()
Definition: tuplediscretefunction/dofvector.hh:125
TupleDofVector(BaseType data)
Definition: tuplediscretefunction/dofvector.hh:67
Iterator IteratorType
Definition: tuplediscretefunction/dofvector.hh:45
FieldType value_type
Definition: tuplediscretefunction/dofvector.hh:51
const ThisType & operator+=(const ThisType &other)
Definition: tuplediscretefunction/dofvector.hh:77
SizeType size_type
Definition: tuplediscretefunction/dofvector.hh:52
const FieldType * blockAccess(std::size_t index, std::integral_constant< std::size_t, i >) const
Definition: tuplediscretefunction/dofvector.hh:221
FieldType operator*(const ThisType &other) const
Definition: tuplediscretefunction/dofvector.hh:100
Fem::Envelope< ConstDofBlockType > ConstDofBlockPtrType
Definition: tuplediscretefunction/dofvector.hh:60
const FieldType * blockAccess(std::size_t index, std::integral_constant< std::size_t, sizeof ...(DofVectors) >) const
Definition: tuplediscretefunction/dofvector.hh:231
const ThisType & operator*=(const FieldType &scalar)
Definition: tuplediscretefunction/dofvector.hh:108
ConstIterator ConstIteratorType
Definition: tuplediscretefunction/dofvector.hh:48
DofBlockPtrType blockPtr(std::size_t index)
Definition: tuplediscretefunction/dofvector.hh:146
const std::tuple_element< i, DofVectorTuple >::type & subDofVector() const
Definition: tuplediscretefunction/dofvector.hh:164
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
std::tuple_element< i, DofVectorTuple >::type & subDofVector()
Definition: tuplediscretefunction/dofvector.hh:168
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
SizeType size(std::index_sequence< i ... >) const
Definition: tuplediscretefunction/dofvector.hh:192
const ThisType & operator-=(const ThisType &other)
Definition: tuplediscretefunction/dofvector.hh:83
const ThisType & operator/=(const FieldType &scalar)
Definition: tuplediscretefunction/dofvector.hh:114
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
FieldType * blockAccess(std::size_t index, std::integral_constant< std::size_t, i >)
Definition: tuplediscretefunction/dofvector.hh:205
TupleDofVector(const ThisType &)=default
void resize(SizeType size)
Definition: tuplediscretefunction/dofvector.hh:158
std::tuple_element< 0, DofVectorTuple >::type::FieldType FieldType
Definition: tuplediscretefunction/dofvector.hh:41
void axpy(const FieldType &scalar, const ThisType &other)
Definition: tuplediscretefunction/dofvector.hh:120
IteratorType begin()
Definition: tuplediscretefunction/dofvector.hh:131
TupleDofVector(ThisType &&)=default
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
const ThisType & operator=(const ThisType &other)
Definition: tuplediscretefunction/dofvector.hh:71
FieldType * blockAccess(std::size_t index, std::integral_constant< std::size_t, sizeof ...(DofVectors) >)
Definition: tuplediscretefunction/dofvector.hh:215
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