dune-localfunctions  2.9.0
lagrange/interpolation.hh
Go to the documentation of this file.
1 // -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
2 // vi: set et ts=4 sw=2 sts=2:
3 // SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
4 // SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
5 #ifndef DUNE_LAGRANGEBASIS_INTERPOLATION_HH
6 #define DUNE_LAGRANGEBASIS_INTERPOLATION_HH
7 
8 #include <type_traits>
9 #include <utility>
10 #include <vector>
11 
12 #include <dune/common/typeutilities.hh>
13 
16 
17 namespace Dune
18 {
19 
20  template< template <class,unsigned int> class LP,
21  unsigned int dim, class F >
22  struct LagrangeInterpolationFactory;
23 
24  // LocalLagrangeInterpolation
25  // --------------------------
26 
27  template< template <class,unsigned int> class LP, unsigned int dim, class F >
29  {
31 
32  public:
33  typedef LP<F,dim> LagrangePointSet;
34  typedef typename LagrangePointSet::Field Field;
35 
36  static const unsigned int dimension = LagrangePointSet::dimension;
37 
38  private:
39  friend struct LagrangeInterpolationFactory<LP,dim,F>;
40  const LagrangePointSet &lagrangePoints_;
41 
43  : lagrangePoints_( lagrangePoints )
44  {}
45 
46  const LagrangePointSet *points () const { return &lagrangePoints_; }
47 
48  template< class Fn, class Vector >
49  auto interpolate ( const Fn &fn, Vector &coefficients, PriorityTag< 1 > ) const
50  -> std::enable_if_t< std::is_invocable_v< const Fn &, decltype( this->lagrangePoints_.begin()->point() ) > >
51  {
52  unsigned int index = 0;
53  for( const auto &lp : lagrangePoints_ )
54  field_cast( fn( lp.point() ), coefficients[ index++ ] );
55  }
56  template< class Fn, class Vector >
57  auto interpolate ( const Fn &fn, Vector &coefficients, PriorityTag< 0 > ) const
58  -> std::enable_if_t< models<Impl::FunctionWithEvaluate< typename Fn::DomainType, typename Fn::RangeType >, Fn>(), void>
59  {
60  unsigned int index = 0;
61  for( const auto &lp : lagrangePoints_ )
62  {
63  typename Fn::RangeType val;
64  fn.evaluate( field_cast< typename Fn::DomainType::field_type >( lp.point() ), val );
65  field_cast( val, coefficients[ index++ ] );
66  }
67  }
68 
69  public:
70  template< class Fn, class Vector >
71  auto interpolate ( const Fn &fn, Vector &coefficients ) const
72  -> std::enable_if_t< std::is_same< decltype(std::declval<Vector>().resize(1) ),void >::value,void>
73  {
74  coefficients.resize( lagrangePoints_.size() );
75  interpolate( fn, coefficients, PriorityTag< 42 >() );
76  }
77 
78  template< class Basis, class Matrix >
79  auto interpolate ( const Basis &basis, Matrix &coefficients ) const
80  -> std::enable_if_t< std::is_same<
81  decltype(std::declval<Matrix>().rowPtr(0)), typename Matrix::Field* >::value,void>
82  {
83  coefficients.resize( lagrangePoints_.size(), basis.size( ) );
84 
85  unsigned int index = 0;
86  for( const auto &lp : lagrangePoints_ )
87  basis.template evaluate< 0 >( lp.point(), coefficients.rowPtr( index++ ) );
88  }
89 
90  const LagrangePointSet &lagrangePoints () const { return lagrangePoints_; }
91  };
92 
93 
94 
95  // LocalLagrangeInterpolationFactory
96  // ---------------------------------
97  template< template <class,unsigned int> class LP,
98  unsigned int dim, class F >
100  {
103 
106 
107  template< GeometryType::Id geometryId >
108  static Object *create ( const Key &key )
109  {
110  const LagrangePointSet *lagrangeCoeff
111  = LagrangePointSetFactory::template create< geometryId >( key );
112  if ( lagrangeCoeff == 0 )
113  return 0;
114  else
115  return new Object( *lagrangeCoeff );
116  }
117  template< GeometryType::Id geometryId >
118  static bool supports ( const Key &key )
119  {
120  return true;
121  }
122  static void release( Object *object)
123  {
124  LagrangePointSetFactory::release( object->points() );
125  delete object;
126  }
127  };
128 
129 }
130 
131 #endif // #ifndef DUNE_LAGRANGEBASIS_INTERPOLATION_HH
Definition: bdfmcube.hh:18
void field_cast(const F1 &f1, F2 &f2)
a helper class to cast from one field to another
Definition: field.hh:159
@ value
Definition: tensor.hh:168
Definition: lagrange/interpolation.hh:100
LagrangeCoefficientsFactory< LP, dim, F > LagrangePointSetFactory
Definition: lagrange/interpolation.hh:101
LagrangePointSetFactory::Object LagrangePointSet
Definition: lagrange/interpolation.hh:102
static bool supports(const Key &key)
Definition: lagrange/interpolation.hh:118
LagrangePointSetFactory::Key Key
Definition: lagrange/interpolation.hh:104
static Object * create(const Key &key)
Definition: lagrange/interpolation.hh:108
static void release(Object *object)
Definition: lagrange/interpolation.hh:122
const LocalLagrangeInterpolation< LP, dim, F > Object
Definition: lagrange/interpolation.hh:105
Definition: lagrange/interpolation.hh:29
const LagrangePointSet & lagrangePoints() const
Definition: lagrange/interpolation.hh:90
LagrangePointSet::Field Field
Definition: lagrange/interpolation.hh:34
static const unsigned int dimension
Definition: lagrange/interpolation.hh:36
LP< F, dim > LagrangePointSet
Definition: lagrange/interpolation.hh:33
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:71
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:79
Definition: lagrangecoefficients.hh:23
static void release(Object *object)
Definition: lagrangecoefficients.hh:42
const typedef LP< F, dim > Object
Definition: lagrangecoefficients.hh:25
std::size_t Key
Definition: lagrangecoefficients.hh:26