dune-localfunctions  2.8.0
meta/power/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 
4 #ifndef DUNE_LOCALFUNCTIONS_META_POWER_INTERPOLATION_HH
5 #define DUNE_LOCALFUNCTIONS_META_POWER_INTERPOLATION_HH
6 
7 #include <algorithm>
8 #include <cassert>
9 #include <cstddef>
10 #include <vector>
12 
13 namespace Dune {
14 
17 
23  template<class Backend, class BasisTraits>
25  static_assert(Backend::Traits::dimRange == 1,
26  "PowerInterpolation works only with scalar backends");
27 
28  const Backend *backend;
29 
30  public:
32  typedef BasisTraits Traits;
33 
35 
41  PowerInterpolation(const Backend &backend_) : backend(&backend_) { }
42 
43  private:
44  template<class F>
45  class ComponentEvaluator
46  {
47  const F &f;
48  std::size_t comp;
49 
50  public:
51  ComponentEvaluator(const F &f_, std::size_t comp_) :
52  f(f_), comp(comp_)
53  { }
54 
55  typename Backend::Traits::Range operator()(const typename Backend::Traits::DomainLocal &x) const
56  {
57  typename Traits::Range fy = f(x);
58  typename Backend::Traits::Range y;
59  y[0] = fy[comp];
60  return y;
61  }
62  };
63 
64  public:
66 
75  template<typename F, typename C>
76  void interpolate(const F& ff, std::vector<C>& out) const {
77 
78  auto&& f = Impl::makeFunctionWithCallOperator<typename Backend::Traits::DomainLocal>(ff);
79 
80 
81  out.clear();
82  std::vector<C> cout;
83  for(std::size_t d = 0; d < Traits::dimRange; ++d) {
84  // When dropping support for `evaluate()` we can simply use a lambda
85  // instead of ComponentEvaluator. But changing this now would break
86  // PowerInterpolation for FE-implementation outside of dune-localfunctions
87  // which may not have been adjusted so far.
88  backend->interpolate(ComponentEvaluator<std::decay_t<decltype(f)>>(f, d), cout);
89  if(d == 0)
90  out.resize(cout.size()*Traits::dimRange);
91  // make sure the size of cout does not change surprisingly
92  assert(out.size() == cout.size()*Traits::dimRange);
93  std::copy(cout.begin(), cout.end(), out.begin() + d*cout.size());
94  }
95  }
96  };
97 
98 } // namespace Dune
99 
100 #endif // DUNE_LOCALFUNCTIONS_META_POWER_INTERPOLATION_HH
Definition: bdfmcube.hh:16
Meta-interpolation turning a scalar interpolation into vector-valued interpolation.
Definition: meta/power/interpolation.hh:24
void interpolate(const F &ff, std::vector< C > &out) const
Determine coefficients interpolating a given function.
Definition: meta/power/interpolation.hh:76
BasisTraits Traits
Export basis traits.
Definition: meta/power/interpolation.hh:32
PowerInterpolation(const Backend &backend_)
Construct a PowerInterpolation.
Definition: meta/power/interpolation.hh:41