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.