1#ifndef DUNE_FEM_GRIDFUNCTIONADAPTER_HH
2#define DUNE_FEM_GRIDFUNCTIONADAPTER_HH
7#include <dune/common/exceptions.hh>
38 template <
class FunctionImp,
class Gr
idPartImp>
39 class BasicGridFunctionAdapter;
42 template <
class FunctionImp,
class Gr
idPartImp>
49 typedef typename FunctionSpaceType::RangeType
RangeType;
50 typedef typename FunctionSpaceType::DomainType
DomainType;
56 typedef typename GridPartType :: GridType
GridType;
74 template<
class FunctionImp,
class Gr
idPartImp >
76 :
public Function< typename std::decay_t< FunctionImp >::FunctionSpaceType,
77 BasicGridFunctionAdapter< FunctionImp, GridPartImp > >,
84 static_assert( !(std::is_convertible< FunctionImp, HasLocalFunction >::value),
85 "FunctionType may not be a discrete function type." );
111 typedef typename DiscreteFunctionSpaceType::DomainType
DomainType ;
113 typedef typename DiscreteFunctionSpaceType::RangeType
RangeType ;
167 const std::string &
name ()
const
206 template<
class Function,
class Gr
idPart >
221 static const int dimDomain = GridPart::GridType::dimensionworld;
223 static const int dimRange = FunctionSpaceType::dimRange;
228 typedef typename FunctionSpaceType::RangeType
RangeType;
240 static const int dimLocal = LocalCoordinateType::dimension;
259 template<
class Po
intType >
262 const auto geometry = entity().geometry();
263 auto global = geometry.global(
coordinate( x ) );
264 function().evaluate( global, ret );
266 template<
class Po
intType >
275 template<
class Po
intType >
278 const auto geometry = entity().geometry();
279 auto global = geometry.global(
coordinate( x ) );
280 function().jacobian( global, ret );
282 if( dimLocal != dimDomain )
290 const auto gjt = geometry.jacobianTransposed(
coordinate( x ) );
291 const auto gjit = geometry.jacobianInverseTransposed(
coordinate( x ) );
293 FieldVector< RangeFieldType, dimLocal > tmp;
294 for(
auto i = 0; i < dimRange; ++i )
296 gjit.mtv( ret[ i ], tmp );
297 gjt.mtv( tmp, ret[ i ] );
303 template<
class Po
intType >
306 DUNE_THROW( NotImplemented,
"Method hessian() not implemented yet" );
310 template <
class QuadratureType,
class ... Vectors >
313 static_assert(
sizeof...( Vectors ) > 0,
"evaluateQuadrature needs to be called with at least one vector." );
314 std::ignore = std::make_tuple( ( evaluateQuadratureImp( quadrature, values ), 1 ) ... );
317 int order ()
const {
return order_; }
332 template <
class QuadratureType,
class VectorType >
334 -> std::enable_if_t< std::is_same< std::decay_t<
decltype(values[ 0 ] ) >,
RangeType >::value >
336 for(
auto qp : quadrature )
337 evaluate( qp, values[ qp.index() ] );
340 template <
class QuadratureType,
class VectorType >
342 -> std::enable_if_t< std::is_same< std::decay_t<
decltype(values[ 0 ] ) >,
JacobianRangeType >::value >
344 for(
auto qp : quadrature )
345 jacobian( qp, values[ qp.index() ] );
363 template<
class Function,
class Gr
idPart >
382 template<
class Function,
class Gr
idPart >
399 template<
class Function,
class Gr
idPart >
400 inline static GridFunctionAdapter< Function, GridPart >
417 template<
class Function,
class Gr
idPart >
418 inline static GridFunctionAdapter< Function, GridPart >
435 template<
class Function,
class Gr
idPart >
436 inline static GridFunctionAdapter< Function, GridPart >
454 template<
class Function,
class Gr
idPart >
455 inline static BasicGridFunctionAdapter< Function, GridPart >
471 template<
class Function,
class Gr
idPart >
472 inline static BasicGridFunctionAdapter< Function, GridPart >
482 template <
class FunctionImp,
class Gr
idPartType,
bool>
483 struct ConvertDFTypeHelper;
485 template <
class FunctionImp,
class Gr
idPartType>
486 struct ConvertDFTypeHelper<FunctionImp,GridPartType,true>
488 typedef ConvertDFTypeHelper<FunctionImp,GridPartType,true>
ThisType;
489 enum {compatible = std::is_convertible<GridPartType,typename FunctionImp::DiscreteFunctionSpaceType::GridPartType>::value};
491 typedef typename FunctionType::DiscreteFunctionSpaceType
DFSType;
492 ConvertDFTypeHelper(
const std::string& name,
const FunctionImp& func,
const GridPartType& gp) :
495 ConvertDFTypeHelper(
const ConvertDFTypeHelper& other) :
498 const FunctionType& function()
const
502 const DFSType& space()
const
504 return func_.space();
507 const FunctionImp& func_;
510 template <
class FunctionImp,
class Gr
idPartType>
511 struct ConvertDFTypeHelper<FunctionImp,GridPartType,false>
514 typedef ConvertDFTypeHelper<FunctionImp,GridPartType,false>
ThisType;
518 ConvertDFTypeHelper(
const std::string& name,
const FunctionImp& func,
const GridPartType& gp) :
521 ConvertDFTypeHelper(
const ConvertDFTypeHelper& other) :
524 const FunctionType& function()
const
528 const DFSType& space()
const
530 return BaseType::space();
535 template<
class FunctionImp,
class Gr
idPartImp >
537 :
public Function< typename FunctionImp::FunctionSpaceType,
538 ConvertToGridFunction< FunctionImp, GridPartImp > >,
543 static const bool hasLocalFunction = std::is_convertible< FunctionImp, HasLocalFunction >::value;
544 typedef ConvertDFTypeHelper< FunctionImp, GridPartImp, hasLocalFunction > Helper;
545 typedef typename Helper::FunctionType ConvertedType;
557 typedef typename DiscreteFunctionSpaceType::GridType
GridType;
564 typedef typename DiscreteFunctionSpaceType::DomainType
DomainType ;
566 typedef typename DiscreteFunctionSpaceType::RangeType
RangeType ;
578 const FunctionImp &function,
581 helper_(
name, function, gridPart )
585 : name_( other.name_ ),
586 helper_( other.helper_ )
592 helper_.function().evaluate(global,result);
598 return helper_.function().localFunction(entity);
604 return helper_.function().localFunction(entity);
608 const std::string &
name()
const
615 return helper_.space();
619 const std::string name_;
623 template<
class Function,
class Gr
idPart >
624 inline ConvertToGridFunction< Function, GridPart >
627 const GridPart &gridPart )
FunctionSpaceType::DomainFieldType DomainFieldType
domain field type (from function space)
Definition: gridfunctionadapter.hh:217
const std::string & name() const
obtain the name of the discrete function
Definition: gridfunctionadapter.hh:608
GridPartType::template Codim< 0 >::IteratorType IteratorType
type of iterator
Definition: gridfunctionadapter.hh:60
const LocalFunctionType localFunction(const EntityType &entity) const
Definition: gridfunctionadapter.hh:161
void jacobian(const DomainType &global, JacobianRangeType &result) const
evaluate function on local coordinate local
Definition: gridfunctionadapter.hh:149
GridPartImp GridPartType
Definition: gridfunctionadapter.hh:549
FunctionSpaceType::RangeType RangeType
Definition: gridfunctionadapter.hh:49
const std::string name_
Definition: gridfunctionadapter.hh:198
FunctionSpaceType::DomainFieldType DomainFieldType
Definition: gridfunctionadapter.hh:48
Traits::IntersectionType IntersectionType
Definition: gridfunctionadapter.hh:119
ConvertedType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
type of discrete function space
Definition: gridfunctionadapter.hh:552
Traits::IntersectionType IntersectionType
Definition: gridfunctionadapter.hh:236
FunctionSpaceType::RangeFieldType RangeFieldType
range field type (from function space)
Definition: gridfunctionadapter.hh:219
GridPartType::template Codim< 0 >::EntityType EntityType
Definition: gridfunctionadapter.hh:57
BasicGridFunctionAdapter(const ThisType &other)
Definition: gridfunctionadapter.hh:136
EntityType::Geometry::LocalCoordinate LocalCoordinateType
local coordinate type
Definition: gridfunctionadapter.hh:238
DiscreteFunctionSpaceType::RangeFieldType RangeFieldType
range type (from function space)
Definition: gridfunctionadapter.hh:109
LocalFunctionType localFunction(const EntityType &entity)
Definition: gridfunctionadapter.hh:602
DiscreteFunctionSpaceType::DomainType DomainType
domain type (from function space)
Definition: gridfunctionadapter.hh:111
void init(const EntityType &entity)
init local function
Definition: gridfunctionadapter.hh:320
ConvertToGridFunction(const ThisType &other)
Definition: gridfunctionadapter.hh:584
void evaluate(const PointType &x, RangeType &ret) const
evaluate local function
Definition: gridfunctionadapter.hh:260
LocalFunction(const DiscreteFunctionType &df)
Definition: gridfunctionadapter.hh:249
FunctionSpaceType::DomainType DomainType
domain type (from function space)
Definition: gridfunctionadapter.hh:226
ConvertedType::FunctionSpaceType FunctionSpaceType
Definition: gridfunctionadapter.hh:554
Traits::FunctionSpaceType FunctionSpaceType
function space type
Definition: gridfunctionadapter.hh:214
GridPartType::IntersectionType IntersectionType
Definition: gridfunctionadapter.hh:58
Traits::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
type of discrete function space
Definition: gridfunctionadapter.hh:98
void jacobian(const PointType &x, JacobianRangeType &ret) const
jacobian of local function
Definition: gridfunctionadapter.hh:276
FunctionSpaceType::RangeType RangeType
range type (from function space)
Definition: gridfunctionadapter.hh:228
auto evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values) const -> std::enable_if_t< std::is_same< std::decay_t< decltype(values[0]) >, RangeType >::value >
Definition: gridfunctionadapter.hh:333
LocalFunctionType localFunction(const EntityType &entity)
Definition: gridfunctionadapter.hh:155
DiscreteFunctionSpaceType::RangeType RangeType
range type (from function space)
Definition: gridfunctionadapter.hh:113
const EntityType * entity_
Definition: gridfunctionadapter.hh:354
ConvertToGridFunction< Function, GridPart > convertToGridFunction(const std::string &name, const Function &function, const GridPart &gridPart)
Definition: gridfunctionadapter.hh:625
void evaluateQuadrature(const QuadratureType &quadrature, Vectors &... values) const
evaluate function or jacobian of function for given quadrature
Definition: gridfunctionadapter.hh:311
FunctionSpaceType::JacobianRangeType JacobianRangeType
jacobian type (from function space)
Definition: gridfunctionadapter.hh:230
GridPartType::IndexSetType IndexSetType
type of IndexSet
Definition: gridfunctionadapter.hh:62
DiscreteFunctionSpaceAdapter< FunctionSpaceType, GridPartImp > DiscreteFunctionSpaceType
Definition: gridfunctionadapter.hh:53
static GridFunctionAdapter< Function, GridPart > gridFunctionAdapter(std::string name, const Function &function, const GridPart &gridPart, unsigned int order)
convert a function to a grid function
Definition: gridfunctionadapter.hh:384
LocalFunction(const LocalFunction &other)=default
copy constructor
const DiscreteFunctionSpaceType & space() const
Definition: gridfunctionadapter.hh:613
std::decay_t< FunctionImp > FunctionType
type of function
Definition: gridfunctionadapter.hh:92
GridPartType::template Codim< 0 >::EntityType EntityType
type of codim 0 entity
Definition: gridfunctionadapter.hh:571
void hessian(const PointType &x, HessianRangeType &ret) const
hessian of local function
Definition: gridfunctionadapter.hh:304
DiscreteFunctionSpaceType::GridType GridType
type of grid
Definition: gridfunctionadapter.hh:104
LocalFunction(const EntityType &entity, const DiscreteFunctionType &df)
constructor initializing local function
Definition: gridfunctionadapter.hh:243
DiscreteFunctionSpaceType space_
Definition: gridfunctionadapter.hh:196
FunctionSpaceType::RangeFieldType RangeFieldType
Definition: gridfunctionadapter.hh:47
FunctionImp FunctionType
Definition: gridfunctionadapter.hh:490
GridPartType::GridType GridType
Definition: gridfunctionadapter.hh:56
DiscreteFunctionSpaceType::DomainType DomainType
domain type (from function space)
Definition: gridfunctionadapter.hh:564
std::decay_t< FunctionImp >::FunctionSpaceType FunctionSpaceType
Definition: gridfunctionadapter.hh:45
DiscreteFunctionSpaceType::JacobianRangeType JacobianRangeType
jacobian type (from function space)
Definition: gridfunctionadapter.hh:568
FunctionType::DiscreteFunctionSpaceType DFSType
Definition: gridfunctionadapter.hh:517
FunctionSpaceType::DomainType DomainType
Definition: gridfunctionadapter.hh:50
int order() const
Definition: gridfunctionadapter.hh:317
const GridPartType & gridPart() const
Definition: gridfunctionadapter.hh:178
GridPartImp GridPartType
Definition: gridfunctionadapter.hh:55
FunctionType::DiscreteFunctionSpaceType DFSType
Definition: gridfunctionadapter.hh:491
FunctionSpaceType::JacobianRangeType JacobianRangeType
Definition: gridfunctionadapter.hh:51
FunctionImp FunctionType
Definition: gridfunctionadapter.hh:548
BasicGridFunctionAdapter(std::string name, FunctionImp f, const GridPartType &gridPart, unsigned int order=DiscreteFunctionSpaceType::polynomialOrder)
Definition: gridfunctionadapter.hh:129
void evaluate(const DomainType &global, RangeType &result) const
evaluate function on local coordinate local
Definition: gridfunctionadapter.hh:143
BasicGridFunctionAdapter< FunctionImp, GridPartImp > DiscreteFunctionType
Definition: gridfunctionadapter.hh:64
const DiscreteFunctionSpaceType & space() const
obtain a reference to the corresponding DiscreteFunctionSpace
Definition: gridfunctionadapter.hh:173
DiscreteFunctionSpaceType::RangeType RangeType
range type (from function space)
Definition: gridfunctionadapter.hh:566
DiscreteFunctionSpaceType::RangeFieldType RangeFieldType
range type (from function space)
Definition: gridfunctionadapter.hh:562
BasicGridFunctionAdapterTraits< FunctionImp, GridPartImp > Traits
type of traits
Definition: gridfunctionadapter.hh:89
Traits::FunctionSpaceType FunctionSpaceType
Definition: gridfunctionadapter.hh:101
const std::string & name() const
obtain the name of the discrete function
Definition: gridfunctionadapter.hh:167
const LocalFunctionType localFunction(const EntityType &entity) const
Definition: gridfunctionadapter.hh:596
ConvertDFTypeHelper< FunctionImp, GridPartType, false > ThisType
Definition: gridfunctionadapter.hh:514
const EntityType & entity() const
Definition: gridfunctionadapter.hh:325
const FunctionType & function() const
Definition: gridfunctionadapter.hh:348
FunctionSpaceType::HessianRangeType HessianRangeType
hessian type (from function space)
Definition: gridfunctionadapter.hh:232
void evaluate(const DomainType &global, RangeType &result) const
evaluate function on local coordinate local
Definition: gridfunctionadapter.hh:590
ConvertDFTypeHelper< FunctionImp, GridPartType, true > ThisType
Definition: gridfunctionadapter.hh:488
DiscreteFunctionSpaceType::JacobianRangeType JacobianRangeType
jacobian type (from function space)
Definition: gridfunctionadapter.hh:115
const FunctionType * function_
Definition: gridfunctionadapter.hh:353
FunctionImp function_
Definition: gridfunctionadapter.hh:197
BasicGridFunctionAdapter< const Function &, GridPart > GridFunctionAdapter
Definition: gridfunctionadapter.hh:364
Traits::EntityType EntityType
entity type
Definition: gridfunctionadapter.hh:235
BaseType FunctionType
Definition: gridfunctionadapter.hh:516
GridFunctionAdapter< FunctionImp, GridPartType > BaseType
Definition: gridfunctionadapter.hh:515
DiscreteFunctionSpaceType::DomainFieldType DomainFieldType
domain type (from function space)
Definition: gridfunctionadapter.hh:107
bool continuous() const
return true, probably
Definition: gridfunctionadapter.hh:190
ConvertedType::LocalFunctionType LocalFunctionType
type of local function to export
Definition: gridfunctionadapter.hh:574
GridPartImp GridPartType
type of grid part
Definition: gridfunctionadapter.hh:95
DiscreteFunctionSpaceType::GridType GridType
type of grid
Definition: gridfunctionadapter.hh:557
ConvertToGridFunction(const std::string &name, const FunctionImp &function, const GridPartType &gridPart)
constructor
Definition: gridfunctionadapter.hh:577
int order_
Definition: gridfunctionadapter.hh:355
Traits::EntityType EntityType
type of codim 0 entity
Definition: gridfunctionadapter.hh:118
int order() const
return true, probably
Definition: gridfunctionadapter.hh:184
LocalFunction LocalFunctionType
type of local function to export
Definition: gridfunctionadapter.hh:126
DiscreteFunctionSpaceType::DomainFieldType DomainFieldType
domain type (from function space)
Definition: gridfunctionadapter.hh:560
Definition: bindguard.hh:11
static const Point & coordinate(const Point &x)
Definition: coordinate.hh:14
base class for determing whether a function has local functions or not
Definition: common/discretefunction.hh:57
Abstract class representing a function.
Definition: common/function.hh:50
virtual void operator()(const DomainType &arg, RangeType &dest) const
application operator call evaluate
Definition: common/function.hh:97
BasicGridFunctionAdapter provides local functions for a Function.
Definition: gridfunctionadapter.hh:79
traits of GridFunctionAdapter
Definition: gridfunctionadapter.hh:44
Definition: gridfunctionadapter.hh:208
auto evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values) const -> std::enable_if_t< std::is_same< std::decay_t< decltype(values[0]) >, JacobianRangeType >::value >
Definition: gridfunctionadapter.hh:341
Definition: gridfunctionadapter.hh:540
Create Obejct that behaves like a discrete function space without to provide functions with the itera...
Definition: discretefunctionspace.hh:959
@ polynomialOrder
Definition: discretefunctionspace.hh:972
bool continuous() const
returns true if the space contains only globally continuous functions
Definition: discretefunctionspace.hh:1052
const GridPartType & gridPart() const
get a reference to the associated grid partition
Definition: discretefunctionspace.hh:1034
int order() const
get global order of space
Definition: discretefunctionspace.hh:1063
GridPartType::GridType GridType
type of the grid
Definition: discretefunctionspace.hh:975