1#ifndef DUNE_FEM_SPACE_COMBINEDSPACE_TUPLESPACE_HH
2#define DUNE_FEM_SPACE_COMBINEDSPACE_TUPLESPACE_HH
9#include <dune/common/hybridutilities.hh>
10#include <dune/common/math.hh>
12#include <dune/grid/common/grid.hh>
32 template<
class CombineOp,
class ... DiscreteFunctionSpaces >
33 class TupleDiscreteFunctionSpaceImpl;
38 template<
class CombineOp,
class ... DiscreteFunctionSpaces >
41 static_assert(
sizeof ... ( DiscreteFunctionSpaces ) > 0,
42 "You should provide at least one space to the TupleDiscreteFunctionSpace" );
53 typedef typename std::tuple_element< i, DiscreteFunctionSpaceTupleType >::type::element_type
Type;
64 assert( std::get< i >( tuple ) );
65 return *( std::get< i >( tuple ) );
81 "TupleDiscreteFunctionSpace works only for GridPart's with the same entity type" );
84 "TupleDiscreteFunctionSpace for spaces with different codimensions is not supported" );
88 typedef typename GridPartType::GridType
GridType;
90 typedef typename GridPartType::template Codim< 0 >::IteratorType
IteratorType;
112 template<
class DiscreteFunction,
class Operation = DFCommunicationOperation::Copy >
124 return getBlockMapper( spaceTuple, std::index_sequence_for< DiscreteFunctionSpaces ... >() );
129 CommunicationDirection commDirection )
132 Hybrid::forEach( std::make_index_sequence<
sizeof ... ( DiscreteFunctionSpaces ) >{},
136 std::get< i >( tuple ) = std::make_shared< Element >( gridPart, commInterface, commDirection );
141 template<
class Entity >
144 return getBasisFunctionSet( entity, tuple, std::index_sequence_for< DiscreteFunctionSpaces ... >() );
147 template<
class T,
class F >
150 Hybrid::forEach( std::index_sequence_for< DiscreteFunctionSpaces... >{}, [ & ] (
auto &&idx ) {
151 const std::size_t i = std::decay_t<
decltype( idx ) >::value;
158 template< std::size_t ... i >
165 template<
class Entity, std::size_t ... i >
167 std::index_sequence< i ... > )
189 template<
class CombineOp,
class ... DiscreteFunctionSpaces >
197 typedef decltype ( std::index_sequence_for< DiscreteFunctionSpaces ... >() )
Sequence;
215 const InterfaceType commInterface = InteriorBorder_All_Interface,
216 const CommunicationDirection commDirection = ForwardCommunication )
268 std::tuple<
const DiscreteFunctionSpaces & ... >
spaceTuple ()
const
270 return spaceTuple( std::index_sequence_for< DiscreteFunctionSpaces ... >() );
286 return localInterpolation( entity, std::index_sequence_for< DiscreteFunctionSpaces ... >() );
290 template< std::size_t ... i >
291 std::tuple<
const DiscreteFunctionSpaces & ... >
spaceTuple ( std::index_sequence< i ... > )
const
293 return std::tuple<
const DiscreteFunctionSpaces & ... >( BaseType::template subDiscreteFunctionSpace< i >() ... );
296 template< std::size_t ... i >
309 template<
class CombineOp,
class ... DiscreteFunctionSpaces,
class NewFunctionSpace >
313 "DifferentDiscreteFunctionSpace can only be applied to TupleFunctionSpace, if new dimRange is a multiple of the original one." );
318 template<
class DiscreteFunctionSpace >
330 template<
class CombineOp,
class ... DiscreteFunctionSpaces >
346 template <
class ... DiscreteFunctionSpaces >
350 template <
class ... DiscreteFunctionSpaces >
353 template <
class ... DiscreteFunctionSpaces >
Definition: bindguard.hh:11
static std::shared_ptr< T > referenceToSharedPtr(T &t)
Definition: memory.hh:19
static void forEach(IndexRange< T, sz > range, F &&f)
Definition: hybrid.hh:129
Definition: utility.hh:147
Definition: space/basisfunctionset/tuple.hh:34
Definition: space/basisfunctionset/tuple.hh:35
Definition: space/basisfunctionset/tuple.hh:39
CombinationType::FunctionSpaceType FunctionSpaceType
type of analytical combined function space
Definition: space/basisfunctionset/tuple.hh:195
Definition: combinedspace/generic.hh:23
Traits::GridPartType GridPartType
Definition: combinedspace/generic.hh:36
Definition: combinedspace/interpolation.hh:106
Definition: tuplelocalrestrictprolong.hh:31
mapper allocating one DoF per subentity of a given codimension
Definition: tuplemapper.hh:510
Definition: tuplespace.hh:192
std::tuple< const DiscreteFunctionSpaces &... > spaceTuple() const
return tuple of const References to the contained sub spaces
Definition: tuplespace.hh:268
TupleDiscreteFunctionSpaceImpl(std::shared_ptr< const DiscreteFunctionSpaces >... spaces)
constructor
Definition: tuplespace.hh:249
BaseType::EntityType EntityType
Definition: tuplespace.hh:200
InterpolationImplType interpolation(const EntityType &entity) const
Definition: tuplespace.hh:279
decltype(std::index_sequence_for< DiscreteFunctionSpaces ... >()) Sequence
Definition: tuplespace.hh:197
InterpolationType interpolation() const
Definition: tuplespace.hh:273
Traits::InterpolationImplType InterpolationImplType
Definition: tuplespace.hh:202
LocalInterpolationWrapper< ThisType > InterpolationType
Definition: tuplespace.hh:204
TupleDiscreteFunctionSpaceImpl(DiscreteFunctionSpaces &&... spaces)
constructor
Definition: tuplespace.hh:227
TupleDiscreteFunctionSpaceImpl(const ThisType &)=delete
ThisType & operator=(const ThisType &)=delete
BaseType::Traits Traits
Definition: tuplespace.hh:198
InterpolationImplType localInterpolation(const EntityType &entity) const
Definition: tuplespace.hh:284
Traits::DiscreteFunctionSpaceTupleType DiscreteFunctionSpaceTupleType
Definition: tuplespace.hh:205
TupleDiscreteFunctionSpaceImpl(const DiscreteFunctionSpaces &... spaces)
constructor
Definition: tuplespace.hh:238
BaseType::GridPartType GridPartType
Definition: tuplespace.hh:199
std::tuple< const DiscreteFunctionSpaces &... > spaceTuple(std::index_sequence< i ... >) const
Definition: tuplespace.hh:291
TupleDiscreteFunctionSpaceImpl(GridPartType &gridPart, const InterfaceType commInterface=InteriorBorder_All_Interface, const CommunicationDirection commDirection=ForwardCommunication)
constructor
Definition: tuplespace.hh:214
InterpolationImplType localInterpolation(const EntityType &entity, std::index_sequence< i ... >) const
Definition: tuplespace.hh:297
TupleDiscreteFunctionSpaceImpl(DiscreteFunctionSpaceTupleType spaceTuple)
constructor
Definition: tuplespace.hh:260
Definition: tuplespace.hh:40
TupleSpaceInterpolation< CombineOp, DiscreteFunctionSpaces ... > InterpolationImplType
Definition: tuplespace.hh:109
TupleDiscreteFunctionSpaceImpl< CombineOp, DiscreteFunctionSpaces ... > DiscreteFunctionSpaceType
Definition: tuplespace.hh:95
static const int codimension
Definition: tuplespace.hh:85
TupleBasisFunctionSet< CombineOp, typename DiscreteFunctionSpaces::BasisFunctionSetType ... > BasisFunctionSetType
implementation of basefunction set
Definition: tuplespace.hh:98
SubDiscreteFunctionSpace< 0 >::Type::GridPartType GridPartType
Definition: tuplespace.hh:87
GridPartType::template Codim< 0 >::IteratorType IteratorType
Definition: tuplespace.hh:90
BasisFunctionSetType::FunctionSpaceType FunctionSpaceType
Definition: tuplespace.hh:107
TupleMapper< GridPartType, NonBlockMapper< typename DiscreteFunctionSpaces::BlockMapperType, DiscreteFunctionSpaces::localBlockSize > ... > BlockMapperType
Definition: tuplespace.hh:101
static BlockMapperType * getBlockMapper(const DiscreteFunctionSpaceTupleType &tuple, std::index_sequence< i ... >)
Definition: tuplespace.hh:159
GridPartType::IndexSetType IndexSetType
Definition: tuplespace.hh:89
static BasisFunctionSetType getBasisFunctionSet(const Entity &entity, const DiscreteFunctionSpaceTupleType &tuple)
Definition: tuplespace.hh:142
static BasisFunctionSetType getBasisFunctionSet(const Entity &entity, const DiscreteFunctionSpaceTupleType &tuple, std::index_sequence< i ... >)
Definition: tuplespace.hh:166
GridPartType::GridType GridType
Definition: tuplespace.hh:88
static T accumulate(const DiscreteFunctionSpaceTupleType &tuple, T value, F &&f)
Definition: tuplespace.hh:148
IteratorType::Entity EntityType
Definition: tuplespace.hh:91
std::index_sequence< 0 > LocalBlockIndices
Definition: tuplespace.hh:104
std::tuple< std::shared_ptr< DiscreteFunctionSpaces > ... > DiscreteFunctionSpaceTupleType
Definition: tuplespace.hh:45
GridPartType::IntersectionType IntersectionType
Definition: tuplespace.hh:92
static DiscreteFunctionSpaceTupleType createSpaces(GridPartType &gridPart, InterfaceType commInterface, CommunicationDirection commDirection)
Definition: tuplespace.hh:128
static BlockMapperType * getBlockMapper(const DiscreteFunctionSpaceTupleType &spaceTuple)
Definition: tuplespace.hh:122
Definition: tuplespace.hh:51
static BlockMapperType & subBlockMapper(const DiscreteFunctionSpaceTupleType &tuple)
Definition: tuplespace.hh:68
Type::BlockMapperType BlockMapperType
Definition: tuplespace.hh:56
static NonBlockMapperType subNonBlockMapper(const DiscreteFunctionSpaceTupleType &tuple)
Definition: tuplespace.hh:73
std::tuple_element< i, DiscreteFunctionSpaceTupleType >::type::element_type Type
Definition: tuplespace.hh:53
static const Type & subDiscreteFunctionSpace(const DiscreteFunctionSpaceTupleType &tuple)
Definition: tuplespace.hh:62
NonBlockMapper< BlockMapperType, Type::localBlockSize > NonBlockMapperType
Definition: tuplespace.hh:59
Definition: tuplespace.hh:114
DefaultCommunicationHandler< DiscreteFunction, Operation > Type
type of data handle
Definition: tuplespace.hh:116
Operation OperationType
type of operatation to perform on scatter
Definition: tuplespace.hh:118
TupleDiscreteFunctionSpaceImpl< CombineOp, typename DifferentDiscreteFunctionSpace< DiscreteFunctionSpaces, NewSubFunctionSpace< DiscreteFunctionSpaces > >::Type... > Type
Definition: tuplespace.hh:322
Definition: tuplespace.hh:333
DefaultLocalRestrictProlong(const DiscreteFunctionSpacesType &space)
Definition: tuplespace.hh:339
Default communication handler for discrete functions.
Definition: defaultcommhandler.hh:29
Definition: discretefunctionspace.hh:133
FunctionSpaceTraits Traits
type of traits class
Definition: discretefunctionspace.hh:187
GridPartType::template Codim< Traits::codimension >::EntityType EntityType
type of entity of codimension 0
Definition: discretefunctionspace.hh:223
GridPartType & gridPart() const
Definition: discretefunctionspace.hh:745
convert functions space to space with new dim range
Definition: functionspace.hh:250
Definition: common/localinterpolation.hh:74
Definition: common/localrestrictprolong.hh:16
Definition: nonblockmapper.hh:263