Loading [MathJax]/extensions/tex2jax.js

DUNE-FEM (unstable)

cachingquadrature.hh
1#ifndef DUNE_FEM_CACHINGQUADRATURE_HH
2#define DUNE_FEM_CACHINGQUADRATURE_HH
3
4#if __GNUC__ >= 13
5#pragma GCC diagnostic push
6#pragma GCC diagnostic ignored "-Wdangling-reference"
7#endif
8
9//- Dune includes
10#include <dune/common/math.hh>
11
12//- Local includes
13#include <dune/fem/quadrature/elementquadrature.hh>
14#include <dune/fem/quadrature/caching/twistutility.hh>
15#include <dune/fem/quadrature/caching/pointmapper.hh>
16#include <dune/fem/quadrature/caching/cacheprovider.hh>
17
18namespace Dune
19{
20
21 namespace Fem
22 {
23
28 {
29 protected:
30 // do not create instances of this class
32 {
33 }
34
35 public:
37 static constexpr bool twisted () { return false; }
38
40 inline int twistId () const { return 0; }
41
52 inline size_t cachingPoint( const size_t quadraturePoint ) const
53 {
55 "CachingInterface :: cachingPoint must be overloaded!" );
56 }
57
63 inline size_t interpolationPoint( const size_t quadraturePoint ) const
64 {
66 "CachingInterface :: interpolationPoint must be overloaded!" );
67 }
68
75 inline bool isInterpolationQuadrature( const size_t numShapeFunctions ) const
76 {
78 "CachingInterface :: isInterpolationQuadrature must be overloaded!" );
79 }
80 };
81
82
83
105 template< class GridPartImp, int codim, class IntegrationTraits, bool isQuadrature >
107
108
110 template< class GridPartImp, class IntegrationTraits, bool isQuadrature >
111 class CachingQuadratureImpl< GridPartImp, 0, IntegrationTraits, isQuadrature >
112 : public ElementPointListBase< GridPartImp, 0, IntegrationTraits >,
113 public CachingInterface
114 {
117
118 public:
119 typedef typename Base::GridPartType GridPartType;
120 typedef typename Base::EntityType EntityType;
121 static const int codimension = Base::codimension;
122
124 typedef typename Base::CoordinateType CoordinateType;
125
130
132 static const int pointSetId = SelectQuadraturePointSetId<
133 typename IntegrationTraits::IntegrationPointListType::Traits > :: value;
134
135 protected:
136 using Base::quadImp;
137
138 public:
141 using Base::localPoint;
142 using Base::nop;
143
146 template <class QuadratureKeyType>
147 CachingQuadratureImpl( const EntityType& entity, const QuadratureKeyType& quadKey )
148 : Base( entity.type(), quadKey )
149 {
150 CacheProvider< GridPartType, codimension >::registerQuadrature( quadImp() );
151 }
152
155 template <class QuadratureKeyType>
156 CachingQuadratureImpl( const GeometryType &geometry, const QuadratureKeyType& quadKey )
157 : Base( geometry, quadKey )
158 {
159 CacheProvider< GridPartType, codimension >::registerQuadrature( quadImp() );
160 }
161
162 const QuadraturePointWrapperType operator[] ( const size_t i ) const
163 {
164 return QuadraturePointWrapperType( *this, i );
165 }
166
167 IteratorType begin () const noexcept { return IteratorType( *this, 0 ); }
168 IteratorType end () const noexcept { return IteratorType( *this, nop() ); }
169
171 const CoordinateType &point ( const size_t i ) const
172 {
173 return localPoint( i );
174 }
175
177 auto weight ( std::size_t i ) const
178 {
179 return quadImp().weight( i );
180 }
181
183 inline size_t cachingPoint( const size_t quadraturePoint ) const
184 {
185 return quadraturePoint;
186 }
187
189 inline size_t interpolationPoint( const size_t quadraturePoint ) const
190 {
191 return quadraturePoint;
192 }
193
195 inline bool isInterpolationQuadrature( const size_t numShapeFunctions ) const
196 {
197 // if pointSetId is not negative then we have an interpolation
198 // quadrature if the number of point are equal to number of shape functions
199 return (pointSetId >= 0) ? (nop() == numShapeFunctions) : false;
200 }
201 };
202
203
204
206 template< typename GridPartImp, class IntegrationTraits, bool isQuadrature >
207 class CachingQuadratureImpl< GridPartImp, 1, IntegrationTraits, isQuadrature >
208 : public ElementPointListBase< GridPartImp, 1, IntegrationTraits >,
209 public CachingInterface
210 {
213
214 public:
216 typedef GridPartImp GridPartType;
217
218 typedef typename Base::RealType RealType;
219 static const int dimension = Base::dimension;
220 static const int codimension = Base::codimension;
221
223 typedef typename Base::CoordinateType CoordinateType;
224
227 typedef typename IntersectionIteratorType::Intersection IntersectionType;
228
232
234 typedef ElementQuadratureImpl< GridPartType, codimension, IntegrationTraits, isQuadrature >
236
237
238 // for compatibility
240 typedef IntersectionIteratorType IntersectionIterator;
241
242 private:
243 static const int quadPointSetId =
245
246 public:
247 // Note: we also exclude GaussLegendre(0) here, because on faces it is not
248 // an interpolation rule
249 static const int pointSetId = (quadPointSetId > 0) ? quadPointSetId :
251
252 protected:
253 typedef typename CachingTraits< RealType, dimension >::MapperPairType MapperPairType;
254 typedef typename CachingTraits< RealType, dimension >::PointVectorType PointVectorType;
255
256 typedef CacheProvider< GridPartType, codimension > CacheProviderType;
257 typedef PointProvider< RealType, dimension, codimension> PointProviderType;
258
259 using Base::quadImp;
260
261 public:
262 using Base::localFaceIndex;
263 using Base::elementGeometry;
264 using Base::nop;
265
278 template <class QuadratureKeyType>
280 const IntersectionType &intersection,
281 const QuadratureKeyType& quadKey, const typename Base :: Side side )
282 : Base( getPointList( intersection, quadKey, side ) ),
283 side_(side),
284 twist_( getTwist( gridPart, intersection, side ) ),
285 mapper_( CacheProviderType::getMapper( quadImp(), elementGeometry(), localFaceIndex(), twist_) ),
286 points_( PointProviderType::getPoints( quadImp().ipList().id(), elementGeometry() ) ),
287 intersection_(intersection)
288 {
289 }
290
291 const QuadraturePointWrapperType operator[] ( const size_t i ) const
292 {
293 return QuadraturePointWrapperType( *this, i );
294 }
295
296 IteratorType begin () const noexcept { return IteratorType( *this, 0 ); }
297 IteratorType end () const noexcept { return IteratorType( *this, nop() ); }
298
299 typename Base :: Side side() const { return side_; }
300 bool isInside() const { return side_ == Base::INSIDE; }
301
304 const CoordinateType &point ( const size_t i ) const
305 {
306 return points_[ cachingPoint( i ) ];
307 }
308
310 auto weight ( std::size_t i ) const
311 {
312 return quadImp().weight( i );
313 }
314
315 const IntersectionType &intersection() const
316 {
317 return intersection_;
318 }
319
321 static constexpr bool twisted() { return true; }
322
324 inline int twistId () const { return twist_ + 4; }
325
327 inline size_t cachingPoint( const size_t quadraturePoint ) const
328 {
329 assert( quadraturePoint < (size_t)nop() );
330 return mapper_.first[ quadraturePoint ];
331 }
332
334 inline size_t interpolationPoint( const size_t quadraturePoint ) const
335 {
336 assert( quadraturePoint < mapper_.second.size() );
337 return mapper_.second[ quadraturePoint ];
338 }
339
341 inline bool isInterpolationQuadrature( const size_t numShapeFunctions ) const
342 {
343 // if pointSetId is not negative then we have an interpolation
344 // quadrature if the number of point are equal to number of shape functions
345 return (pointSetId < 0) ? false :
346 quadImp().ipList().isFaceInterpolationQuadrature( numShapeFunctions );
347 }
348
349 // return local caching point
350 // for debugging issues only
351 size_t localCachingPoint ( const size_t i ) const
352 {
353 const auto& mapper = mapper_.first;
354
355 assert( i < (size_t)nop() );
356
357 assert( mapper[ i ] >= 0 );
358 int faceIndex = localFaceIndex();
359 unsigned int point = mapper[ i ] - faceIndex * mapper.size();
360 assert( point < nop() );
361
362 return point;
363 }
364
365 protected:
366 template <class QuadratureKeyType>
367 Base getPointList ( const IntersectionType &intersection,
368 const QuadratureKeyType& key,
369 const typename Base :: Side side )
370 {
371 switch( side )
372 {
373 case Base :: INSIDE:
374 return Base( TwistUtilityType::elementGeometry( intersection, true ),
375 intersection.indexInInside(), key );
376
377 case Base :: OUTSIDE:
378 return Base( TwistUtilityType::elementGeometry( intersection, false ),
379 intersection.indexInOutside(), key );
380
381 default:
382 DUNE_THROW( InvalidStateException, "ElementIntegrationPointList: side must either be INSIDE or OUTSIDE." );
383 }
384 }
385
386 int getTwist ( const GridPartType &gridPart,
387 const IntersectionType &intersection,
388 const typename Base :: Side side )
389 {
390 switch( side )
391 {
392 case Base :: INSIDE:
393 return TwistUtilityType::twistInSelf( gridPart.grid(), intersection );
394
395 case Base :: OUTSIDE:
396 return TwistUtilityType::twistInNeighbor( gridPart.grid(), intersection );
397
398 default:
399 DUNE_THROW( InvalidStateException, "ElementIntegrationPointList: side must either be INSIDE or OUTSIDE." );
400 }
401 }
402
403 private:
404 const typename Base :: Side side_;
405 const int twist_;
406 const MapperPairType &mapper_;
407 const PointVectorType &points_;
408 const IntersectionType &intersection_;
409 };
410
411
413 template< typename GridPart, int codim, class IntegrationTraits >
414 using CachingPointList = CachingQuadratureImpl< GridPart, codim, IntegrationTraits, false>;
415
417 template< typename GridPart, int codim, template <class, int> class QuadratureTraits = DefaultQuadratureTraits >
418 using CachingQuadrature = CachingQuadratureImpl< GridPart, codim, ElementQuadratureTraits< GridPart, codim, QuadratureTraits >, true>;
419
420 template<class GridPart, class Entity>
421 static inline auto cachingQuadrature(const GridPart& gridPart, const Entity& entity, unsigned quadOrder)
422 {
424 return Quadrature(entity, quadOrder);
425 }
426
427 } //namespace Fem
428
429} //namespace Dune
430
431#if __GNUC__ >= 13
432#pragma GCC diagnostic pop
433#endif
434
435#endif // #ifndef DUNE_FEM_CACHINGQUADRATURE_HH
Traits::IntersectionIteratorType IntersectionIteratorType
type of intersection iterator
Definition: adaptiveleafgridpart.hh:92
interface a cachable quadrature has to implement
Definition: cachingquadrature.hh:28
size_t interpolationPoint(const size_t quadraturePoint) const
map quadrature points to interpolation points
Definition: cachingquadrature.hh:63
bool isInterpolationQuadrature(const size_t numShapeFunctions) const
check if quadrature is interpolation quadrature
Definition: cachingquadrature.hh:75
static constexpr bool twisted()
returns true if cachingPoint is not the identity mapping
Definition: cachingquadrature.hh:37
size_t cachingPoint(const size_t quadraturePoint) const
map quadrature points to caching points
Definition: cachingquadrature.hh:52
int twistId() const
returns the twistId, i.e. [0,...,7]
Definition: cachingquadrature.hh:40
size_t cachingPoint(const size_t quadraturePoint) const
map quadrature points to caching points
Definition: cachingquadrature.hh:183
auto weight(std::size_t i) const
obtain weight of i-th integration point (if quadrature, else 1.0)
Definition: cachingquadrature.hh:177
Base::CoordinateType CoordinateType
The type of the coordinates in the codim-0 reference element.
Definition: cachingquadrature.hh:124
size_t interpolationPoint(const size_t quadraturePoint) const
map quadrature points to interpolation points
Definition: cachingquadrature.hh:189
QuadraturePointWrapper< This > QuadraturePointWrapperType
the type of the quadrature point
Definition: cachingquadrature.hh:127
const CoordinateType & point(const size_t i) const
obtain coordinates of i-th integration point
Definition: cachingquadrature.hh:171
CachingQuadratureImpl(const EntityType &entity, const QuadratureKeyType &quadKey)
Definition: cachingquadrature.hh:147
bool isInterpolationQuadrature(const size_t numShapeFunctions) const
check if quadrature is interpolation quadrature
Definition: cachingquadrature.hh:195
CachingQuadratureImpl(const GeometryType &geometry, const QuadratureKeyType &quadKey)
Definition: cachingquadrature.hh:156
QuadraturePointIterator< This > IteratorType
type of iterator
Definition: cachingquadrature.hh:129
static constexpr bool twisted()
returns true if cachingPoint is not the identity mapping
Definition: cachingquadrature.hh:321
size_t interpolationPoint(const size_t quadraturePoint) const
map quadrature points to interpolation points
Definition: cachingquadrature.hh:334
GridPartType::IntersectionIteratorType IntersectionIteratorType
Type of the intersection iterator.
Definition: cachingquadrature.hh:226
const CoordinateType & point(const size_t i) const
obtain coordinates of i-th integration point
Definition: cachingquadrature.hh:304
bool isInterpolationQuadrature(const size_t numShapeFunctions) const
check if quadrature is interpolation quadrature
Definition: cachingquadrature.hh:341
size_t cachingPoint(const size_t quadraturePoint) const
map quadrature points to caching points
Definition: cachingquadrature.hh:327
int twistId() const
returns the twistId, i.e. [0,...,7]
Definition: cachingquadrature.hh:324
GridPartImp GridPartType
type of the grid partition
Definition: cachingquadrature.hh:216
ElementQuadratureImpl< GridPartType, codimension, IntegrationTraits, isQuadrature > NonConformingQuadratureType
type of quadrature used for non-conforming intersections
Definition: cachingquadrature.hh:235
CachingQuadratureImpl(const GridPartType &gridPart, const IntersectionType &intersection, const QuadratureKeyType &quadKey, const typename Base ::Side side)
constructor
Definition: cachingquadrature.hh:279
auto weight(std::size_t i) const
obtain weight of i-th integration point (if quadrature, else 1.0)
Definition: cachingquadrature.hh:310
QuadraturePointIterator< This > IteratorType
type of iterator
Definition: cachingquadrature.hh:231
Base::CoordinateType CoordinateType
Type of coordinates in codim-0 reference element.
Definition: cachingquadrature.hh:223
quadrature class supporting base function caching
Definition: cachingquadrature.hh:106
ElementPointListBase.
Definition: elementpointlistbase.hh:193
GridPartType::ctype RealType
coordinate type
Definition: elementpointlistbase.hh:207
iterator over quadrature points
Definition: quadrature.hh:103
wrapper for a (Quadrature,int) pair
Definition: quadrature.hh:42
Unique label for each type of entities that can occur in DUNE grids.
Definition: type.hh:114
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:375
Default exception for dummy implementations.
Definition: exceptions.hh:357
actual interface class for quadratures
#define DUNE_THROW(E,...)
Definition: exceptions.hh:314
Some useful basic math stuff.
Dune namespace.
Definition: alignedallocator.hh:13
Utility to get twist from IntersectionIterator, if provided by grid (i.e. AlbertaGrid,...
Definition: twistutility.hh:107
selects Obj::pointSetId if available, otherwise defaultValue (default is -1)
Definition: utility.hh:174
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Apr 23, 22:35, 2025)