dune-fem  2.8-git
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 
22 namespace 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:
45  typedef SFS ShapeFunctionSetType;
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  {
241  typedef TupleDiscontinuousGalerkinSpace< DFS... > ThisType;
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 
264  InterpolationType interpolation () const { return InterpolationType( *this ); }
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
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
Traits ::GridPartType GridPartType
type of underlying grid part
Definition: discretefunctionspace.hh:210
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
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
const BasisFunctionSetsType & basisFunctionSets() const
Definition: discontinuousgalerkin/generic.hh:128
BaseType::GridPartType GridPartType
type of underlying grid part
Definition: discontinuousgalerkin/generic.hh:40
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
const SubDiscreteFunctionSpaceType< i > & subDiscreteFunctionSpace(std::integral_constant< std::size_t, i >={}) const
Definition: space/discontinuousgalerkin/tuple.hh:272
InterpolationType interpolation() const
Definition: space/discontinuousgalerkin/tuple.hh:264
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
TupleShapeFunctionSet< typename DFS::BasisFunctionSetType::ShapeFunctionSetType... > ShapeFunctionSetType
Definition: space/discontinuousgalerkin/tuple.hh:141
const SubDiscreteFunctionSpaceType< i > & subDiscreteFunctionSpace(std::integral_constant< std::size_t, i >={}) const
Definition: space/discontinuousgalerkin/tuple.hh:159
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
SubDiscreteFunctionSpaceType< 0 >::GridPartType GridPartType
Definition: space/discontinuousgalerkin/tuple.hh:139
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
int order(const EntityType &entity, std::index_sequence< i... >) const
Definition: space/discontinuousgalerkin/tuple.hh:184
GridPartType::template Codim< codimension >::EntityType EntityType
Definition: space/discontinuousgalerkin/tuple.hh:144
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:330
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