1 #ifndef DUNE_FEM_GRIDFUNCTIONADAPTER_HH 2 #define DUNE_FEM_GRIDFUNCTIONADAPTER_HH 4 #include <dune/common/exceptions.hh> 35 template <
class FunctionImp,
class Gr
idPartImp>
39 template <
class FunctionImp,
class Gr
idPartImp>
46 typedef typename FunctionSpaceType::RangeType
RangeType;
47 typedef typename FunctionSpaceType::DomainType
DomainType;
53 typedef typename GridPartType :: GridType
GridType;
70 template<
class FunctionImp,
class Gr
idPartImp >
72 :
public Function< typename FunctionImp::FunctionSpaceType,
73 GridFunctionAdapter< FunctionImp, GridPartImp > >,
80 static_assert( !(Dune::Conversion< FunctionImp, HasLocalFunction >::exists),
81 "FunctionType may not be a discrete function type." );
107 typedef typename DiscreteFunctionSpaceType::DomainType
DomainType ;
109 typedef typename DiscreteFunctionSpaceType::RangeType
RangeType ;
125 const FunctionType &f,
126 const GridPartType &gridPart,
128 : space_( gridPart, order ),
135 : space_( other.space_ ),
136 function_( other.function_ ),
141 void evaluate (
const DomainType &global, RangeType &result )
const 143 function_.evaluate( global, result );
147 void jacobian (
const DomainType &global, JacobianRangeType &result )
const 149 function_.jacobian(global,result);
155 return LocalFunctionType( entity, *
this );
161 return LocalFunctionType( entity, *
this );
165 const std::string &
name ()
const 171 const DiscreteFunctionSpaceType &
space ()
const 178 return space().gridPart();
192 template<
class Function,
class Gr
idPart >
207 static const int dimDomain = GridPart::GridType::dimensionworld;
209 static const int dimRange = FunctionSpaceType::dimRange;
214 typedef typename FunctionSpaceType::RangeType
RangeType;
225 static const int dimLocal = LocalCoordinateType::dimension;
229 : function_( &df.function_ ),
231 order_( df.space().order() )
235 : function_( &df.function_ ),
237 order_( df.space().order() )
241 template<
class Po
intType >
242 void evaluate (
const PointType &x, RangeType &ret )
const 244 const auto geometry = entity().geometry();
245 auto global = geometry.global(
coordinate( x ) );
246 function().evaluate( global, ret );
250 template<
class Po
intType >
251 void jacobian (
const PointType &x, JacobianRangeType &ret )
const 253 const auto geometry = entity().geometry();
254 auto global = geometry.global(
coordinate( x ) );
255 function().jacobian( global, ret );
257 if( dimLocal != dimDomain )
265 const auto gjt = geometry.jacobianTransposed(
coordinate( x ) );
266 const auto gjit = geometry.jacobianInverseTransposed(
coordinate( x ) );
268 FieldVector< RangeFieldType, dimLocal > tmp;
269 for(
auto i = 0; i < dimRange; ++i )
271 gjit.mtv( ret[ i ], tmp );
272 gjt.mtv( tmp, ret[ i ] );
278 template<
class Po
intType >
279 void hessian (
const PointType &x, HessianRangeType &ret )
const 281 DUNE_THROW( NotImplemented,
"Method hessian() not implemented yet" );
285 template <
class QuadratureType,
class VectorType >
288 assert( values.size() == quadrature.nop() );
289 evaluateQuadratureImp( quadrature, values, values[ 0 ] );
292 int order ()
const {
return order_; }
295 void init (
const EntityType &entity )
307 template <
class QuadratureType,
class VectorType >
310 const auto nop = quadrature.nop();
311 for(
auto qp = 0; qp < nop; ++qp )
312 evaluate( quadrature[ qp ], values[ qp ] );
315 template <
class QuadratureType,
class VectorType >
318 const auto nop = quadrature.nop();
319 for(
auto qp = 0; qp < nop; ++qp )
320 jacobian( quadrature[ qp ], values[ qp ] );
336 template <
class FunctionImp,
class Gr
idPartType,
bool>
337 struct ConvertDFTypeHelper;
339 template <
class FunctionImp,
class Gr
idPartType>
340 struct ConvertDFTypeHelper<FunctionImp,GridPartType,true>
342 typedef ConvertDFTypeHelper<FunctionImp,GridPartType,true>
ThisType;
343 enum {compatible = Dune::Conversion<GridPartType,typename FunctionImp::DiscreteFunctionSpaceType::GridPartType>::exists};
345 typedef typename FunctionType::DiscreteFunctionSpaceType
DFSType;
346 ConvertDFTypeHelper(
const std::string& name,
const FunctionImp& func,
const GridPartType& gp) :
349 ConvertDFTypeHelper(
const ConvertDFTypeHelper& other) :
352 const FunctionType&
function()
const 356 const DFSType& space()
const 358 return func_.space();
361 const FunctionImp& func_;
364 template <
class FunctionImp,
class Gr
idPartType>
365 struct ConvertDFTypeHelper<FunctionImp,GridPartType,false>
368 typedef ConvertDFTypeHelper<FunctionImp,GridPartType,false>
ThisType;
372 ConvertDFTypeHelper(
const std::string& name,
const FunctionImp& func,
const GridPartType& gp) :
373 BaseType(name,func,gp)
375 ConvertDFTypeHelper(
const ConvertDFTypeHelper& other) :
378 const FunctionType&
function()
const 382 const DFSType& space()
const 384 return BaseType::space();
389 template<
class FunctionImp,
class Gr
idPartImp >
391 :
public Function< typename FunctionImp::FunctionSpaceType,
392 ConvertToGridFunction< FunctionImp, GridPartImp > >,
397 static const bool hasLocalFunction = Dune::Conversion< FunctionImp, HasLocalFunction >::exists;
398 typedef ConvertDFTypeHelper< FunctionImp, GridPartImp, hasLocalFunction > Helper;
399 typedef typename Helper::FunctionType ConvertedType;
418 typedef typename DiscreteFunctionSpaceType::DomainType
DomainType ;
420 typedef typename DiscreteFunctionSpaceType::RangeType
RangeType ;
432 const FunctionImp &
function,
433 const GridPartType &gridPart )
435 helper_( name, function, gridPart )
439 : name_( other.name_ ),
440 helper_( other.helper_ )
444 void evaluate (
const DomainType &global, RangeType &result )
const 446 helper_.function().evaluate(global,result);
452 return helper_.function().localFunction(entity);
458 return helper_.function().localFunction(entity);
462 const std::string &
name()
const 467 const DiscreteFunctionSpaceType &
space()
const 469 return helper_.space();
473 const std::string name_;
477 template<
class Function,
class Gr
idPart >
481 const GridPart &gridPart )
492 #endif // #ifndef DUNE_DISCRETEFUNCTIONADAPTER_HH DiscreteFunctionSpaceType space_
Definition: gridfunctionadapter.hh:182
DiscreteFunctionSpaceType::DomainFieldType DomainFieldType
domain type (from function space)
Definition: gridfunctionadapter.hh:414
GridPartImp GridPartType
Definition: gridfunctionadapter.hh:52
LocalFunction(const DiscreteFunctionType &df)
Definition: gridfunctionadapter.hh:234
DiscreteFunctionSpaceType::DomainType DomainType
domain type (from function space)
Definition: gridfunctionadapter.hh:418
FunctionSpaceType::RangeFieldType RangeFieldType
range field type (from function space)
Definition: gridfunctionadapter.hh:205
FunctionSpaceType::JacobianRangeType JacobianRangeType
Definition: gridfunctionadapter.hh:48
FunctionSpaceType::DomainType DomainType
domain type (from function space)
Definition: gridfunctionadapter.hh:212
ConvertedType::FunctionSpaceType FunctionSpaceType
Definition: gridfunctionadapter.hh:408
LocalFunction LocalFunctionType
type of local function to export
Definition: gridfunctionadapter.hh:117
GridPartType::IndexSetType IndexSetType
type of IndexSet
Definition: gridfunctionadapter.hh:58
FunctionType::DiscreteFunctionSpaceType DFSType
Definition: gridfunctionadapter.hh:345
FunctionImp FunctionType
type of function
Definition: gridfunctionadapter.hh:88
EntityType::Geometry::LocalCoordinate LocalCoordinateType
local coordinate type
Definition: gridfunctionadapter.hh:223
FunctionSpaceType::DomainFieldType DomainFieldType
Definition: gridfunctionadapter.hh:45
void evaluate(const PointType &x, RangeType &ret) const
evaluate local function
Definition: gridfunctionadapter.hh:242
void evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values, const RangeType &) const
Definition: gridfunctionadapter.hh:308
int order() const
Definition: gridfunctionadapter.hh:292
FunctionSpaceType::RangeType RangeType
range type (from function space)
Definition: gridfunctionadapter.hh:214
void evaluateQuadratureImp(const QuadratureType &quadrature, VectorType &values, const JacobianRangeType &) const
Definition: gridfunctionadapter.hh:316
FunctionImp::FunctionSpaceType FunctionSpaceType
Definition: gridfunctionadapter.hh:42
LocalFunctionType localFunction(const EntityType &entity)
obtain a local function for an entity (read-write)
Definition: gridfunctionadapter.hh:456
DiscreteFunctionSpaceType::RangeFieldType RangeFieldType
range type (from function space)
Definition: gridfunctionadapter.hh:416
FunctionSpaceType::RangeType RangeType
Definition: gridfunctionadapter.hh:46
GridPartImp GridPartType
type of grid part
Definition: gridfunctionadapter.hh:91
const DiscreteFunctionSpaceType & space() const
obtain a reference to the corresponding DiscreteFunctionSpace
Definition: gridfunctionadapter.hh:171
void jacobian(const DomainType &global, JacobianRangeType &result) const
evaluate function on local coordinate local
Definition: gridfunctionadapter.hh:147
GridFunctionAdapter(const ThisType &other)
Definition: gridfunctionadapter.hh:134
DiscreteFunctionSpaceType::DomainFieldType DomainFieldType
domain type (from function space)
Definition: gridfunctionadapter.hh:103
DiscreteFunctionSpaceType::GridType GridType
type of grid
Definition: gridfunctionadapter.hh:100
DiscreteFunctionSpaceType::RangeType RangeType
range type (from function space)
Definition: gridfunctionadapter.hh:109
FunctionSpaceType::HessianRangeType HessianRangeType
hessian type (from function space)
Definition: gridfunctionadapter.hh:218
void jacobian(const PointType &x, JacobianRangeType &ret) const
jacobian of local function
Definition: gridfunctionadapter.hh:251
FunctionType::DiscreteFunctionSpaceType DFSType
Definition: gridfunctionadapter.hh:371
int order_
Definition: gridfunctionadapter.hh:330
GridPartType::GridType GridType
Definition: gridfunctionadapter.hh:53
void evaluate(const DomainType &global, RangeType &result) const
evaluate function on local coordinate local
Definition: gridfunctionadapter.hh:444
Traits::FunctionSpaceType FunctionSpaceType
function space type
Definition: gridfunctionadapter.hh:200
GridFunctionAdapter< FunctionImp, GridPartImp > DiscreteFunctionType
Definition: gridfunctionadapter.hh:60
void evaluate(const DomainType &global, RangeType &result) const
evaluate function on local coordinate local
Definition: gridfunctionadapter.hh:141
ConvertToGridFunction(const ThisType &other)
Definition: gridfunctionadapter.hh:438
traits of GridFunctionAdapter
Definition: gridfunctionadapter.hh:40
const FunctionType * function_
Definition: gridfunctionadapter.hh:328
FunctionSpaceType::RangeFieldType RangeFieldType
Definition: gridfunctionadapter.hh:44
const DiscreteFunctionSpaceType & space() const
Definition: gridfunctionadapter.hh:467
interface for local functions
Definition: localfunction.hh:41
const LocalFunctionType localFunction(const EntityType &entity) const
obtain a local function for an entity (read-write)
Definition: gridfunctionadapter.hh:159
const std::string name_
Definition: gridfunctionadapter.hh:184
void hessian(const PointType &x, HessianRangeType &ret) const
hessian of local function
Definition: gridfunctionadapter.hh:279
LocalFunctionType localFunction(const EntityType &entity)
obtain a local function for an entity (read-write)
Definition: gridfunctionadapter.hh:153
void evaluateQuadrature(const QuadratureType &quadrature, VectorType &values) const
evaluate function or jacobian of function for given quadrature
Definition: gridfunctionadapter.hh:286
DiscreteFunctionSpaceType::RangeFieldType RangeFieldType
range type (from function space)
Definition: gridfunctionadapter.hh:105
const FunctionType & function_
Definition: gridfunctionadapter.hh:183
FunctionImp FunctionType
Definition: gridfunctionadapter.hh:402
DiscreteFunctionSpaceType::DomainType DomainType
domain type (from function space)
Definition: gridfunctionadapter.hh:107
const EntityType * entity_
Definition: gridfunctionadapter.hh:329
Definition: coordinate.hh:4
FunctionSpaceType::DomainType DomainType
Definition: gridfunctionadapter.hh:47
FunctionSpaceType::DomainFieldType DomainFieldType
domain field type (from function space)
Definition: gridfunctionadapter.hh:203
ConvertDFTypeHelper< FunctionImp, GridPartType, false > ThisType
Definition: gridfunctionadapter.hh:368
Traits::FunctionSpaceType FunctionSpaceType
Definition: gridfunctionadapter.hh:97
void init(const EntityType &entity)
init local function
Definition: gridfunctionadapter.hh:295
GridFunctionAdapterTraits< FunctionImp, GridPartImp > Traits
type of traits
Definition: gridfunctionadapter.hh:81
GridFunctionAdapter(const std::string &name, const FunctionType &f, const GridPartType &gridPart, unsigned int order=DiscreteFunctionSpaceType::polynomialOrder)
Definition: gridfunctionadapter.hh:124
DiscreteFunctionSpaceAdapter< FunctionSpaceType, GridPartImp > DiscreteFunctionSpaceType
Definition: gridfunctionadapter.hh:50
LocalFunction(const EntityType &entity, const DiscreteFunctionType &df)
constructor initializing local function
Definition: gridfunctionadapter.hh:228
DiscreteFunctionSpaceType::GridType GridType
type of grid
Definition: gridfunctionadapter.hh:411
GridPartImp GridPartType
Definition: gridfunctionadapter.hh:403
DiscreteFunctionSpaceType::RangeType RangeType
range type (from function space)
Definition: gridfunctionadapter.hh:420
DiscreteFunctionSpaceType::JacobianRangeType JacobianRangeType
jacobian type (from function space)
Definition: gridfunctionadapter.hh:422
const LocalFunctionType localFunction(const EntityType &entity) const
obtain a local function for an entity (read-write)
Definition: gridfunctionadapter.hh:450
Definition: gridfunctionadapter.hh:193
ConvertToGridFunction(const std::string &name, const FunctionImp &function, const GridPartType &gridPart)
constructor
Definition: gridfunctionadapter.hh:431
GridPartType::template Codim< 0 >::EntityType EntityType
Definition: gridfunctionadapter.hh:54
FunctionSpaceType::JacobianRangeType JacobianRangeType
jacobian type (from function space)
Definition: gridfunctionadapter.hh:216
const std::string & name() const
obtain the name of the discrete function
Definition: gridfunctionadapter.hh:165
ConvertDFTypeHelper< FunctionImp, GridPartType, true > ThisType
Definition: gridfunctionadapter.hh:342
GridPartType::template Codim< 0 >::IteratorType IteratorType
type of iterator
Definition: gridfunctionadapter.hh:56
Definition: discretefunctionspace.hh:907
BaseType FunctionType
Definition: gridfunctionadapter.hh:370
const EntityType & entity() const
Definition: gridfunctionadapter.hh:300
ConvertedType::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
type of discrete function space
Definition: gridfunctionadapter.hh:406
GridFunctionAdapter provides local functions for a Function.
Definition: gridfunctionadapter.hh:36
const GridPartType & gridPart() const
Definition: gridfunctionadapter.hh:176
Traits::DiscreteFunctionSpaceType DiscreteFunctionSpaceType
type of discrete function space
Definition: gridfunctionadapter.hh:94
Abstract class representing a function.
Definition: function.hh:43
FunctionImp FunctionType
Definition: gridfunctionadapter.hh:344
GridFunctionAdapter< FunctionImp, GridPartType > BaseType
Definition: gridfunctionadapter.hh:369
Traits::EntityType EntityType
type of codim 0 entity
Definition: gridfunctionadapter.hh:114
Definition: discretefunction.hh:55
ConvertedType::LocalFunctionType LocalFunctionType
type of local function to export
Definition: gridfunctionadapter.hh:428
const std::string & name() const
obtain the name of the discrete function
Definition: gridfunctionadapter.hh:462
GridPartType::template Codim< 0 >::EntityType EntityType
type of codim 0 entity
Definition: gridfunctionadapter.hh:425
GridPartType::GridType GridType
type of the grid
Definition: discretefunctionspace.hh:910
ConvertToGridFunction< Function, GridPart > convertToGridFunction(const std::string &name, const Function &function, const GridPart &gridPart)
Definition: gridfunctionadapter.hh:479
static const Point & coordinate(const Point &x)
Definition: coordinate.hh:11
DiscreteFunctionSpaceType::JacobianRangeType JacobianRangeType
jacobian type (from function space)
Definition: gridfunctionadapter.hh:111
Create Obejct that behaves like a discrete function space without to provide functions with the itera...
Definition: discretefunctionspace.hh:892
Definition: gridfunctionadapter.hh:390
Traits::EntityType EntityType
entity type
Definition: gridfunctionadapter.hh:221