1 #ifndef DUNE_FEM_FUNCTION_LOCALFUNCTION_CONST_HH
2 #define DUNE_FEM_FUNCTION_LOCALFUNCTION_CONST_HH
8 #include <dune/common/dynvector.hh>
24 struct DiscreteFunctionTraits;
26 class HasLocalFunction;
27 class IsDiscreteFunction;
28 struct BindableFunction;
33 template <
class BasisFunctionSet,
class LocalDofVector >
86 using BaseType::operator +=;
87 using BaseType::operator -=;
108 template<
class DiscreteFunction >
111 typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >::DiscreteFunctionSpaceType::BasisFunctionSetType,
112 Dune::DynamicVector< typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >::DofType,
113 typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >::LocalDofVectorAllocatorType
114 :: template rebind< typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > > ::DofType > ::other > >
118 Dune::DynamicVector< typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >
::DofType,
120 :: template rebind< typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >
::DofType >::other > >
217 template<
class Po
int >
233 template<
class Po
int >
249 template<
class Po
int >
269 intersection.inside(): intersection.outside() );
287 template<
class GF,
class =
void >
291 struct ConstLocalFunction< GF, std::enable_if_t< std::is_base_of< Fem::HasLocalFunction, GF >::value && std::is_base_of< Fem::IsDiscreteFunction, GF >::value > >
297 struct ConstLocalFunction< GF, std::enable_if_t< std::is_base_of< Fem::HasLocalFunction, GF >::value && !std::is_base_of< Fem::IsDiscreteFunction, GF >::value && std::is_class< typename GF::LocalFunctionType >::value > >
300 :
public GF::LocalFunctionType
302 typedef GF GridFunctionType;
303 typedef typename GridFunctionType::LocalFunctionType::EntityType EntityType;
305 typedef typename GF::LocalFunctionType::DomainType DomainType;
306 typedef typename GF::LocalFunctionType::RangeType RangeType;
307 typedef typename GF::LocalFunctionType::JacobianRangeType JacobianRangeType;
308 typedef typename GF::LocalFunctionType::HessianRangeType HessianRangeType;
310 explicit Type (
const GridFunctionType &gridFunction )
311 : GridFunctionType::LocalFunctionType( gridFunction ),
312 gridFunction_( gridFunction )
314 explicit Type (
const EntityType &entity,
const GridFunctionType &gridFunction )
315 : GridFunctionType::LocalFunctionType( gridFunction ),
316 gridFunction_( gridFunction )
319 using GF::LocalFunctionType::evaluate;
320 using GF::LocalFunctionType::jacobian;
321 using GF::LocalFunctionType::hessian;
322 using GF::LocalFunctionType::init;
323 using GF::LocalFunctionType::entity;
326 template<
class Po
int >
327 RangeType evaluate (
const Point &p )
const
335 template<
class Po
int >
336 JacobianRangeType jacobian (
const Point &p )
const
338 JacobianRangeType jac;
344 template<
class Po
int >
345 HessianRangeType hessian (
const Point &p )
const
352 void bind (
const EntityType &entity ) { init( entity ); }
354 template <
class IntersectionType>
358 intersection.inside(): intersection.outside() );
361 const GridFunctionType &gridFunction ()
const {
return gridFunction_; }
364 const GridFunctionType &gridFunction_;
369 struct ConstLocalFunction< GF, std::enable_if_t< std::is_base_of< Fem::BindableFunction, std::decay_t<GF> >::value && !std::is_base_of< Fem::IsDiscreteFunction, std::decay_t<GF> >::value > >
373 typedef GF GridFunctionType;
374 typedef std::decay_t<GF> GridFunctionDecayType;
375 typedef typename GridFunctionDecayType::GridPartType GridPartType;
376 typedef typename GridFunctionDecayType::EntityType EntityType;
377 typedef typename GridFunctionDecayType::RangeFieldType RangeFieldType;
378 typedef typename GridFunctionDecayType::DomainType DomainType;
379 typedef typename GridFunctionDecayType::RangeType RangeType;
380 typedef typename GridFunctionDecayType::JacobianRangeType JacobianRangeType;
381 typedef typename GridFunctionDecayType::HessianRangeType HessianRangeType;
382 typedef typename GridFunctionDecayType::FunctionSpaceType FunctionSpaceType;
384 template<class Arg, std::enable_if_t<std::is_constructible<GF, Arg>::value,
int> = 0>
385 explicit Type ( Arg&& gridFunction )
386 : gridFunction_( std::forward<Arg>(gridFunction) )
388 template<class Arg, std::enable_if_t<std::is_constructible<GF, Arg>::value,
int> = 0>
389 explicit Type (
const EntityType &entity, Arg&& gridFunction )
390 : gridFunction_( std::forward<Arg>(gridFunction) )
393 template <
class Po
int>
394 void evaluate(
const Point &x, RangeType &ret)
const
396 gridFunction().evaluate(x,ret);
398 template <
class Po
int>
399 void jacobian(
const Point &x, JacobianRangeType &ret)
const
401 gridFunction().jacobian(x,ret);
403 template <
class Po
int>
404 void hessian(
const Point &x, HessianRangeType &ret)
const
406 gridFunction().hessian(x,ret);
408 unsigned int order()
const {
return gridFunction().order(); }
411 template<
class Po
int >
412 RangeType evaluate (
const Point &p )
const
420 template<
class Po
int >
421 JacobianRangeType jacobian (
const Point &p )
const
423 JacobianRangeType jac;
429 template<
class Po
int >
430 HessianRangeType hessian (
const Point &p )
const
437 template<
class Quadrature,
class ... Vectors >
438 void evaluateQuadrature (
const Quadrature &quad, Vectors & ... values )
const
440 static_assert(
sizeof...( Vectors ) > 0,
"evaluateQuadrature needs to be called with at least one vector." );
441 evaluateFullQuadrature( PriorityTag<42>(), quad, values... );
443 template<
class Quadrature,
class Jacobians >
444 void jacobianQuadrature (
const Quadrature &quadrature, Jacobians &jacobians )
const
445 { jacobianQuadrature(quadrature,jacobians, PriorityTag<42>() ); }
446 template<
class Quadrature,
class Hessians >
447 void hessianQuadrature (
const Quadrature &quadrature, Hessians &hessians )
const
448 { hessianQuadrature(quadrature,hessians, PriorityTag<42>() ); }
450 void bind (
const EntityType &entity ) { gridFunction_.bind( entity ); }
451 void unbind () { gridFunction_.unbind(); }
452 template <
class IntersectionType>
456 const EntityType& entity()
const
458 return gridFunction_.entity();
461 const GridFunctionDecayType &gridFunction ()
const {
return gridFunction_; }
464 template<
class Quadrature,
class ... Vectors,
class GF_=GridFunctionDecayType >
465 auto evaluateFullQuadrature ( PriorityTag<1>,
const Quadrature &quad, Vectors & ... values )
const
466 -> std::enable_if_t< std::is_void< decltype( std::declval< const GF_& >().evaluateQuadrature(quad,values...))>::value >
467 { gridFunction().evaluateQuadrature(quad,values...); }
468 template<
class Quadrature,
class ... Vectors >
469 void evaluateFullQuadrature ( PriorityTag<0>,
const Quadrature &quad, Vectors & ... values )
const
470 { std::ignore = std::make_tuple( ( evaluateSingleQuadrature( quad, values ), 1 ) ... ); }
472 template<
class Quadrature,
class Jacobians,
class GF_=Gr
idFunctionDecayType>
473 auto jacobianQuadrature (
const Quadrature &quadrature, Jacobians &jacobians, PriorityTag<1> )
const
474 -> std::enable_if_t< std::is_void< decltype( std::declval< const GF_& >().jacobianQuadrature(quadrature,jacobians))>::value >
475 { gridFunction().jacobianQuadrature(quadrature,jacobians); }
476 template<
class Quadrature,
class Jacobians >
477 void jacobianQuadrature (
const Quadrature &quadrature, Jacobians &jacobians, PriorityTag<0> )
const
479 for(
const auto qp : quadrature )
480 jacobians[ qp.index() ] = jacobian( qp );
483 template<
class Quadrature,
class Hessians,
class GF_=Gr
idFunctionDecayType >
484 auto hessianQuadrature (
const Quadrature &quadrature, Hessians &hessians, PriorityTag<1> )
const
485 -> std::enable_if_t< std::is_void< decltype( std::declval< const GF_& >().hessianQuadrature(quadrature,hessians))>::value >
486 { gridFunction().hessianQuadrature(quadrature,hessians); }
487 template<
class Quadrature,
class Hessians >
488 void hessianQuadrature (
const Quadrature &quadrature, Hessians &hessians, PriorityTag<0> )
const
490 for(
const auto qp : quadrature )
491 hessians[ qp.index() ] = hessian( qp );
494 template<
class Quadrature,
class Vector >
495 auto evaluateSingleQuadrature (
const Quadrature &quad, Vector &v )
const
496 -> std::enable_if_t< std::is_same< std::decay_t< decltype(v[ 0 ]) >, RangeType >::value >
498 for(
const auto qp : quad )
499 v[ qp.index() ] = evaluate( qp );
501 template<
class Quadrature,
class Vector >
502 auto evaluateSingleQuadrature (
const Quadrature &quad, Vector &v )
const
503 -> std::enable_if_t< std::is_same< std::decay_t< decltype(v[ 0 ]) >, JacobianRangeType >::value >
504 { jacobianQuadrature(quad,v); }
505 template<
class Quadrature,
class Vector >
506 auto evaluateSingleQuadrature (
const Quadrature &quad, Vector &v )
const
507 -> std::enable_if_t< std::is_same< std::decay_t< decltype(v[ 0 ]) >, HessianRangeType >::value >
508 { hessianQuadrature(quad,v); }
510 GridFunctionType gridFunction_;
516 template<
class Gr
idFunction >
519 template<
class T,
class SFINAE =
void>
534 std::enable_if_t<(std::is_same<T, std::decay_t<T> >{}
535 && std::is_same<T, Fem::ConstLocalFunction<typename T::GridFunctionType> >{}
544 template<class F, std::enable_if_t<!IsConstLocalFunction<F>::value,
int> = 0>
551 template<class F, std::enable_if_t<IsConstLocalFunction<F>::value,
int> = 0>
554 return std::forward<F>(f);
557 template<
class F,
class Entity>
Definition: bindguard.hh:11
static GridFunctionView< GF > localFunction(const GF &gf)
Definition: gridfunctionview.hh:118
constexpr auto constLocalFunction(F &&f)
Definition: const.hh:545
void defaultIntersectionBind(GF &gf, const Intersection &intersection, IntersectionSide side)
Definition: intersectionside.hh:25
typename Impl::ConstLocalFunction< GridFunction >::Type ConstLocalFunction
Definition: const.hh:517
IntersectionSide
Definition: intersectionside.hh:10
Definition: explicitfieldvector.hh:75
Traits class for a DiscreteFunction.
Definition: common/discretefunction.hh:61
BasicConstLocalFunction(const BasisFunctionSetType &basisFunctionSet, LocalDofVectorType &&localDofVector)
Definition: const.hh:69
BasicConstLocalFunction(const BasisFunctionSetType &basisFunctionSet, const LocalDofVectorType &localDofVector)
Definition: const.hh:63
BasicConstLocalFunction(const BaseType &other)
Definition: const.hh:73
BasicConstLocalFunction(ThisType &&other)
Definition: const.hh:76
BaseType::SizeType SizeType
type of SizeType
Definition: const.hh:54
const DofType & operator[](SizeType i) const
Definition: const.hh:78
BaseType ::LocalDofVectorType LocalDofVectorType
type of LocalDofVector
Definition: const.hh:51
const LocalDofVectorType & localDofVector() const
return const reference to local Dof Vector
Definition: localfunction.hh:415
BasicConstLocalFunction(const BasisFunctionSetType &basisFunctionSet)
Definition: const.hh:59
BaseType ::BasisFunctionSetType BasisFunctionSetType
type of BasisFunctionSet
Definition: const.hh:48
BasicConstLocalFunction(LocalDofVectorType &&localDofVector)
Definition: const.hh:67
BasicConstLocalFunction(const ThisType &other)
Definition: const.hh:75
BasicConstLocalFunction(const LocalDofVectorType &localDofVector)
Definition: const.hh:61
BaseType::DofType DofType
type of Dof
Definition: const.hh:42
BasicConstLocalFunction()
default ctor
Definition: const.hh:57
BaseType ::EntityType EntityType
type of Entity
Definition: const.hh:45
A constant local function carrying values for one entity.
Definition: const.hh:115
const GridFunctionType & gridFunction() const
Definition: const.hh:273
BaseType::HessianRangeType HessianRangeType
Definition: const.hh:139
BaseType::RangeType RangeType
Definition: const.hh:137
ConstLocalDiscreteFunction(ThisType &&other)
move constructor
Definition: const.hh:201
const DiscreteFunctionType & discreteFunction() const
Definition: const.hh:272
ConstLocalDiscreteFunction(const DiscreteFunctionType &df)
constructor creating a local function without binding it to an entity
Definition: const.hh:154
RangeType evaluate(const Point &p) const
evaluate the local function
Definition: const.hh:218
DiscreteFunctionSpaceType::FunctionSpaceType FunctionSpaceType
Definition: const.hh:127
const DiscreteFunctionType * discreteFunction_
Definition: const.hh:276
std::remove_const_t< DiscreteFunction > DiscreteFunctionType
Definition: const.hh:124
void init(const EntityType &entity)
interface for local functions :: init
Definition: const.hh:258
ConstLocalDiscreteFunction(const ThisType &other)
copy constructor
Definition: const.hh:195
BaseType::LocalDofVectorType LocalDofVectorType
Definition: const.hh:135
ConstLocalDiscreteFunction(const DiscreteFunctionType &df, const EntityType &entity)
constructor creating a local function and binding it to an entity
Definition: const.hh:181
const LocalDofVectorType & localDofVector() const
return const reference to local Dof Vector
Definition: localfunction.hh:415
DiscreteFunctionType GridFunctionType
Definition: const.hh:129
BaseType::DofType DofType
Definition: const.hh:131
DiscreteFunctionType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
Definition: const.hh:125
ConstLocalDiscreteFunction(const typename DiscreteFunctionType::LocalFunctionType &localFunction)
cast a MutableLocalFunction into this one !!! expensive !!!
Definition: const.hh:161
BaseType::BasisFunctionSetType BasisFunctionSetType
Definition: const.hh:134
DiscreteFunctionSpaceType::GridPartType GridPartType
Definition: const.hh:126
BaseType::JacobianRangeType JacobianRangeType
Definition: const.hh:138
void bind(const EntityType &entity)
Definition: const.hh:264
HessianRangeType hessian(const Point &p) const
evaluate Hessian of the local function
Definition: const.hh:250
ConstLocalDiscreteFunction(const EntityType &entity, const DiscreteFunctionType &df)
Definition: const.hh:187
void bind(const IntersectionType &intersection, IntersectionSide side)
Definition: const.hh:266
BaseType::DomainType DomainType
Definition: const.hh:136
BaseType::EntityType EntityType
Definition: const.hh:132
JacobianRangeType jacobian(const Point &p) const
evaluate Jacobian of the local function
Definition: const.hh:234
GridPartType::IntersectionType IntersectionType
Definition: const.hh:133
void unbind()
Definition: const.hh:265
interface for local functions
Definition: localfunction.hh:77
void evaluate(const PointType &x, RangeType &ret) const
evaluate the local function
Definition: localfunction.hh:311
void init(const EntityType &entity)
initialize the local function for an entity
Definition: localfunction.hh:437
FunctionSpaceType::DomainType DomainType
type of domain vectors, i.e., type of coordinates
Definition: localfunction.hh:105
const EntityType & entity() const
obtain the entity, this local function lives on
Definition: localfunction.hh:302
BasisFunctionSet BasisFunctionSetType
type of basis function set
Definition: localfunction.hh:83
void hessian(const PointType &x, HessianRangeType &ret) const
evaluate Hessian of the local function
Definition: localfunction.hh:339
LocalDofVectorType::value_type DofType
type of DoF use with the discrete function
Definition: localfunction.hh:89
FunctionSpaceType::RangeType RangeType
type of range vectors, i.e., type of function values
Definition: localfunction.hh:107
void axpy(const PointType &x, const RangeType &factor)
axpy operation for local function
Definition: localfunction.hh:233
const BasisFunctionSetType & basisFunctionSet() const
obtain the basis function set for this local function
Definition: localfunction.hh:296
const LocalDofVectorType & localDofVector() const
return const reference to local Dof Vector
Definition: localfunction.hh:415
void jacobian(const PointType &x, JacobianRangeType &ret) const
evaluate Jacobian of the local function
Definition: localfunction.hh:325
FunctionSpaceType::JacobianRangeType JacobianRangeType
type of the Jacobian, i.e., type of evaluated Jacobian matrix
Definition: localfunction.hh:109
LocalDofVectorType::size_type SizeType
type of index
Definition: localfunction.hh:92
void clear()
set all DoFs to zero
Definition: localfunction.hh:195
BasisFunctionSetType::EntityType EntityType
type of the entity, the local function lives on is given by the space
Definition: localfunction.hh:95
void assign(const LocalFunction< BasisFunctionSet, T > &other)
assign all DoFs of this local function
Definition: localfunction.hh:189
LocalDofVector LocalDofVectorType
type of local Dof Vector
Definition: localfunction.hh:86
SizeType size() const
obtain the number of local DoFs
Definition: localfunction.hh:360