1#ifndef DUNE_FEM_EVALUATECALLER_HH
2#define DUNE_FEM_EVALUATECALLER_HH
9#include <dune/common/exceptions.hh>
10#include <dune/common/fmatrix.hh>
25#ifdef DUNE_FEM_INCLUDE_AUTOGENERATEDCODE_FILENAME_SPEC
26#define CODEGEN_INCLUDEMAXNUMS
28#include DUNE_FEM_INCLUDE_AUTOGENERATEDCODE_FILENAME_SPEC
29#undef CODEGEN_INCLUDEMAXNUMS
37#ifndef MAX_NUMBER_OF_QUAD_POINTS
38#define MAX_NUMBER_OF_QUAD_POINTS 20
41#ifndef MAX_NUMBER_OF_BASE_FCT
42#define MAX_NUMBER_OF_BASE_FCT 20
45#ifndef MIN_NUMBER_OF_QUAD_POINTS
46#define MIN_NUMBER_OF_QUAD_POINTS 1
49#ifndef MIN_NUMBER_OF_BASE_FCT
50#define MIN_NUMBER_OF_BASE_FCT 1
55#ifdef DUNE_FEM_INCLUDE_AUTOGENERATEDCODE_FILENAME_SPEC
57#include DUNE_FEM_INCLUDE_AUTOGENERATEDCODE_FILENAME_SPEC
68 template <
class Traits,
73 template<
class QuadratureImp,
75 class LocalDofVectorImp,
76 class GeometryImp = EmptyGeometry >
85 template <
class Traits,
86 class BaseFunctionSet,
102 template <
class Traits>
171 template <
class BaseFunctionSet,
class Storage >
173 const Storage& dataCache,
176 const int nop = quad.nop();
177 static const int dimRange = BaseFunctionSet :: FunctionSpaceType:: dimRange;
178 const int numBaseFct = baseSet.size() / dimRange;
187 const size_t quadId = quad.id();
188 if( ! evaluators[ quadId ].first )
191 auto& item = evaluators[ quadId ];
194 if( quad.isInterpolationQuadrature( numBaseFct ) )
195 std::cout <<
"EvaluateCallerInterface::storage: Not creating implementation because of interpolation feature!" <<std::endl;
205 ! quad.isInterpolationQuadrature( numBaseFct ) )
209 :: create( dataCache , nop, numBaseFct ) );
217 return evaluators[ quadId ].second;
221 template <
class Traits,
235 typedef typename RangeVectorType :: value_type :: field_type
FieldType;
249 int getDim(
const DenseVector< K >& vec)
const
258 return getDim( mat[ 0 ] );
267 const int faces = quadPoints / quadNop;
269 for(
int f=0; f<faces; ++f )
275 rangeStorageTransposed.resize( numBaseFct * quadNop );
276 for(
int i=0; i<numBaseFct; ++i )
278 const int idx = i * quadNop;
279 for(
int j=0; j<quadNop; ++j )
281 int qp = f * quadNop + j ;
284 rangeStorageTransposed[ idx + j ] =
rangeStorage_[ qp*numBaseFct + i ][ 0 ];
297 const int faces = quadPoints / quadNop;
300 for(
int f=0; f<faces; ++f )
307 rangeStorageTransposed.resize( numBaseFct * quadNop * dim );
308 rangeStorageFlat.resize( numBaseFct * quadNop * dim );
309 for(
int i=0; i<numBaseFct; ++i )
311 const int idx = i * (quadNop * dim);
312 for(
int j=0; j<quadNop; ++j )
314 int qp = f * quadNop + j ;
315 for(
int d=0; d<dim; ++d )
317 rangeStorageFlat[ j*numBaseFct*dim + (i * dim) + d ] =
rangeStorage_[ qp*numBaseFct + i ][ 0 ][ d ];
318 rangeStorageTransposed[ idx + (j * dim) + d ] =
rangeStorage_[ qp*numBaseFct + i ][ 0 ][ d ];
326 template <
class Quadrature>
328 const std::vector< FieldType >&
340 if( rangeStorageTwisted.empty() )
346 const int faces = quadPoints / quadNop;
347 rangeStorageTwisted.resize( faces );
348 for(
int f=0; f<faces; ++f )
350 auto& rangeStorageFace = rangeStorageTwisted[ f ];
355 rangeStorageFace.resize( rangeStorageTransposed.size() );
356 for(
int i=0; i<numBaseFct; ++i )
358 const int idx = i * quadNop;
359 for(
int j=0; j<quadNop; ++j )
361 const int qp = quad.localCachingPoint( j );
362 for(
int d=0; d<dim; ++d )
364 rangeStorageFace[ idx + (j * dim) + d ] = rangeStorageTransposed[ idx + (qp * dim) + d ];
370 return rangeStorageTwisted[ quad.localFaceIndex() ];
385 std::is_same<
typename RangeVectorType::value_type,
386 Dune::FieldVector< double, 1 > > :: value > () );
428 return new ThisType( rangeStorage );
434 template <
class Traits,
463 std::cerr <<
"ERROR: EvaluateImplementation::axpyRanges not overloaded!" << std::endl;
472 std::cerr <<
"ERROR: EvaluateImplementation::axpyJacobians not overloaded!" << std::endl;
480 std::cerr <<
"ERROR: EvaluateImplementation::evaluateRanges not overloaded!" << std::endl;
489 std::cerr <<
"ERROR: EvaluateImplementation::evaluateJacobians not overloaded!" << std::endl;
496 std::cout <<
"Optimized EvaluateImplementation for < dimR="<<dimRange<<
", qp=" << quadNop <<
", bases=" << numBaseFct <<
" > not created, falling back to default!" << std::endl;
504 template <
class Traits,
511 static const int dimRange = BaseFunctionSetType :: FunctionSpaceType:: dimRange;
516 const size_t numbase )
518 if( numBaseFct == numbase )
525 const size_t quadnop,
const size_t numbase )
527 if( quadNop == quadnop )
534 template <
class Traits,
540 static const int dimRange = BaseFunctionSetType :: FunctionSpaceType:: dimRange;
546 const size_t numbase )
548 if( numBaseFct == numbase )
555 const size_t quadnop,
const size_t numbase )
557 if( quadNop == quadnop )
561 std::cerr <<
"ERROR: EvaluateCaller< "<< quadNop <<
", " << numBaseFct <<
" >::createObj: no working combination!" << std::endl;
567 template <
class Traits,
573 static const int dimRange = BaseFunctionSetType :: FunctionSpaceType:: dimRange;
579 const size_t numbase )
581 if( numBaseFct == numbase )
585 std::cerr <<
"ERROR: EvaluateCaller< "<< quadNop <<
", " << numBaseFct <<
" >::createObj: no working combination!" << std::endl;
591 const size_t quadnop,
const size_t numbase )
593 if( quadNop == quadnop )
602 template <
class Traits>
607 static const int dimRange = BaseFunctionSetType :: FunctionSpaceType:: dimRange;
614 const size_t numbase )
616 if( numBaseFct == numbase )
620 std::cerr <<
"ERROR: EvaluateCaller< "<< quadNop <<
", " << numBaseFct <<
" >::createObj: no working combination!" << std::endl;
626 const size_t quadnop,
const size_t numbase )
628 if( quadNop == quadnop )
632 std::cerr <<
"ERROR: EvaluateCaller< "<< quadNop <<
", " << numBaseFct <<
" >::create: no working combination!" << std::endl;
644#ifdef DUNE_FEM_INCLUDE_AUTOGENERATEDCODE_FILENAME_SPEC
645#define CODEGEN_INCLUDEEVALCALLERS
647#include DUNE_FEM_INCLUDE_AUTOGENERATEDCODE_FILENAME_SPEC
648#undef CODEGEN_INCLUDEEVALCALLERS
#define MIN_NUMBER_OF_QUAD_POINTS
Definition: evaluatecaller.hh:46
#define MIN_NUMBER_OF_BASE_FCT
Definition: evaluatecaller.hh:50
#define MAX_NUMBER_OF_BASE_FCT
Definition: evaluatecaller.hh:42
#define MAX_NUMBER_OF_QUAD_POINTS
Definition: evaluatecaller.hh:38
Definition: bindguard.hh:11
IteratorRange< typename DF::DofIteratorType > dofs(DF &df)
Iterates over all DOFs.
Definition: rangegenerators.hh:76
ThreadSafeValue realizes thread safety for a given variable by creating an instance of this variable ...
Definition: threadsafevalue.hh:18
DenseMatrix based on std::vector< std::vector< T > >
Definition: blockmatrix.hh:24
actual interface class for quadratures
Definition: quadrature.hh:405
Generic implementation of a Dune quadrature.
Definition: quadratureimp.hh:196
Definition: evaluatecaller.hh:508
static const int dimRange
Definition: evaluatecaller.hh:511
EvaluateCallerInterface< typename Traits ::BaseTraits > InterfaceType
Definition: evaluatecaller.hh:513
Traits::RangeVectorType RangeVectorType
Definition: evaluatecaller.hh:512
static InterfaceType * create(const RangeVectorType &rangeStorage, const size_t quadnop, const size_t numbase)
Definition: evaluatecaller.hh:524
static InterfaceType * createObj(const RangeVectorType &rangeStorage, const size_t numbase)
Definition: evaluatecaller.hh:515
Traits::BaseFunctionSetType BaseFunctionSetType
Definition: evaluatecaller.hh:510
Definition: evaluatecaller.hh:78
GeometryImp Geometry
Definition: evaluatecaller.hh:82
QuadratureImp QuadratureType
Definition: evaluatecaller.hh:79
LocalDofVectorImp LocalDofVectorType
Definition: evaluatecaller.hh:81
FactorImp FactorType
Definition: evaluatecaller.hh:80
Definition: evaluatecaller.hh:89
Traits::QuadratureType QuadratureType
Definition: evaluatecaller.hh:91
Traits::LocalDofVectorType LocalDofVectorType
Definition: evaluatecaller.hh:93
RangeVectorImp RangeVectorType
Definition: evaluatecaller.hh:97
Traits BaseTraits
Definition: evaluatecaller.hh:90
Traits::Geometry Geometry
Definition: evaluatecaller.hh:94
Traits::FactorType FactorType
Definition: evaluatecaller.hh:92
BaseFunctionSet BaseFunctionSetType
Definition: evaluatecaller.hh:96
Definition: evaluatecaller.hh:104
virtual void axpyJacobians(const QuadratureType &, const Geometry &, const FactorType &, LocalDofVectorType &) const =0
virtual ~EvaluateCallerInterface()
Definition: evaluatecaller.hh:148
virtual void evaluateJacobians(const QuadratureType &, const Geometry &, const LocalDofVectorType &, FactorType &) const =0
virtual void axpyRanges(const QuadratureType &, const FactorType &, LocalDofVectorType &) const =0
static const int minNumBaseFunctions
Definition: evaluatecaller.hh:112
static const int maxNumBaseFunctions
Definition: evaluatecaller.hh:111
static const int maxQuadNop
Definition: evaluatecaller.hh:114
virtual size_t storageSize() const =0
Traits::Geometry Geometry
Definition: evaluatecaller.hh:146
virtual void * storageAddress() const =0
static const int maxQuadratures
Definition: evaluatecaller.hh:118
static const StoragePointerType & storage(const BaseFunctionSet &baseSet, const Storage &dataCache, const QuadratureType &quad)
Definition: evaluatecaller.hh:172
Traits::QuadratureType QuadratureType
Definition: evaluatecaller.hh:143
Traits::FactorType FactorType
Definition: evaluatecaller.hh:144
virtual void evaluateRanges(const QuadratureType &quad, const LocalDofVectorType &dofs, FactorType &factors) const =0
std::pair< bool, StoragePointerType > StorageItemType
Definition: evaluatecaller.hh:108
static const int minQuadNop
Definition: evaluatecaller.hh:115
EvaluateCallerInterface()
Definition: evaluatecaller.hh:140
std::unique_ptr< ThisType > StoragePointerType
Definition: evaluatecaller.hh:107
Traits::LocalDofVectorType LocalDofVectorType
Definition: evaluatecaller.hh:145
Definition: evaluatecaller.hh:121
EvaluatorStorage()
Definition: evaluatecaller.hh:125
std::vector< StorageItemType > storage_
Definition: evaluatecaller.hh:123
StorageItemType & operator[](const int i)
Definition: evaluatecaller.hh:135
Definition: evaluatecaller.hh:227
Traits::QuadratureType QuadratureType
Definition: evaluatecaller.hh:230
EvaluateRealImplementation(const RangeVectorType &rangeStorage)
Definition: evaluatecaller.hh:381
virtual void axpyJacobians(const QuadratureType &quad, const Geometry &geometry, const FactorType &jacFactors, LocalDofVectorType &dofs) const
Definition: evaluatecaller.hh:408
Traits::Geometry Geometry
Definition: evaluatecaller.hh:233
Traits::FactorType FactorType
Definition: evaluatecaller.hh:231
Traits::BaseFunctionSetType BaseFunctionSetType
Definition: evaluatecaller.hh:229
EvaluateRealImplementation< Traits, dimRange, quadNop, numBaseFct > ThisType
Definition: evaluatecaller.hh:237
static InterfaceType * create(const RangeVectorType &rangeStorage)
Definition: evaluatecaller.hh:426
std::vector< std::vector< FieldType > > rangeStorageTransposed_
Definition: evaluatecaller.hh:244
const std::vector< FieldType > & getTwistedStorage(const Quadrature &quad) const
Definition: evaluatecaller.hh:329
virtual size_t storageSize() const
Definition: evaluatecaller.hh:390
virtual void axpyRanges(const QuadratureType &quad, const FactorType &rangeFactors, LocalDofVectorType &dofs) const
Definition: evaluatecaller.hh:392
std::vector< std::vector< std::vector< FieldType > > > rangeStorageTwisted_
Definition: evaluatecaller.hh:246
BaseType InterfaceType
Definition: evaluatecaller.hh:379
virtual void * storageAddress() const
Definition: evaluatecaller.hh:389
std::vector< std::vector< FieldType > > rangeStorageFlat_
Definition: evaluatecaller.hh:245
int getDim(const DenseVector< K > &vec) const
Definition: evaluatecaller.hh:249
Traits::LocalDofVectorType LocalDofVectorType
Definition: evaluatecaller.hh:232
RangeVectorType rangeStorage_
Definition: evaluatecaller.hh:242
virtual void evaluateJacobians(const QuadratureType &quad, const Geometry &geometry, const LocalDofVectorType &dofs, FactorType &jacFactors) const
Definition: evaluatecaller.hh:417
int getDim(const DenseMatrix< K > &mat) const
Definition: evaluatecaller.hh:255
Traits::RangeVectorType RangeVectorType
Definition: evaluatecaller.hh:234
virtual void evaluateRanges(const QuadratureType &quad, const LocalDofVectorType &dofs, FactorType &rangeFactors) const
Definition: evaluatecaller.hh:400
void initRangeStorageTransposed(const std::integral_constant< bool, false >)
Definition: evaluatecaller.hh:292
RangeVectorType::value_type::field_type FieldType
Definition: evaluatecaller.hh:235
EvaluateCallerInterface< typename Traits ::BaseTraits > BaseType
Definition: evaluatecaller.hh:238
void initRangeStorageTransposed(const std::integral_constant< bool, true >)
Definition: evaluatecaller.hh:262
Definition: evaluatecaller.hh:440
BaseType InterfaceType
Definition: evaluatecaller.hh:454
Traits::Geometry Geometry
Definition: evaluatecaller.hh:446
virtual void axpyJacobians(const QuadratureType &quad, const Geometry &geometry, const FactorType &jacFactors, LocalDofVectorType &dofs) const
Definition: evaluatecaller.hh:467
EvaluateCallerInterface< typename Traits ::BaseTraits > BaseType
Definition: evaluatecaller.hh:451
Traits::BaseFunctionSetType BaseFunctionSetType
Definition: evaluatecaller.hh:442
EvaluateImplementation(const RangeVectorType &rangeStorage)
Definition: evaluatecaller.hh:456
virtual void evaluateRanges(const QuadratureType &quad, const LocalDofVectorType &dofs, FactorType &rangeFactors) const
Definition: evaluatecaller.hh:476
Traits::QuadratureType QuadratureType
Definition: evaluatecaller.hh:443
virtual void axpyRanges(const QuadratureType &quad, const FactorType &rangeFactors, LocalDofVectorType &dofs) const
Definition: evaluatecaller.hh:459
EvaluateImplementation< Traits, dimRange, quadNop, numBaseFct > ThisType
Definition: evaluatecaller.hh:449
static InterfaceType * create(const RangeVectorType &)
Definition: evaluatecaller.hh:493
Traits::RangeVectorType RangeVectorType
Definition: evaluatecaller.hh:447
Traits::LocalDofVectorType LocalDofVectorType
Definition: evaluatecaller.hh:445
virtual void evaluateJacobians(const QuadratureType &quad, const Geometry &geometry, const LocalDofVectorType &dofs, FactorType &jacFactors) const
Definition: evaluatecaller.hh:484
Traits::FactorType FactorType
Definition: evaluatecaller.hh:444
EvaluateCallerInterface< typename Traits ::BaseTraits > InterfaceType
Definition: evaluatecaller.hh:543
static InterfaceType * createObj(const RangeVectorType &rangeStorage, const size_t numbase)
Definition: evaluatecaller.hh:545
Traits::RangeVectorType RangeVectorType
Definition: evaluatecaller.hh:542
static InterfaceType * create(const RangeVectorType &rangeStorage, const size_t quadnop, const size_t numbase)
Definition: evaluatecaller.hh:554
Traits::BaseFunctionSetType BaseFunctionSetType
Definition: evaluatecaller.hh:539
EvaluateCallerInterface< typename Traits ::BaseTraits > InterfaceType
Definition: evaluatecaller.hh:576
static InterfaceType * createObj(const RangeVectorType &rangeStorage, const size_t numbase)
Definition: evaluatecaller.hh:578
Traits::BaseFunctionSetType BaseFunctionSetType
Definition: evaluatecaller.hh:572
Traits::RangeVectorType RangeVectorType
Definition: evaluatecaller.hh:575
static InterfaceType * create(const RangeVectorType &rangeStorage, const size_t quadnop, const size_t numbase)
Definition: evaluatecaller.hh:590
static InterfaceType * create(const RangeVectorType &rangeStorage, const size_t quadnop, const size_t numbase)
Definition: evaluatecaller.hh:625
EvaluateCallerInterface< typename Traits ::BaseTraits > InterfaceType
Definition: evaluatecaller.hh:611
static InterfaceType * createObj(const RangeVectorType &rangeStorage, const size_t numbase)
Definition: evaluatecaller.hh:613
Traits::BaseFunctionSetType BaseFunctionSetType
Definition: evaluatecaller.hh:606
Traits::RangeVectorType RangeVectorType
Definition: evaluatecaller.hh:610
Definition: evaluatecallerdefaultimpl.hh:19
Definition: evaluatecallerdefaultimpl.hh:61
Definition: evaluatecallerdefaultimpl.hh:106
Definition: evaluatecallerdefaultimpl.hh:148