dune-fem 2.8.0
Loading...
Searching...
No Matches
space/discontinuousgalerkin/tuple.hh
Go to the documentation of this file.
1#ifndef DUNE_FEM_SPACE_DISCONTINUOUSGALERKIN_TUPLE_HH
2#define DUNE_FEM_SPACE_DISCONTINUOUSGALERKIN_TUPLE_HH
3
4#include <tuple>
5#include <type_traits>
6#include <utility>
7
8#include <dune/common/hybridutilities.hh>
9
20
21
22namespace Dune
23{
24
25 namespace Fem
26 {
27
28 // Internal Forward Declarations
29 // -----------------------------
30
31 template< class... DFS >
32 class TupleDiscontinuousGalerkinSpace;
33
34
35
36 // TupleLocalInterpolation
37 // -----------------------
38
39 template< class SFS, class... I >
41 {
42 typedef TupleLocalInterpolation< SFS, I... > ThisType;
43
44 public:
46
47 static const int dimRange = ShapeFunctionSetType::RangeType::dimension;
48
49 private:
50 template< std::size_t i >
51 using SubRangeType = typename ShapeFunctionSetType::template SubShapeFunctionSetType< i >::RangeType;
52
53 template< std::size_t... i >
54 static constexpr int sumDimSubRange ( std::index_sequence< i... > )
55 {
56 return Std::sum( SubRangeType< i >::dimension ... );
57 }
58
59 static constexpr int sumDimSubRange ( std::index_sequence<> ) { return 0; }
60
61 template< std::size_t i >
62 struct RangeConverter
63 {
64 template< class T >
65 FieldVector< T, SubRangeType< i >::dimension > operator() ( const FieldVector< T, dimRange > &in ) const
66 {
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 >() ) ];
70 return out;
71 }
72
73 template< class T, int cols >
74 FieldMatrix< T, SubRangeType< i >::dimension, cols > operator() ( const FieldMatrix< T, dimRange, cols > &in ) const
75 {
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 >() ) ];
79 return out;
80 }
81 };
82
83 public:
84 template< class... Args >
85 explicit TupleLocalInterpolation ( ShapeFunctionSetType shapeFunctionSet, Args &&... args )
86 : shapeFunctionSet_( std::move( shapeFunctionSet ) ),
87 interpolations_( std::forward< Args >( args )... )
88 {}
89
90 template< class LocalFunction, class LocalDofVector >
91 void operator() ( const LocalFunction &lf, LocalDofVector &ldv ) const
92 {
93 std::size_t offset = 0;
94 Hybrid::forEach( std::index_sequence_for< I... >(), [ this, &lf, &ldv, &offset ] ( auto i ) {
95 const std::size_t size = shapeFunctionSet_.subShapeFunctionSet( i ).size();
97 std::get< i >( interpolations_ ) ( localFunctionConverter( lf, RangeConverter< i >() ), subLdv );
98 offset += size;
99 } );
100 }
101
102 void unbind() {}
103
104 protected:
106 std::tuple< I... > interpolations_;
107 };
108
109
110
111 // TupleDiscontinuousGalerkinSpaceBasisFunctionSets
112 // ------------------------------------------------
113
114 template< class... DFS >
116 {
118
119 static_assert( sizeof...( DFS ) > 0, "TupleDiscontinuousGalerkinSpace requires at least on space." );
120
121 static_assert( Std::are_all_same< typename DFS::GridPartType... >::value, "TupleDiscontinuousGalerkinSpace only works on spaces with identical GridPart." );
122
123 template< class E, class SFS >
124 static std::true_type isDefaultBasisFunctionSet ( DefaultBasisFunctionSet< E, SFS > );
125
126 static std::false_type isDefaultBasisFunctionSet ( ... );
127
128 template< class BFS >
129 struct IsDefaultBasisFunctionSet
130 : public decltype( isDefaultBasisFunctionSet( std::declval< BFS >() ) )
131 {};
132
133 static_assert( Std::And( IsDefaultBasisFunctionSet< typename DFS::BasisFunctionSetType >::value... ), "TupleDiscontinuousGalerkinSpace only works on spaces with DefaultBasisFunctionSets." );
134
135 public:
136 template< std::size_t i >
137 using SubDiscreteFunctionSpaceType = std::tuple_element_t< i, std::tuple< DFS... > >;
138
140
141 typedef TupleShapeFunctionSet< typename DFS::BasisFunctionSetType::ShapeFunctionSetType... > ShapeFunctionSetType;
142
143 static const int codimension = GridPartType::dimension - ShapeFunctionSetType::DomainType::dimension;
144 typedef typename GridPartType::template Codim< codimension >::EntityType EntityType;
145
147
148 TupleDiscontinuousGalerkinSpaceBasisFunctionSets ( GridPartType &gridPart, InterfaceType commInterface, CommunicationDirection commDirection )
149 : subDiscreteFunctionSpaces_( DFS( gridPart, commInterface, commDirection )... )
150 {}
151
152 int order () const { return order( std::index_sequence_for< DFS... >() ); }
153 int order ( const EntityType &entity ) const { return order( entity, std::index_sequence_for< DFS... >() ); }
154
155 BasisFunctionSetType basisFunctionSet ( const EntityType &entity ) const { return BasisFunctionSetType( entity, shapeFunctionSet( entity ) ); }
156 ShapeFunctionSetType shapeFunctionSet ( const EntityType &entity ) const { return shapeFunctionSet( entity, std::index_sequence_for< DFS... >() ); }
157
158 template< std::size_t i >
159 const SubDiscreteFunctionSpaceType< i > &subDiscreteFunctionSpace ( std::integral_constant< std::size_t, i > = {} ) const
160 {
161 return std::get< i >( subDiscreteFunctionSpaces_ );
162 }
163
164 protected:
165 template< class SFS >
166 static auto shapeFunctionSet ( const DefaultBasisFunctionSets< GridPartType, SFS > &basisFunctionSets, const EntityType &entity )
167 {
168 return basisFunctionSets.shapeFunctionSets().shapeFunctionSet( entity.type() );
169 }
170
171 template< class BFS >
172 static auto shapeFunctionSet ( const BFS &basisFunctionSets, const EntityType &entity )
173 {
174 return basisFunctionSets.basisFunctionSet( entity ).shapeFunctionSet();
175 }
176
177 template< std::size_t... i >
178 int order ( std::index_sequence< i... > ) const
179 {
180 return Std::max( subDiscreteFunctionSpace< i >().order()... );
181 }
182
183 template< std::size_t... i >
184 int order ( const EntityType &entity, std::index_sequence< i... > ) const
185 {
186 return Std::max( subDiscreteFunctionSpace< i >().order( entity )... );
187 }
188
189 template< std::size_t... i >
190 ShapeFunctionSetType shapeFunctionSet ( const EntityType &entity, std::index_sequence< i... > ) const
191 {
192 return ShapeFunctionSetType( shapeFunctionSet( subDiscreteFunctionSpace< i >().basisFunctionSets(), entity )... );
193 }
194
195 private:
196 std::tuple< DFS... > subDiscreteFunctionSpaces_;
197 };
198
199
200
201 // TaylorHoodDiscontinuousGalerkinSpaceTraits
202 // ------------------------------------------
203
204 template< class... DFS >
206 {
208
210
213
215
217
218 typedef Hybrid::CompositeIndexRange< typename DFS::LocalBlockIndices... > LocalBlockIndices;
219
220 static const int polynomialOrder = Std::max( static_cast< int >( DFS::polynomialOrder )... );
221
223
224 template< class DiscreteFunction, class Operation = DFCommunicationOperation::Copy >
226 {
227 typedef Operation OperationType;
229 };
230 };
231
232
233
234 // TaylorHoodDiscontinuousGalerkinSpace
235 // ------------------------------------
236
237 template< class... DFS >
239 : public GenericDiscontinuousGalerkinSpace< TupleDiscontinuousGalerkinSpaceTraits< DFS... > >
240 {
243
244 public:
246
251
252 template< std::size_t i >
253 using SubDiscreteFunctionSpaceType = typename BasisFunctionSetsType::template SubDiscreteFunctionSpaceType< i >;
254
255 typedef TupleLocalInterpolation< typename BasisFunctionSetsType::ShapeFunctionSetType, typename DFS::InterpolationImplType... > InterpolationImplType;
257
259
260 TupleDiscontinuousGalerkinSpace ( GridPartType &gridPart, InterfaceType commInterface = InteriorBorder_All_Interface, CommunicationDirection commDirection = ForwardCommunication )
261 : BaseType( gridPart, BasisFunctionSetsType( gridPart, commInterface, commDirection ), commInterface, commDirection )
262 {}
263
265
266 [[deprecated]]
267 InterpolationImplType interpolation ( const EntityType &entity ) const { return localInterpolation( entity ); }
268
269 InterpolationImplType localInterpolation ( const EntityType &entity ) const { return localInterpolation( entity, std::index_sequence_for< DFS... >() ); }
270
271 template< std::size_t i >
272 const SubDiscreteFunctionSpaceType< i > &subDiscreteFunctionSpace ( std::integral_constant< std::size_t, i > = {} ) const
273 {
274 return basisFunctionSets().subDiscreteFunctionSpace( std::integral_constant< std::size_t, i >() );
275 }
276
277 private:
278 template< std::size_t... i >
279 InterpolationImplType localInterpolation ( const EntityType &entity, std::index_sequence< i... > ) const
280 {
281 return InterpolationImplType( basisFunctionSets().shapeFunctionSet( entity ), subDiscreteFunctionSpace< i >().localInterpolation( entity )... );
282 }
283 };
284
285
286
287 // DifferentDiscreteFunctionSpace
288 // ------------------------------
289
290 template< class... DFS, class NewFunctionSpace >
292 {
293 static_assert( NewFunctionSpace::dimRange % TupleDiscontinuousGalerkinSpace< DFS... >::dimRange == 0,
294 "DifferentDiscreteFunctionSpace can only be applied to TupleDiscontinuousGalerkinSpace, if new dimRange is a multiple of the original one." );
295
296 private:
297 static const int factor = (NewFunctionSpace::dimRange / TupleDiscontinuousGalerkinSpace< DFS... >::dimRange);
298
299 template< int dimRange >
301
302 public:
304 };
305
306
307
308 // DefaultLocalRestrictProlong
309 // ---------------------------
310
311 template< class... DFS >
313 : public TupleLocalRestrictProlong< DFS... >
314 {
316 typedef TupleLocalRestrictProlong< DFS... > BaseType;
317
318 public:
320
322 : BaseType( subDiscreteFunctionSpaces( space, std::index_sequence_for< DFS... >() ) )
323 {}
324
325 private:
326 template< std::size_t... i >
327 static std::tuple< const DFS &... > subDiscreteFunctionSpaces ( const DiscreteFunctionSpaceType &space, std::index_sequence< i... > )
328 {
329 return std::tie( space.subDiscreteFunctionSpace( std::integral_constant< std::size_t, i >() )... );
330 }
331 };
332
333 } // namespace Fem
334
335} // namespace Dune
336
337#endif // #ifndef DUNE_FEM_SPACE_DISCONTINUOUSGALERKIN_TUPLE_HH
STL namespace.
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: hybrid.hh:99
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
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