1#ifndef DUNE_FEM_SPACE_DISCONTINUOUSGALERKIN_TUPLE_HH
2#define DUNE_FEM_SPACE_DISCONTINUOUSGALERKIN_TUPLE_HH
8#include <dune/common/hybridutilities.hh>
31 template<
class... DFS >
32 class TupleDiscontinuousGalerkinSpace;
39 template<
class SFS,
class... I >
47 static const int dimRange = ShapeFunctionSetType::RangeType::dimension;
50 template< std::
size_t i >
51 using SubRangeType =
typename ShapeFunctionSetType::template SubShapeFunctionSetType< i >::RangeType;
53 template< std::size_t... i >
54 static constexpr int sumDimSubRange ( std::index_sequence< i... > )
56 return Std::sum( SubRangeType< i >::dimension ... );
59 static constexpr int sumDimSubRange ( std::index_sequence<> ) {
return 0; }
61 template< std::
size_t i >
65 FieldVector< T, SubRangeType< i >::dimension > operator() (
const FieldVector< T, dimRange > &
in )
const
67 FieldVector< T, SubRangeType< i >::dimension >
out;
68 for(
int j = 0; j < SubRangeType< i >::dimension; ++j )
69 out[ j ] =
in[ j + sumDimSubRange( std::make_index_sequence< i >() ) ];
73 template<
class T,
int cols >
74 FieldMatrix< T, SubRangeType< i >::dimension, cols > operator() (
const FieldMatrix< T, dimRange, cols > &
in )
const
76 FieldMatrix< T, SubRangeType< i >::dimension, cols >
out;
77 for(
int j = 0; j < SubRangeType< i >::dimension; ++j )
78 out[ j ] =
in[ j + sumDimSubRange( std::make_index_sequence< i >() ) ];
84 template<
class... Args >
90 template<
class LocalFunction,
class LocalDofVector >
93 std::size_t offset = 0;
94 Hybrid::forEach( std::index_sequence_for< I... >(), [
this, &lf, &ldv, &offset ] (
auto i ) {
114 template<
class... DFS >
119 static_assert(
sizeof...( DFS ) > 0,
"TupleDiscontinuousGalerkinSpace requires at least on space." );
121 static_assert(
Std::are_all_same<
typename DFS::GridPartType... >::value,
"TupleDiscontinuousGalerkinSpace only works on spaces with identical GridPart." );
123 template<
class E,
class SFS >
126 static std::false_type isDefaultBasisFunctionSet ( ... );
128 template<
class BFS >
129 struct IsDefaultBasisFunctionSet
130 :
public decltype( isDefaultBasisFunctionSet( std::declval< BFS >() ) )
133 static_assert(
Std::And( IsDefaultBasisFunctionSet< typename DFS::BasisFunctionSetType >::value... ),
"TupleDiscontinuousGalerkinSpace only works on spaces with DefaultBasisFunctionSets." );
136 template< std::
size_t i >
143 static const int codimension = GridPartType::dimension - ShapeFunctionSetType::DomainType::dimension;
144 typedef typename GridPartType::template Codim< codimension >::EntityType
EntityType;
149 : subDiscreteFunctionSpaces_( DFS( gridPart, commInterface, commDirection )... )
152 int order ()
const {
return order( std::index_sequence_for< DFS... >() ); }
158 template< std::
size_t i >
161 return std::get< i >( subDiscreteFunctionSpaces_ );
165 template<
class SFS >
171 template<
class BFS >
174 return basisFunctionSets.basisFunctionSet( entity ).shapeFunctionSet();
177 template< std::size_t... i >
178 int order ( std::index_sequence< i... > )
const
180 return Std::max( subDiscreteFunctionSpace< i >().
order()... );
183 template< std::size_t... i >
186 return Std::max( subDiscreteFunctionSpace< i >().
order( entity )... );
189 template< std::size_t... i >
196 std::tuple< DFS... > subDiscreteFunctionSpaces_;
204 template<
class... DFS >
224 template<
class DiscreteFunction,
class Operation = DFCommunicationOperation::Copy >
237 template<
class... DFS >
252 template< std::
size_t i >
271 template< std::
size_t i >
274 return basisFunctionSets().subDiscreteFunctionSpace( std::integral_constant< std::size_t, i >() );
278 template< std::size_t... i >
290 template<
class... DFS,
class NewFunctionSpace >
294 "DifferentDiscreteFunctionSpace can only be applied to TupleDiscontinuousGalerkinSpace, if new dimRange is a multiple of the original one." );
299 template<
int dimRange >
311 template<
class... DFS >
322 :
BaseType( subDiscreteFunctionSpaces( space,
std::index_sequence_for< DFS... >() ) )
326 template< std::size_t... i >
327 static std::tuple<
const DFS &... > subDiscreteFunctionSpaces (
const DiscreteFunctionSpaceType &space, std::index_sequence< i... > )
329 return std::tie( space.subDiscreteFunctionSpace( std::integral_constant< std::size_t, i >() )... );
Definition: bindguard.hh:11
LocalFunctionConverter< HostLocalFunction, Converter, __InstationaryFunction::HoldCopy > localFunctionConverter(HostLocalFunction hostLocalFunction, const Converter &converter=Converter())
Definition: converter.hh:199
static void forEach(IndexRange< T, sz > range, F &&f)
Definition: hybrid.hh:129
static constexpr T max(T a)
Definition: utility.hh:77
static constexpr std::decay_t< T > sum(T a)
Definition: utility.hh:33
static constexpr bool And()
Definition: utility.hh:125
Definition: utility.hh:147
interface for local functions
Definition: localfunction.hh:77
Definition: space/basisfunctionset/default.hh:52
ToNewDimDomainFunctionSpace< LocalFunctionSpaceType, Geometry::coorddimension >::Type FunctionSpaceType
type of function space
Definition: space/basisfunctionset/default.hh:78
Definition: tuplelocalrestrictprolong.hh:31
Default communication handler for discrete functions.
Definition: defaultcommhandler.hh:29
Definition: discretefunctionspace.hh:133
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
generate a set of default basis function sets from given set of shape function sets
Definition: discontinuousgalerkin/basisfunctionsets.hh:83
const ShapeFunctionSetsType & shapeFunctionSets() const
Definition: discontinuousgalerkin/basisfunctionsets.hh:153
generic implementation of a Discontinuous Galerkin space based on a fixed family of basis function se...
Definition: discontinuousgalerkin/generic.hh:31
BaseType::GridPartType GridPartType
type of underlying grid part
Definition: discontinuousgalerkin/generic.hh:40
const BasisFunctionSetsType & basisFunctionSets() const
Definition: discontinuousgalerkin/generic.hh:128
BaseType::EntityType EntityType
type of entity of codimension 0
Definition: discontinuousgalerkin/generic.hh:42
BaseType::BasisFunctionSetType BasisFunctionSetType
type of basis function set of this space
Definition: discontinuousgalerkin/generic.hh:49
Traits::BasisFunctionSetsType BasisFunctionSetsType
basis function sets
Definition: discontinuousgalerkin/generic.hh:47
ShapeFunctionSetType shapeFunctionSet(const Dune::GeometryType &type) const
return shape function set
Definition: space/discontinuousgalerkin/tuple.hh:240
TupleLocalInterpolation< typename BasisFunctionSetsType::ShapeFunctionSetType, typename DFS::InterpolationImplType... > InterpolationImplType
Definition: space/discontinuousgalerkin/tuple.hh:255
BaseType::BasisFunctionSetType BasisFunctionSetType
Definition: space/discontinuousgalerkin/tuple.hh:247
LocalInterpolationWrapper< ThisType > InterpolationType
Definition: space/discontinuousgalerkin/tuple.hh:256
BaseType::GridPartType GridPartType
Definition: space/discontinuousgalerkin/tuple.hh:250
typename BasisFunctionSetsType::template SubDiscreteFunctionSpaceType< i > SubDiscreteFunctionSpaceType
Definition: space/discontinuousgalerkin/tuple.hh:253
BaseType::EntityType EntityType
Definition: space/discontinuousgalerkin/tuple.hh:249
InterpolationImplType localInterpolation(const EntityType &entity) const
Definition: space/discontinuousgalerkin/tuple.hh:269
InterpolationType interpolation() const
Definition: space/discontinuousgalerkin/tuple.hh:264
const SubDiscreteFunctionSpaceType< i > & subDiscreteFunctionSpace(std::integral_constant< std::size_t, i >={}) const
Definition: space/discontinuousgalerkin/tuple.hh:272
BaseType::BasisFunctionSetsType BasisFunctionSetsType
Definition: space/discontinuousgalerkin/tuple.hh:248
TupleDiscontinuousGalerkinSpace(GridPartType &gridPart, InterfaceType commInterface=InteriorBorder_All_Interface, CommunicationDirection commDirection=ForwardCommunication)
Definition: space/discontinuousgalerkin/tuple.hh:260
InterpolationImplType interpolation(const EntityType &entity) const
Definition: space/discontinuousgalerkin/tuple.hh:267
TupleDiscontinuousGalerkinSpaceTraits< DFS... > Traits
Definition: space/discontinuousgalerkin/tuple.hh:245
Definition: space/discontinuousgalerkin/tuple.hh:41
ShapeFunctionSetType shapeFunctionSet_
Definition: space/discontinuousgalerkin/tuple.hh:105
std::tuple< I... > interpolations_
Definition: space/discontinuousgalerkin/tuple.hh:106
void unbind()
Definition: space/discontinuousgalerkin/tuple.hh:102
TupleLocalInterpolation(ShapeFunctionSetType shapeFunctionSet, Args &&... args)
Definition: space/discontinuousgalerkin/tuple.hh:85
SFS ShapeFunctionSetType
Definition: space/discontinuousgalerkin/tuple.hh:45
static const int dimRange
Definition: space/discontinuousgalerkin/tuple.hh:47
void operator()(const LocalFunction &lf, LocalDofVector &ldv) const
Definition: space/discontinuousgalerkin/tuple.hh:91
Definition: space/discontinuousgalerkin/tuple.hh:116
BasisFunctionSetType basisFunctionSet(const EntityType &entity) const
Definition: space/discontinuousgalerkin/tuple.hh:155
int order(const EntityType &entity) const
Definition: space/discontinuousgalerkin/tuple.hh:153
const SubDiscreteFunctionSpaceType< i > & subDiscreteFunctionSpace(std::integral_constant< std::size_t, i >={}) const
Definition: space/discontinuousgalerkin/tuple.hh:159
TupleShapeFunctionSet< typename DFS::BasisFunctionSetType::ShapeFunctionSetType... > ShapeFunctionSetType
Definition: space/discontinuousgalerkin/tuple.hh:141
GridPartType::template Codim< codimension >::EntityType EntityType
Definition: space/discontinuousgalerkin/tuple.hh:144
TupleDiscontinuousGalerkinSpaceBasisFunctionSets(GridPartType &gridPart, InterfaceType commInterface, CommunicationDirection commDirection)
Definition: space/discontinuousgalerkin/tuple.hh:148
std::tuple_element_t< i, std::tuple< DFS... > > SubDiscreteFunctionSpaceType
Definition: space/discontinuousgalerkin/tuple.hh:137
static auto shapeFunctionSet(const BFS &basisFunctionSets, const EntityType &entity)
Definition: space/discontinuousgalerkin/tuple.hh:172
int order(std::index_sequence< i... >) const
Definition: space/discontinuousgalerkin/tuple.hh:178
ShapeFunctionSetType shapeFunctionSet(const EntityType &entity, std::index_sequence< i... >) const
Definition: space/discontinuousgalerkin/tuple.hh:190
int order() const
Definition: space/discontinuousgalerkin/tuple.hh:152
static const int codimension
Definition: space/discontinuousgalerkin/tuple.hh:143
ShapeFunctionSetType shapeFunctionSet(const EntityType &entity) const
Definition: space/discontinuousgalerkin/tuple.hh:156
DefaultBasisFunctionSet< EntityType, ShapeFunctionSetType > BasisFunctionSetType
Definition: space/discontinuousgalerkin/tuple.hh:146
static auto shapeFunctionSet(const DefaultBasisFunctionSets< GridPartType, SFS > &basisFunctionSets, const EntityType &entity)
Definition: space/discontinuousgalerkin/tuple.hh:166
SubDiscreteFunctionSpaceType< 0 >::GridPartType GridPartType
Definition: space/discontinuousgalerkin/tuple.hh:139
int order(const EntityType &entity, std::index_sequence< i... >) const
Definition: space/discontinuousgalerkin/tuple.hh:184
Definition: space/discontinuousgalerkin/tuple.hh:206
BasisFunctionSetsType::BasisFunctionSetType BasisFunctionSetType
Definition: space/discontinuousgalerkin/tuple.hh:212
BasisFunctionSetType::FunctionSpaceType FunctionSpaceType
Definition: space/discontinuousgalerkin/tuple.hh:214
TupleDiscontinuousGalerkinSpaceBasisFunctionSets< DFS... > BasisFunctionSetsType
Definition: space/discontinuousgalerkin/tuple.hh:209
Hybrid::CompositeIndexRange< typename DFS::LocalBlockIndices... > LocalBlockIndices
Definition: space/discontinuousgalerkin/tuple.hh:218
static const int codimension
Definition: space/discontinuousgalerkin/tuple.hh:216
CodimensionMapper< GridPartType, codimension > BlockMapperType
Definition: space/discontinuousgalerkin/tuple.hh:222
BasisFunctionSetsType::GridPartType GridPartType
Definition: space/discontinuousgalerkin/tuple.hh:211
TupleDiscontinuousGalerkinSpace< DFS... > DiscreteFunctionSpaceType
Definition: space/discontinuousgalerkin/tuple.hh:207
static const int polynomialOrder
Definition: space/discontinuousgalerkin/tuple.hh:220
Definition: space/discontinuousgalerkin/tuple.hh:226
DefaultCommunicationHandler< DiscreteFunction, Operation > Type
Definition: space/discontinuousgalerkin/tuple.hh:228
Operation OperationType
Definition: space/discontinuousgalerkin/tuple.hh:227
TupleDiscontinuousGalerkinSpace< typename DifferentDiscreteFunctionSpace< DFS, NewSubFunctionSpace< DFS::dimRange > >::Type... > Type
Definition: space/discontinuousgalerkin/tuple.hh:303
Definition: space/discontinuousgalerkin/tuple.hh:314
DefaultLocalRestrictProlong(const DiscreteFunctionSpaceType &space)
Definition: space/discontinuousgalerkin/tuple.hh:321
TupleDiscontinuousGalerkinSpace< DFS... > DiscreteFunctionSpaceType
Definition: space/discontinuousgalerkin/tuple.hh:319
mapper allocating one DoF per subentity of a given codimension
Definition: codimensionmapper.hh:345
Definition: space/shapefunctionset/tuple.hh:26
An implementation of DenseVector to extract a portion, not necessarly contiguos, of a vector.
Definition: subvector.hh:161
Index mapper which simply adds an offset to the index.
Definition: subvector.hh:83