1#ifndef DUNE_FEM_SPACE_COMMON_INTERPOLATE_HH
2#define DUNE_FEM_SPACE_COMMON_INTERPOLATE_HH
10#include <dune/grid/common/partitionset.hh>
11#include <dune/grid/common/rangegenerators.hh>
13#include <dune/fem/common/bindguard.hh>
14#include <dune/fem/storage/entitygeometry.hh>
16#include <dune/fem/function/common/discretefunction.hh>
17#include <dune/fem/function/common/gridfunctionadapter.hh>
18#include <dune/fem/function/common/localcontribution.hh>
19#include <dune/fem/function/localfunction/const.hh>
20#include <dune/fem/space/common/capabilities.hh>
21#include <dune/fem/space/common/localinterpolation.hh>
54 template<
class Gr
idFunction,
class DiscreteFunction >
55 static inline void interpolate (
const GridFunction &u, DiscreteFunction &v )
61 template<
class Function,
class DiscreteFunction,
unsigned int partitions >
62 static inline std::enable_if_t< !std::is_convertible< Function, HasLocalFunction >::value >
65 typedef typename DiscreteFunction :: DiscreteFunctionSpaceType :: GridPartType GridPartType;
66 typedef GridFunctionAdapter< Function, GridPartType > GridFunctionType;
68 GridFunctionType uGrid(
"uGrid", u, v.space().gridPart() );
73 template<
class Gr
idFunction,
class DiscreteFunction,
unsigned int partitions >
74 static inline std::enable_if_t< std::is_convertible< GridFunction, HasLocalFunction >::value && Capabilities::hasInterpolation< typename DiscreteFunction::DiscreteFunctionSpaceType >::v >
75 interpolate (
const GridFunction &u, DiscreteFunction &v, PartitionSet< partitions > ps )
77 ConstLocalFunction< GridFunction > uLocal( u );
78 LocalContribution< DiscreteFunction, Assembly::Set > vLocal( v,
false );
79 LocalInterpolation< typename DiscreteFunction::DiscreteFunctionSpaceType >
80 interpolation( v.space() );
83 for(
const auto& entity : elements( v.gridPart(), ps ) )
86 auto uGuard = bindGuard( uLocal, entity );
89 auto vGuard = bindGuard( vLocal, entity );
92 auto iGuard = bindGuard( interpolation, entity );
95 interpolation( uLocal, vLocal );
104 template<
class Entity,
class FunctionSpace,
class Weight >
105 struct WeightLocalFunction :
public EntityStorage< Entity >
108 typedef EntityStorage< EntityType > BaseType;
120 typedef typename EntityType::Geometry::LocalCoordinate LocalCoordinateType;
125 explicit WeightLocalFunction ( Weight &weight,
int order )
126 : BaseType(), weight_( weight ), order_(order) {}
128 void bind (
const EntityType &entity )
131 weight_.setEntity( entity );
134 using BaseType :: unbind;
135 using BaseType :: entity;
137 template<
class Po
int >
138 void evaluate (
const Point &x, RangeType &value )
const
140 const RangeFieldType weight = weight_( coordinate( x ) );
141 for(
int i = 0; i < dimRange; ++i )
144 template<
class Po
int >
145 void jacobian (
const Point &x, JacobianRangeType &value )
const
147 const RangeFieldType weight = weight_( coordinate( x ) );
148 for(
int i = 0; i < dimRange; ++i )
152 template<
class Quadrature,
class Values >
153 auto evaluateQuadrature (
const Quadrature &quadrature, Values &values )
const
154 -> std::enable_if_t< std::is_same<
decltype( values[ 0 ] ), RangeType & >::value >
156 for(
const auto &qp : quadrature )
157 evaluate( qp, values[ qp.index() ] );
160 int order()
const {
return order_; }
173 template<
class Gr
idFunction,
class DiscreteFunction,
class Weight >
174 inline static auto interpolate (
const GridFunction &u, DiscreteFunction &v, Weight &&weight )
175 -> std::enable_if_t< !std::is_const< std::remove_reference_t< Weight > >::value >
177 DiscreteFunction w( v );
178 interpolate( u, v, std::forward< Weight >( weight ), w );
181 template<
class Gr
idFunction,
class DiscreteFunction,
class Weight >
182 inline static auto interpolate (
const GridFunction &u, DiscreteFunction &v, Weight &&weight )
183 -> std::enable_if_t< !std::is_const< std::remove_reference_t< Weight > >::value && !std::is_base_of< HasLocalFunction, GridFunction >::value >
188 template<
class Gr
idFunction,
class DiscreteFunction,
class Weight >
189 inline static auto interpolate (
const GridFunction &u, DiscreteFunction &v, Weight &&weight, DiscreteFunction &w )
190 -> std::enable_if_t< std::is_base_of< HasLocalFunction, GridFunction >::value && Capabilities::hasInterpolation< typename DiscreteFunction::DiscreteFunctionSpaceType >::v,
191 void_t< decltype( std::declval< Weight >().setEntity( std::declval< const typename DiscreteFunction::DiscreteFunctionSpaceType::EntityType & >() ) ) > >
193 typedef typename DiscreteFunction::DiscreteFunctionSpaceType::EntityType EntityType;
195 const auto &space = w.space();
196 Impl::WeightLocalFunction< EntityType, std::remove_reference_t< typename DiscreteFunction::FunctionSpaceType >, Weight > localWeight( weight, w.order() );
197 LocalInterpolation< typename DiscreteFunction::DiscreteFunctionSpaceType > interpolation( space );
198 interpolate( u, v, [ &interpolation, &localWeight ] (
const EntityType &entity, AddLocalContribution< DiscreteFunction > &w ) {
199 auto weightGuard = bindGuard( localWeight, entity );
200 auto iGuard = bindGuard( interpolation, entity );
201 interpolation( localWeight, w );
205 template<
class Gr
idFunction,
class DiscreteFunction,
class Weight >
206 inline static auto interpolate (
const GridFunction &u, DiscreteFunction &v, Weight &&weight, DiscreteFunction &w )
207 -> std::enable_if_t< std::is_base_of< HasLocalFunction, GridFunction >::value && Capabilities::hasInterpolation< typename DiscreteFunction::DiscreteFunctionSpaceType >::v,
208 void_t< decltype( std::declval< Weight >()( std::declval< typename DiscreteFunction::DiscreteFunctionSpaceType::EntityType & >(), std::declval< AddLocalContribution< DiscreteFunction > & >() ) ) > >
210 typedef typename DiscreteFunction::DofType DofType;
216 ConstLocalFunction< GridFunction > uLocal( u );
217 AddLocalContribution< DiscreteFunction > vLocal( v ), wLocal( w );
218 LocalInterpolation< typename DiscreteFunction::DiscreteFunctionSpaceType >
219 interpolation( v.space() );
221 for(
const auto &entity : v.space() )
223 auto uGuard = bindGuard( uLocal, entity );
224 auto vGuard = bindGuard( vLocal, entity );
225 auto wGuard = bindGuard( wLocal, entity );
226 auto iGuard = bindGuard( interpolation, entity );
229 interpolation( uLocal, vLocal );
232 weight( entity, wLocal );
235 std::transform( vLocal.begin(), vLocal.end(), wLocal.begin(), vLocal.begin(), std::multiplies< DofType >() );
239 std::transform( v.dbegin(), v.dend(), w.dbegin(), v.dbegin(), [] ( DofType v, DofType w ) {
241 return (w > DofType( 0 ) ? v / w : v);
Entity EntityType
entity type
Definition: entitygeometry.hh:39
void bind(const EntityType &entity)
set new entity object and geometry if enabled
Definition: entitygeometry.hh:135
Definition: explicitfieldvector.hh:75
FunctionSpaceTraits::DomainFieldType DomainFieldType
Intrinsic type used for values in the domain field (usually a double)
Definition: functionspaceinterface.hh:60
FunctionSpaceTraits::RangeType RangeType
Type of range vector (using type of range field) has a Dune::FieldVector type interface.
Definition: functionspaceinterface.hh:71
@ dimDomain
dimension of domain vector space
Definition: functionspaceinterface.hh:46
@ dimRange
dimension of range vector space
Definition: functionspaceinterface.hh:48
FunctionSpaceTraits::LinearMappingType JacobianRangeType
Intrinsic type used for the jacobian values has a Dune::FieldMatrix type interface.
Definition: functionspaceinterface.hh:75
FunctionSpaceTraits::DomainType DomainType
Type of domain vector (using type of domain field) has a Dune::FieldVector type interface.
Definition: functionspaceinterface.hh:67
FunctionSpaceTraits::RangeFieldType RangeFieldType
Intrinsic type used for values in the range field (usually a double)
Definition: functionspaceinterface.hh:63
A vector valued function space.
Definition: functionspace.hh:60
actual interface class for quadratures
static void interpolate(const GridFunction &u, DiscreteFunction &v)
perform native interpolation of a discrete function space
Definition: interpolate.hh:55
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:385
constexpr All all
PartitionSet for all partitions.
Definition: partitionset.hh:295
Dune namespace.
Definition: alignedallocator.hh:13
A set of PartitionType values.
Definition: partitionset.hh:137
Traits for type conversions and type information.