dune-fem 2.12-git
Loading...
Searching...
No Matches
cachingquadrature.hh
Go to the documentation of this file.
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
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:
120 typedef typename Base::EntityType EntityType;
121 static const int codimension = Base::codimension;
122
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 {
151 }
152
155 template <class QuadratureKeyType>
156 CachingQuadratureImpl( const GeometryType &geometry, const QuadratureKeyType& quadKey )
157 : Base( geometry, quadKey )
158 {
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
224
226 typedef typename GridPartType::IntersectionIteratorType IntersectionIteratorType;
227 typedef typename IntersectionIteratorType::Intersection IntersectionType;
228
232
236
237
238 // for compatibility
239 typedef typename GridPartType::TwistUtilityType TwistUtilityType;
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 :
250 SelectQuadraturePointSetId< void > :: value; // default value
251
252 protected:
255
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
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 >
415
417 template< typename GridPart, int codim, template <class, int> class QuadratureTraits = DefaultQuadratureTraits >
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
int id()
reference operator[](size_type i)
#define DUNE_THROW(E,...)
IntegrationPointList< FieldImp, dim, QuadratureTraits, true > Quadrature
Definition quadrature.hh:443
static auto cachingQuadrature(const GridPart &gridPart, const Entity &entity, unsigned quadOrder)
Definition cachingquadrature.hh:421
detail::SelectPointSetId< Quadrature, -Dune::QuadratureType::size > SelectQuadraturePointSetId
Definition quadrature.hh:454
Definition cacheprovider.hh:157
Definition pointprovider.hh:25
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
CachingInterface()
Definition cachingquadrature.hh:31
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
quadrature class supporting base function caching
Definition cachingquadrature.hh:106
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
IteratorType begin() const noexcept
Definition cachingquadrature.hh:167
const CoordinateType & point(const size_t i) const
obtain coordinates of i-th integration point
Definition cachingquadrature.hh:171
IteratorType end() const noexcept
Definition cachingquadrature.hh:168
Base::GridPartType GridPartType
Definition cachingquadrature.hh:119
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
CachingTraits< RealType, dimension >::PointVectorType PointVectorType
Definition cachingquadrature.hh:254
IntersectionIteratorType::Intersection IntersectionType
Definition cachingquadrature.hh:227
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
Base getPointList(const IntersectionType &intersection, const QuadratureKeyType &key, const typename Base ::Side side)
Definition cachingquadrature.hh:367
GridPartType::IntersectionIteratorType IntersectionIteratorType
Type of the intersection iterator.
Definition cachingquadrature.hh:226
PointProvider< RealType, dimension, codimension > PointProviderType
Definition cachingquadrature.hh:257
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
IteratorType begin() const noexcept
Definition cachingquadrature.hh:296
QuadraturePointWrapper< This > QuadraturePointWrapperType
Definition cachingquadrature.hh:229
GridPartImp GridPartType
type of the grid partition
Definition cachingquadrature.hh:216
int getTwist(const GridPartType &gridPart, const IntersectionType &intersection, const typename Base ::Side side)
Definition cachingquadrature.hh:386
ElementQuadratureImpl< GridPartType, codimension, IntegrationTraits, isQuadrature > NonConformingQuadratureType
type of quadrature used for non-conforming intersections
Definition cachingquadrature.hh:235
IteratorType end() const noexcept
Definition cachingquadrature.hh:297
size_t localCachingPoint(const size_t i) const
Definition cachingquadrature.hh:351
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
IntersectionIteratorType IntersectionIterator
Definition cachingquadrature.hh:240
GridPartType::TwistUtilityType TwistUtilityType
Definition cachingquadrature.hh:239
const IntersectionType & intersection() const
Definition cachingquadrature.hh:315
CachingTraits< RealType, dimension >::MapperPairType MapperPairType
Definition cachingquadrature.hh:253
QuadraturePointIterator< This > IteratorType
type of iterator
Definition cachingquadrature.hh:231
CacheProvider< GridPartType, codimension > CacheProviderType
Definition cachingquadrature.hh:256
Base::CoordinateType CoordinateType
Type of coordinates in codim-0 reference element.
Definition cachingquadrature.hh:223
Definition defaultquadratures.hh:40
ElementPointListBase.
Definition elementpointlistbase.hh:193
IntegrationTraits::CoordinateType CoordinateType
Definition elementpointlistbase.hh:215
GridPartType::ctype RealType
coordinate type
Definition elementpointlistbase.hh:207
GridPartType::template Codim< 0 >::EntityType EntityType
type of entity
Definition elementpointlistbase.hh:43
GridPartImp GridPartType
type of the grid partition
Definition elementpointlistbase.hh:28
IntegrationTraits::CoordinateType CoordinateType
Definition elementpointlistbase.hh:48
Definition elementquadrature.hh:73
wrapper for a (Quadrature,int) pair
Definition quadrature.hh:42
iterator over quadrature points
Definition quadrature.hh:103
actual interface class for integration point lists
Definition quadrature.hh:158