DUNE-FEM (unstable)

dgspace.hh
1 #ifndef DUNE_FEM_SPACE_LOCALFINITEELEMENT_DGSPACE_HH
2 #define DUNE_FEM_SPACE_LOCALFINITEELEMENT_DGSPACE_HH
3 
4 #include <cassert>
5 
6 #include <memory>
7 #include <utility>
8 #include <vector>
9 
10 #include <dune/geometry/type.hh>
11 
12 #include <dune/fem/gridpart/common/capabilities.hh>
13 #include <dune/fem/space/basisfunctionset/default.hh>
14 #include <dune/fem/space/basisfunctionset/transformed.hh>
15 #include <dune/fem/space/common/defaultcommhandler.hh>
16 #include <dune/fem/space/common/discretefunctionspace.hh>
17 #include <dune/fem/space/common/functionspace.hh>
18 #include <dune/fem/space/mapper/compile.hh>
19 #include <dune/fem/space/mapper/indexsetdofmapper.hh>
20 #include <dune/fem/space/mapper/codimensionmapper.hh>
22 #include <dune/fem/space/shapefunctionset/selectcaching.hh>
23 #include <dune/fem/space/shapefunctionset/vectorial.hh>
24 
25 #include <dune/fem/space/localfiniteelement/shapefunctionset.hh>
26 #include <dune/fem/space/localfiniteelement/capabilities.hh>
27 #include <dune/fem/space/localfiniteelement/interpolation.hh>
28 
29 namespace Dune
30 {
31 
32  namespace Fem
33  {
34 
35  // DiscontinuousLocalFiniteElementSpaceTraits
36  // ------------------------------------------
37  template< class LFEMap, class FunctionSpace, class Storage,
38  unsigned int scalarBlockSize >
39  struct DiscontinuousLocalFiniteElementSpaceTraits
40  {
41  typedef DiscontinuousLocalFiniteElementSpace< LFEMap, FunctionSpace, Storage > DiscreteFunctionSpaceType;
42 
43  typedef LFEMap LFEMapType;
44 
45  typedef typename LFEMapType::GridPartType GridPartType;
46  typedef typename LFEMapType::LocalFiniteElementType LocalFiniteElementType;
47 
48  typedef GridFunctionSpace< GridPartType, FunctionSpace > FunctionSpaceType;
49 
50  static constexpr int codimension = 0;
51  static constexpr bool isScalar = LocalFiniteElementType::Traits::LocalBasisType::Traits::dimRange==1;
52  static constexpr bool fullBlocking = isScalar && scalarBlockSize>1;
53 
54  typedef std::conditional_t<isScalar,
55  Hybrid::IndexRange< int, FunctionSpace::dimRange*scalarBlockSize >,
56  Hybrid::IndexRange< int, 1 >
57  > LocalBlockIndices;
58 
59  private:
60  typedef typename GridPartType::template Codim< codimension >::EntityType EntityType;
61 
62  public:
63  using BlockMapperType = std::conditional_t<!fullBlocking,
64  IndexSetDofMapper< GridPartType >,
65  CodimensionMapper< GridPartType, codimension > >;
66 
67  // TODO: need SFINAE since not all LFEMap have a pointSetId
68  typedef LocalFunctionsShapeFunctionSet< typename LocalFiniteElementType::Traits::LocalBasisType, LFEMap::pointSetId > LocalFunctionsShapeFunctionSetType;
69  typedef SelectCachingShapeFunctionSet< LocalFunctionsShapeFunctionSetType, Storage > StoredShapeFunctionSetType;
70 
71  typedef ShapeFunctionSetProxy< StoredShapeFunctionSetType > ShapeFunctionSetProxyType;
72  // only extend to vector valued in case that the original space is scalar
73  typedef std::conditional_t<isScalar,
74  VectorialShapeFunctionSet< ShapeFunctionSetProxyType, typename FunctionSpaceType::RangeType >,
75  ShapeFunctionSetProxyType
76  > ShapeFunctionSetType;
77 
78  private:
79  template< class LFEM >
80  static TransformedBasisFunctionSet< EntityType, ShapeFunctionSetType, typename LFEM::TransformationType > basisFunctionSet ( const LFEM & );
81 
82  static DefaultBasisFunctionSet< EntityType, ShapeFunctionSetType > basisFunctionSet ( ... );
83 
84  public:
85  typedef decltype( basisFunctionSet( std::declval< const LFEMapType & >() ) ) BasisFunctionSetType;
86 
87  template< class DiscreteFunction, class Operation = DFCommunicationOperation::Copy >
88  struct CommDataHandle
89  {
90  typedef DefaultCommunicationHandler< DiscreteFunction, Operation > Type;
91  typedef Operation OperationType;
92  };
93  };
94 
95 
96 
97  // DiscontinuousLocalFiniteElementSpace
98  // ------------------------------------
99 
109  template <class LFEMap,class Enabler>
110  struct FixedPolyOrder_
111  {
112  static const unsigned int scalarBlockSize = 1;
113  };
114  template <class LFEMap>
115  struct FixedPolyOrder_<LFEMap,
116  std::enable_if_t<LFEMap::numBasisFunctions>=0, std::true_type> >
117  {
118  static const unsigned int scalarBlockSize = LFEMap::numBasisFunctions;
119  static const unsigned int polynomialOrder = LFEMap::polynomialOrder;
120  };
121  template <class LFEMap>
122  using FixedPolyOrder = FixedPolyOrder_<LFEMap,std::true_type>;
123 
124  template< class LFEMap, class FunctionSpace, class Storage >
127  DiscontinuousLocalFiniteElementSpaceTraits< LFEMap,
128  FunctionSpace, Storage, FixedPolyOrder<LFEMap>::scalarBlockSize > >,
129  public FixedPolyOrder<LFEMap>
130  {
133  DiscontinuousLocalFiniteElementSpaceTraits< LFEMap, FunctionSpace,
134  Storage, FixedPolyOrder<LFEMap>::scalarBlockSize > > BaseType;
135 
136  typedef typename BaseType::Traits Traits;
137 
138  public:
139  typedef typename BaseType::FunctionSpaceType FunctionSpaceType;
140 
141  typedef typename BaseType::GridPartType GridPartType;
142  typedef typename BaseType::EntityType EntityType;
143  typedef typename BaseType::IntersectionType IntersectionType;
144 
145  typedef typename BaseType::Traits::ShapeFunctionSetType ShapeFunctionSetType;
146  typedef typename BaseType::BasisFunctionSetType BasisFunctionSetType;
147 
148  typedef typename BaseType::BlockMapperType BlockMapperType;
149 
150  typedef typename Traits::LocalFiniteElementType LocalFiniteElementType;
151  // typedef L2LocalFiniteElement< typename Traits::LocalFiniteElementType > LocalFiniteElementType;
152 
153  typedef typename Traits::LFEMapType LFEMapType;
154 
155  typedef typename LFEMapType::KeyType KeyType;
156 
157  private:
158  typedef typename LocalFiniteElementType::Traits::LocalBasisType LocalBasisType;
159  typedef typename LocalFiniteElementType::Traits::LocalInterpolationType LocalInterpolationType;
160  typedef typename LocalFiniteElementType::Traits::LocalCoefficientsType LocalCoefficientsType;
161 
162  typedef typename Traits::LocalFunctionsShapeFunctionSetType LocalFunctionsShapeFunctionSetType;
163 
164  struct LFEMapFactory
165  {
166  static LFEMapType *createObject ( std::pair< GridPartType *, KeyType > key ) { return new LFEMapType( *key.first, key.second ); }
167  static void deleteObject ( LFEMapType *object ) { delete object; }
168  };
169 
170  typedef SingletonList< std::pair< GridPartType *, KeyType >, LFEMapType, LFEMapFactory > LFEMapProviderType;
171 
172  typedef typename Traits::StoredShapeFunctionSetType StoredShapeFunctionSetType;
173  typedef std::vector< std::unique_ptr< StoredShapeFunctionSetType > > StoredShapeFunctionSetVectorType;
174 
175  struct StoredShapeFunctionSetVectorFactory
176  {
177  static StoredShapeFunctionSetVectorType *createObject ( LFEMapType *lfeMap ) { return new StoredShapeFunctionSetVectorType( lfeMap->size() ); }
178  static void deleteObject ( StoredShapeFunctionSetVectorType *object ) { delete object; }
179  };
180 
182 
183  struct BlockMapperSingletonFactory
184  {
185  static BlockMapperType *createObject ( LFEMapType *lfeMap )
186  {
187  if constexpr (!Traits::fullBlocking)
188  return new BlockMapperType( lfeMap->gridPart(),
189  [ lfeMap ] ( const auto &refElement ) {
190  if( lfeMap->hasCoefficients( refElement.type() ) )
191  return Dune::Fem::generateCodimensionCode( refElement, 0, lfeMap->localCoefficients( refElement.type() ).size() );
192  else
193  return Dune::Fem::DofMapperCode();
194  } );
195  else
196  return new BlockMapperType( lfeMap->gridPart() );
197  }
198 
199  static void deleteObject ( BlockMapperType *object ) { delete object; }
200  };
201 
203 
204  public:
205  //- internal implementation
206  typedef LocalFiniteElementInterpolation< ThisType, LocalInterpolationType, LocalBasisType::dimRange==1 > InterpolationImplType;
207 
209  typedef LocalFEInterpolationWrapper< ThisType > InterpolationType;
210 
211  using BaseType::order;
212 
213  template< class GridPart, std::enable_if_t< std::is_same< GridPart, GridPartType >::value &&std::is_same< KeyType, std::tuple<> >::value, int > = 0 >
214  explicit DiscontinuousLocalFiniteElementSpace ( GridPart &gridPart,
215  const InterfaceType commInterface = InteriorBorder_All_Interface,
216  const CommunicationDirection commDirection = ForwardCommunication )
217  : BaseType( gridPart, commInterface, commDirection ),
218  lfeMap_( &LFEMapProviderType::getObject( std::make_pair( &gridPart, KeyType() ) ) ),
219  storedShapeFunctionSetVector_( &StoredShapeFunctionSetVectorProviderType::getObject( lfeMap_.get() ) ),
220  blockMapper_( &BlockMapperProviderType::getObject( lfeMap_.get()))
221  {}
222 
223  template< class GridPart, std::enable_if_t< std::is_same< GridPart, GridPartType >::value && !std::is_same< KeyType, std::tuple<> >::value, int > = 0 >
224  explicit DiscontinuousLocalFiniteElementSpace ( GridPart &gridPart, const KeyType &key,
225  const InterfaceType commInterface = InteriorBorder_All_Interface,
226  const CommunicationDirection commDirection = ForwardCommunication )
227  : BaseType( gridPart, commInterface, commDirection ),
228  lfeMap_( &LFEMapProviderType::getObject( std::make_pair( &gridPart, key ) ) ),
229  storedShapeFunctionSetVector_( &StoredShapeFunctionSetVectorProviderType::getObject( lfeMap_.get() ) ),
230  blockMapper_( &BlockMapperProviderType::getObject( lfeMap_.get()) )
231  {}
232 
233  DiscontinuousLocalFiniteElementSpace ( const ThisType & ) = delete;
234  DiscontinuousLocalFiniteElementSpace ( ThisType && ) = delete;
235 
236  ThisType &operator= ( const ThisType & ) = delete;
237  ThisType &operator= ( ThisType && ) = delete;
238 
240  DFSpaceIdentifier type () const { return DGSpace_id; }
241 
243  BasisFunctionSetType basisFunctionSet ( const EntityType &entity ) const
244  {
245  return BasisFunctionSetType( entity, shapeFunctionSet( entity ) );
246  }
247 
255  ShapeFunctionSetType shapeFunctionSet ( const EntityType &entity ) const
256  {
257  return getShapeFunctionSet( (*lfeMap_)( entity ), entity.type() );
258  }
259 
261  bool continuous () const { return false; }
262 
264  bool continuous ( const IntersectionType &intersection ) const { return false; }
265 
267  int order () const { return lfeMap_->order(); }
268 
270  bool multipleGeometryTypes () const { return true; }
271 
273  BlockMapperType &blockMapper () const { assert( blockMapper_ ); return *blockMapper_; }
274 
280  {
281  return InterpolationType( *this );
282  }
283 
289  [[deprecated("Use LocalInterpolation( space ) instead!")]]
290  InterpolationImplType interpolation ( const EntityType &entity ) const
291  {
292  return localInterpolation( entity );
293  }
294 
300  InterpolationImplType localInterpolation ( const EntityType &entity ) const
301  {
302  auto lfe = (*lfeMap_)( entity );
303  return InterpolationImplType( BasisFunctionSetType( entity, getShapeFunctionSet( lfe, entity.type() ) ), std::get< 2 >( lfe ) );
304  }
305 
306  typedef typename LFEMapType::LocalCoefficientsType QuadratureType;
307  const QuadratureType& quadrature ( const GeometryType &type ) const
308  {
309  return (*lfeMap_).localCoefficients(type);
310  }
311  private:
312  ShapeFunctionSetType getShapeFunctionSet ( std::tuple< std::size_t, const LocalBasisType &, const LocalInterpolationType & > lfe, const GeometryType &type ) const
313  {
314  auto &storedShapeFunctionSet = (*storedShapeFunctionSetVector_)[ std::get< 0 >( lfe ) ];
315  if( !storedShapeFunctionSet )
316  storedShapeFunctionSet.reset( new StoredShapeFunctionSetType( type, LocalFunctionsShapeFunctionSetType( std::get< 1 >( lfe ) ) ) );
317  return ShapeFunctionSetType( storedShapeFunctionSet.get() );
318  }
319 
320  std::unique_ptr< LFEMapType, typename LFEMapProviderType::Deleter > lfeMap_;
321  std::unique_ptr< StoredShapeFunctionSetVectorType, typename StoredShapeFunctionSetVectorProviderType::Deleter > storedShapeFunctionSetVector_;
322  std::unique_ptr< BlockMapperType, typename BlockMapperProviderType::Deleter > blockMapper_;
323  };
324 
325  template< class LFEMap, class FunctionSpace, class Storage, int newRange >
326  struct ToNewDimRangeFunctionSpace<
327  DiscontinuousLocalFiniteElementSpace<LFEMap, FunctionSpace, Storage>, newRange>
328  {
329  typedef DiscontinuousLocalFiniteElementSpace<LFEMap, typename ToNewDimRangeFunctionSpace<FunctionSpace,newRange>::Type, Storage> Type;
330  };
331  template <class LFEMap, class FunctionSpace, class Storage,
332  class NewFunctionSpace>
333  struct DifferentDiscreteFunctionSpace<
334  DiscontinuousLocalFiniteElementSpace<LFEMap,FunctionSpace,Storage>, NewFunctionSpace>
335  {
336  typedef DiscontinuousLocalFiniteElementSpace<LFEMap, NewFunctionSpace, Storage > Type;
337  };
338 
339  } // namespace Fem
340 
341 } // namespace Dune
342 
343 #endif // #ifndef DUNE_FEM_SPACE_LOCALFINITEELEMENT_DGSPACE_HH
Rannacher-Turek Space.
Definition: dgspace.hh:130
bool multipleGeometryTypes() const
returns true if the grid has more than one geometry type
Definition: dgspace.hh:270
InterpolationImplType localInterpolation(const EntityType &entity) const
return local interpolation
Definition: dgspace.hh:300
bool continuous(const IntersectionType &intersection) const
returns true if the space contains only globally continuous functions
Definition: dgspace.hh:264
BlockMapperType & blockMapper() const
get a reference to the block mapper
Definition: dgspace.hh:273
DFSpaceIdentifier type() const
return type identifier of discrete function space
Definition: dgspace.hh:240
bool continuous() const
returns true if the space contains only globally continuous functions
Definition: dgspace.hh:261
LocalFEInterpolationWrapper< ThisType > InterpolationType
Interpolation object.
Definition: dgspace.hh:209
BasisFunctionSetType basisFunctionSet(const EntityType &entity) const
get basis function set for given entity
Definition: dgspace.hh:243
ShapeFunctionSetType shapeFunctionSet(const EntityType &entity) const
return shape function set for given entity
Definition: dgspace.hh:255
int order() const
get global order of space
Definition: dgspace.hh:267
InterpolationType interpolation() const
return local interpolation object (uninitialized)
Definition: dgspace.hh:279
InterpolationImplType interpolation(const EntityType &entity) const
return local interpolation
Definition: dgspace.hh:290
This is the class with default implementations for discrete function. The methods not marked with hav...
Definition: discretefunctionspace.hh:649
Traits ::BasisFunctionSetType BasisFunctionSetType
type of basis function set of this space
Definition: discretefunctionspace.hh:201
A vector valued function space.
Definition: functionspace.hh:60
Singleton list for key/object pairs.
Definition: singletonlist.hh:53
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
DFSpaceIdentifier
enumerator for identification of spaces
Definition: discretefunctionspace.hh:95
@ DGSpace_id
id for Discontinuous Galerkin Space
Definition: discretefunctionspace.hh:98
CommunicationDirection
Define a type for communication direction parameter.
Definition: gridenums.hh:170
InterfaceType
Parameter to be used for the communication functions.
Definition: gridenums.hh:86
@ ForwardCommunication
communicate as given in InterfaceType
Definition: gridenums.hh:171
@ InteriorBorder_All_Interface
send interior and border, receive all entities
Definition: gridenums.hh:88
Dune namespace.
Definition: alignedallocator.hh:13
constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant< std::size_t, pos >={})
Return the entry at position pos of the given sequence.
Definition: integersequence.hh:22
Provides a proxy class for pointers to a shape function set.
A unique label for each type of element that can occur in a grid.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 12, 22:29, 2024)