1#ifndef DUNE_FEM_FUNCTION_LOCALFUNCTION_CONST_HH
2#define DUNE_FEM_FUNCTION_LOCALFUNCTION_CONST_HH
8#include <dune/common/dynvector.hh>
25 struct DiscreteFunctionTraits;
27 class HasLocalFunction;
28 class IsDiscreteFunction;
29 struct BindableFunction;
34 template <
class BasisFunctionSet,
class LocalDofVector >
87 using BaseType::operator +=;
88 using BaseType::operator -=;
109 template<
class DiscreteFunction >
112 typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >::DiscreteFunctionSpaceType::BasisFunctionSetType,
113 Dune::DynamicVector< typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >::DofType,
114 typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >::LocalDofVectorAllocatorType
115 :: template rebind< typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > > ::DofType > ::other > >
119 Dune::DynamicVector< typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >
::DofType,
121 :: template rebind< typename DiscreteFunctionTraits< std::remove_const_t< DiscreteFunction > >
::DofType >::other > >
235 template<
class Po
int >
251 template<
class Po
int >
267 template<
class Po
int >
282 std::cout <<
"wrong thread number\n";
297 std::cout <<
"wrong thread number\n";
306 intersection.inside(): intersection.outside() );
327 template<
class GF,
class =
void >
331 struct ConstLocalFunction< GF,
std::enable_if_t< std::is_base_of< Fem::HasLocalFunction, GF >::value && std::is_base_of< Fem::IsDiscreteFunction, GF >::value > >
337 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 > >
340 :
public GF::LocalFunctionType
342 typedef GF GridFunctionType;
343 typedef typename GridFunctionType::LocalFunctionType::EntityType EntityType;
345 typedef typename GF::LocalFunctionType::DomainType DomainType;
346 typedef typename GF::LocalFunctionType::RangeType RangeType;
347 typedef typename GF::LocalFunctionType::JacobianRangeType JacobianRangeType;
348 typedef typename GF::LocalFunctionType::HessianRangeType HessianRangeType;
350 explicit Type (
const GridFunctionType &gridFunction )
351 : GridFunctionType::LocalFunctionType( gridFunction ),
352 gridFunction_( gridFunction ) {}
353 explicit Type (
const EntityType &entity,
const GridFunctionType &gridFunction )
354 : GridFunctionType::LocalFunctionType( gridFunction ),
355 gridFunction_( gridFunction )
358 using GF::LocalFunctionType::evaluate;
359 using GF::LocalFunctionType::jacobian;
360 using GF::LocalFunctionType::hessian;
361 using GF::LocalFunctionType::init;
362 using GF::LocalFunctionType::entity;
365 template<
class Po
int >
366 RangeType evaluate (
const Point &p )
const
374 template<
class Po
int >
375 JacobianRangeType jacobian (
const Point &p )
const
377 JacobianRangeType jac;
383 template<
class Po
int >
384 HessianRangeType hessian (
const Point &p )
const
391 void bind (
const EntityType &entity ) { init( entity ); }
393 template <
class IntersectionType>
394 void bind(
const IntersectionType &intersection, IntersectionSide side)
396 bind( side==IntersectionSide::in?
397 intersection.inside(): intersection.outside() );
400 const GridFunctionType &gridFunction ()
const {
return gridFunction_; }
403 const GridFunctionType &gridFunction_;
408 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 > >
410 static_assert( !std::is_reference<GF>::value );
413 typedef GF GridFunctionType;
414 typedef std::decay_t<GF> GridFunctionDecayType;
415 typedef typename GridFunctionDecayType::GridPartType GridPartType;
416 typedef typename GridFunctionDecayType::EntityType EntityType;
417 typedef typename GridFunctionDecayType::RangeFieldType RangeFieldType;
418 typedef typename GridFunctionDecayType::DomainType DomainType;
419 typedef typename GridFunctionDecayType::RangeType RangeType;
420 typedef typename GridFunctionDecayType::JacobianRangeType JacobianRangeType;
421 typedef typename GridFunctionDecayType::HessianRangeType HessianRangeType;
422 typedef typename GridFunctionDecayType::FunctionSpaceType FunctionSpaceType;
424 template<class Arg, std::enable_if_t<std::is_constructible<GF, Arg>::value,
int> = 0>
425 explicit Type ( Arg&& gridFunction )
426 : gridFunction_(
std::forward<Arg>(gridFunction) )
433 template<class Arg, std::enable_if_t<std::is_constructible<GF, Arg>::value,
int> = 0>
434 explicit Type (
const EntityType &entity, Arg&& gridFunction )
435 : gridFunction_(
std::forward<Arg>(gridFunction) )
443 template <
class Po
int>
444 void evaluate(
const Point &x, RangeType &ret)
const
446 gridFunction().evaluate(x,ret);
448 template <
class Po
int>
449 void jacobian(
const Point &x, JacobianRangeType &ret)
const
451 gridFunction().jacobian(x,ret);
453 template <
class Po
int>
454 void hessian(
const Point &x, HessianRangeType &ret)
const
456 gridFunction().hessian(x,ret);
458 unsigned int order()
const {
return gridFunction().order(); }
461 template<
class Po
int >
462 RangeType evaluate (
const Point &p )
const
470 template<
class Po
int >
471 JacobianRangeType jacobian (
const Point &p )
const
473 JacobianRangeType jac;
479 template<
class Po
int >
480 HessianRangeType hessian (
const Point &p )
const
487 template<
class Quadrature,
class ... Vectors >
488 void evaluateQuadrature (
const Quadrature &quad, Vectors & ... values )
const
490 static_assert(
sizeof...( Vectors ) > 0,
"evaluateQuadrature needs to be called with at least one vector." );
491 evaluateFullQuadrature( PriorityTag<42>(), quad, values... );
493 template<
class Quadrature,
class Jacobians >
494 void jacobianQuadrature (
const Quadrature &quadrature, Jacobians &jacobians )
const
495 { jacobianQuadrature(quadrature,jacobians, PriorityTag<42>() ); }
496 template<
class Quadrature,
class Hessians >
497 void hessianQuadrature (
const Quadrature &quadrature, Hessians &hessians )
const
498 { hessianQuadrature(quadrature,hessians, PriorityTag<42>() ); }
500 void bind (
const EntityType &entity )
503 if (thread_ == -1) thread_ = MPIManager::thread();
504 if (thread_ != MPIManager::thread())
506 std::cout <<
"wrong thread number\n";
511 gridFunction_.bind( entity );
516 if (thread_ != MPIManager::thread())
518 std::cout <<
"wrong thread number\n";
523 gridFunction_.unbind();
525 template <
class IntersectionType>
526 void bind(
const IntersectionType &intersection, IntersectionSide side)
529 if (thread_ == -1) thread_ = MPIManager::thread();
530 if (thread_ != MPIManager::thread())
532 std::cout <<
"wrong thread number\n";
540 const EntityType& entity()
const
542 return gridFunction_.entity();
545 const GridFunctionDecayType &gridFunction ()
const {
return gridFunction_; }
548 template<
class Quadrature,
class ... Vectors,
class GF_=GridFunctionDecayType >
549 auto evaluateFullQuadrature ( PriorityTag<1>,
const Quadrature &quad, Vectors & ... values )
const
550 -> std::enable_if_t< std::is_void< decltype( std::declval< const GF_& >().evaluateQuadrature(quad,values...))>::value >
551 { gridFunction().evaluateQuadrature(quad,values...); }
552 template<
class Quadrature,
class ... Vectors >
553 void evaluateFullQuadrature ( PriorityTag<0>,
const Quadrature &quad, Vectors & ... values )
const
554 { std::ignore = std::make_tuple( ( evaluateSingleQuadrature( quad, values ), 1 ) ... ); }
556 template<
class Quadrature,
class Jacobians,
class GF_=Gr
idFunctionDecayType>
557 auto jacobianQuadrature (
const Quadrature &quadrature, Jacobians &jacobians, PriorityTag<1> )
const
558 -> std::enable_if_t< std::is_void< decltype( std::declval< const GF_& >().jacobianQuadrature(quadrature,jacobians))>::value >
559 { gridFunction().jacobianQuadrature(quadrature,jacobians); }
560 template<
class Quadrature,
class Jacobians >
561 void jacobianQuadrature (
const Quadrature &quadrature, Jacobians &jacobians, PriorityTag<0> )
const
563 for(
const auto qp : quadrature )
564 jacobians[ qp.index() ] = jacobian( qp );
567 template<
class Quadrature,
class Hessians,
class GF_=Gr
idFunctionDecayType >
568 auto hessianQuadrature (
const Quadrature &quadrature, Hessians &hessians, PriorityTag<1> )
const
569 -> std::enable_if_t< std::is_void< decltype( std::declval< const GF_& >().hessianQuadrature(quadrature,hessians))>::value >
570 { gridFunction().hessianQuadrature(quadrature,hessians); }
571 template<
class Quadrature,
class Hessians >
572 void hessianQuadrature (
const Quadrature &quadrature, Hessians &hessians, PriorityTag<0> )
const
574 for(
const auto qp : quadrature )
575 hessians[ qp.index() ] = hessian( qp );
578 template<
class Quadrature,
class Vector >
579 auto evaluateSingleQuadrature (
const Quadrature &quad, Vector &v )
const
580 -> std::enable_if_t< std::is_same< std::decay_t<
decltype(v[ 0 ]) >, RangeType >::value >
582 for(
const auto qp : quad )
583 v[ qp.index() ] = evaluate( qp );
585 template<
class Quadrature,
class Vector >
586 auto evaluateSingleQuadrature (
const Quadrature &quad, Vector &v )
const
587 -> std::enable_if_t< std::is_same< std::decay_t<
decltype(v[ 0 ]) >, JacobianRangeType >::value >
588 { jacobianQuadrature(quad,v); }
589 template<
class Quadrature,
class Vector >
590 auto evaluateSingleQuadrature (
const Quadrature &quad, Vector &v )
const
591 -> std::enable_if_t< std::is_same< std::decay_t<
decltype(v[ 0 ]) >, HessianRangeType >::value >
592 { hessianQuadrature(quad,v); }
594 GridFunctionType gridFunction_;
603 template<
class Gr
idFunction >
606 template<
class T,
class SFINAE =
void>
621 std::enable_if_t<(std::is_same<T, std::decay_t<T> >{}
622 && std::is_same<T, Fem::ConstLocalFunction<typename T::GridFunctionType> >{}
631 template<class F, std::enable_if_t<!IsConstLocalFunction<F>::value,
int> = 0>
638 template<class F, std::enable_if_t<IsConstLocalFunction<F>::value,
int> = 0>
641 return std::forward<F>(f);
644 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:632
void defaultIntersectionBind(GF &gf, const Intersection &intersection, IntersectionSide side)
Definition: intersectionside.hh:25
typename Impl::ConstLocalFunction< GridFunction >::Type ConstLocalFunction
Definition: const.hh:604
IntersectionSide
Definition: intersectionside.hh:10
Definition: explicitfieldvector.hh:75
Traits class for a DiscreteFunction.
Definition: common/discretefunction.hh:61
const LocalDofVectorType & localDofVector() const
return const reference to local Dof Vector
Definition: localfunction.hh:415
BasicConstLocalFunction(const BasisFunctionSetType &basisFunctionSet, LocalDofVectorType &&localDofVector)
Definition: const.hh:70
BaseType::BasisFunctionSetType BasisFunctionSetType
type of BasisFunctionSet
Definition: const.hh:49
BasicConstLocalFunction(const BasisFunctionSetType &basisFunctionSet, const LocalDofVectorType &localDofVector)
Definition: const.hh:64
BasicConstLocalFunction(const BaseType &other)
Definition: const.hh:74
BasicConstLocalFunction(ThisType &&other)
Definition: const.hh:77
BaseType::SizeType SizeType
type of SizeType
Definition: const.hh:55
const DofType & operator[](SizeType i) const
Definition: const.hh:79
BaseType::EntityType EntityType
type of Entity
Definition: const.hh:46
BasicConstLocalFunction(const BasisFunctionSetType &basisFunctionSet)
Definition: const.hh:60
BaseType::LocalDofVectorType LocalDofVectorType
type of LocalDofVector
Definition: const.hh:52
BasicConstLocalFunction(LocalDofVectorType &&localDofVector)
Definition: const.hh:68
BasicConstLocalFunction(const ThisType &other)
Definition: const.hh:76
BasicConstLocalFunction(const LocalDofVectorType &localDofVector)
Definition: const.hh:62
BaseType::DofType DofType
type of Dof
Definition: const.hh:43
BasicConstLocalFunction()
default ctor
Definition: const.hh:58
A constant local function carrying values for one entity.
Definition: const.hh:116
const LocalDofVectorType & localDofVector() const
return const reference to local Dof Vector
Definition: localfunction.hh:415
BaseType::HessianRangeType HessianRangeType
Definition: const.hh:140
BaseType::RangeType RangeType
Definition: const.hh:138
const DiscreteFunctionType & discreteFunction() const
Definition: const.hh:309
ConstLocalDiscreteFunction(ThisType &&other)
move constructor
Definition: const.hh:216
ConstLocalDiscreteFunction(const DiscreteFunctionType &df)
constructor creating a local function without binding it to an entity
Definition: const.hh:155
RangeType evaluate(const Point &p) const
evaluate the local function
Definition: const.hh:236
DiscreteFunctionSpaceType::FunctionSpaceType FunctionSpaceType
Definition: const.hh:128
const DiscreteFunctionType * discreteFunction_
Definition: const.hh:313
std::remove_const_t< DiscreteFunction > DiscreteFunctionType
Definition: const.hh:125
void init(const EntityType &entity)
interface for local functions :: init
Definition: const.hh:276
ConstLocalDiscreteFunction(const ThisType &other)
copy constructor
Definition: const.hh:207
BaseType::LocalDofVectorType LocalDofVectorType
Definition: const.hh:136
ConstLocalDiscreteFunction(const DiscreteFunctionType &df, const EntityType &entity)
constructor creating a local function and binding it to an entity
Definition: const.hh:187
DiscreteFunctionType GridFunctionType
Definition: const.hh:130
const GridFunctionType & gridFunction() const
Definition: const.hh:310
BaseType::DofType DofType
Definition: const.hh:132
DiscreteFunctionType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
Definition: const.hh:126
ConstLocalDiscreteFunction(const typename DiscreteFunctionType::LocalFunctionType &localFunction)
cast a MutableLocalFunction into this one !!! expensive !!!
Definition: const.hh:164
BaseType::BasisFunctionSetType BasisFunctionSetType
Definition: const.hh:135
DiscreteFunctionSpaceType::GridPartType GridPartType
Definition: const.hh:127
BaseType::JacobianRangeType JacobianRangeType
Definition: const.hh:139
void bind(const EntityType &entity)
Definition: const.hh:291
HessianRangeType hessian(const Point &p) const
evaluate Hessian of the local function
Definition: const.hh:268
ConstLocalDiscreteFunction(const EntityType &entity, const DiscreteFunctionType &df)
Definition: const.hh:196
void bind(const IntersectionType &intersection, IntersectionSide side)
Definition: const.hh:303
BaseType::DomainType DomainType
Definition: const.hh:137
BaseType::EntityType EntityType
Definition: const.hh:133
JacobianRangeType jacobian(const Point &p) const
evaluate Jacobian of the local function
Definition: const.hh:252
GridPartType::IntersectionType IntersectionType
Definition: const.hh:134
void unbind()
Definition: const.hh:292
interface for local functions
Definition: localfunction.hh:77
const LocalDofVectorType & localDofVector() const
return const reference to local Dof Vector
Definition: localfunction.hh:415
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
void hessian(const PointType &x, HessianRangeType &ret) const
evaluate Hessian of the local function
Definition: localfunction.hh:339
const EntityType & entity() const
obtain the entity, this local function lives on
Definition: localfunction.hh:302
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
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
void assign(const LocalFunction< BasisFunctionSet, T > &other)
assign all DoFs of this local function
Definition: localfunction.hh:189
const BasisFunctionSetType & basisFunctionSet() const
obtain the basis function set for this local function
Definition: localfunction.hh:296
SizeType size() const
obtain the number of local DoFs
Definition: localfunction.hh:360
static int thread()
return thread number
Definition: mpimanager.hh:424
Interface class for basis function sets.
Definition: basisfunctionset/basisfunctionset.hh:31