3 #ifndef DUNE_LAGRANGEBASIS_INTERPOLATION_HH
4 #define DUNE_LAGRANGEBASIS_INTERPOLATION_HH
10 #include <dune/common/std/type_traits.hh>
11 #include <dune/common/typeutilities.hh>
19 template<
template <
class,
unsigned int>
class LP,
20 unsigned int dim,
class F >
21 struct LagrangeInterpolationFactory;
26 template<
template <
class,
unsigned int>
class LP,
unsigned int dim,
class F >
33 typedef typename LagrangePointSet::Field
Field;
35 static const unsigned int dimension = LagrangePointSet::dimension;
47 template<
class Fn,
class Vector >
48 auto interpolate (
const Fn &fn, Vector &coefficients, PriorityTag< 1 > )
const
49 -> std::enable_if_t< Std::is_invocable<
const Fn &, decltype( this->lagrangePoints_.begin()->point() ) >
::value >
51 unsigned int index = 0;
52 for(
const auto &lp : lagrangePoints_ )
53 field_cast( fn( lp.point() ), coefficients[ index++ ] );
55 template<
class Fn,
class Vector >
56 auto interpolate (
const Fn &fn, Vector &coefficients, PriorityTag< 0 > )
const
57 -> std::enable_if_t< models<Impl::FunctionWithEvaluate< typename Fn::DomainType, typename Fn::RangeType >, Fn>(),
void>
59 unsigned int index = 0;
60 for(
const auto &lp : lagrangePoints_ )
62 typename Fn::RangeType val;
63 fn.evaluate( field_cast< typename Fn::DomainType::field_type >( lp.point() ), val );
69 template<
class Fn,
class Vector >
71 -> std::enable_if_t< std::is_same< decltype(std::declval<Vector>().resize(1) ),
void >::
value,
void>
73 coefficients.resize( lagrangePoints_.size() );
74 interpolate( fn, coefficients, PriorityTag< 42 >() );
77 template<
class Basis,
class Matrix >
78 auto interpolate (
const Basis &basis, Matrix &coefficients )
const
79 -> std::enable_if_t< std::is_same<
80 decltype(std::declval<Matrix>().rowPtr(0)),
typename Matrix::Field* >
::value,
void>
82 coefficients.resize( lagrangePoints_.size(), basis.size( ) );
84 unsigned int index = 0;
85 for(
const auto &lp : lagrangePoints_ )
86 basis.template evaluate< 0 >( lp.point(), coefficients.rowPtr( index++ ) );
96 template<
template <
class,
unsigned int>
class LP,
97 unsigned int dim,
class F >
106 template<
class Topology >
110 = LagrangePointSetFactory::template create< Topology >( key );
111 if ( lagrangeCoeff == 0 )
114 return new Object( *lagrangeCoeff );
116 template<
class Topology >
Definition: bdfmcube.hh:16
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:157
@ value
Definition: tensor.hh:166
Definition: lagrange/interpolation.hh:99
LagrangeCoefficientsFactory< LP, dim, F > LagrangePointSetFactory
Definition: lagrange/interpolation.hh:100
LagrangePointSetFactory::Object LagrangePointSet
Definition: lagrange/interpolation.hh:101
static bool supports(const Key &key)
Definition: lagrange/interpolation.hh:117
LagrangePointSetFactory::Key Key
Definition: lagrange/interpolation.hh:103
static Object * create(const Key &key)
Definition: lagrange/interpolation.hh:107
static void release(Object *object)
Definition: lagrange/interpolation.hh:121
const LocalLagrangeInterpolation< LP, dim, F > Object
Definition: lagrange/interpolation.hh:104
Definition: lagrange/interpolation.hh:28
const LagrangePointSet & lagrangePoints() const
Definition: lagrange/interpolation.hh:89
LagrangePointSet::Field Field
Definition: lagrange/interpolation.hh:33
static const unsigned int dimension
Definition: lagrange/interpolation.hh:35
LP< F, dim > LagrangePointSet
Definition: lagrange/interpolation.hh:32
auto interpolate(const Fn &fn, Vector &coefficients) const -> std::enable_if_t< std::is_same< decltype(std::declval< Vector >().resize(1)), void >::value, void >
Definition: lagrange/interpolation.hh:70
auto interpolate(const Basis &basis, Matrix &coefficients) const -> std::enable_if_t< std::is_same< decltype(std::declval< Matrix >().rowPtr(0)), typename Matrix::Field * >::value, void >
Definition: lagrange/interpolation.hh:78
Definition: lagrangecoefficients.hh:21
static void release(Object *object)
Definition: lagrangecoefficients.hh:40
const typedef LP< F, dim > Object
Definition: lagrangecoefficients.hh:23
std::size_t Key
Definition: lagrangecoefficients.hh:24