dune-localfunctions  2.9.0
whitney/edges0.5/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 
6 #ifndef DUNE_LOCALFUNCTIONS_WHITNEY_EDGES0_5_INTERPOLATION_HH
7 #define DUNE_LOCALFUNCTIONS_WHITNEY_EDGES0_5_INTERPOLATION_HH
8 
9 #include <cstddef>
10 #include <vector>
11 
14 
15 namespace Dune {
16 
18  //
19  // Interpolation
20  //
21 
23 
29  template<class Geometry, class Traits_>
31  private EdgeS0_5Common<Traits_::dimDomainLocal,
32  typename Traits_::DomainField>
33  {
34  public:
35  typedef Traits_ Traits;
36 
37  private:
38  static const std::size_t dim = Traits::dimDomainLocal;
40  using Base::refelem;
41  using Base::s;
42 
43  std::vector<typename Traits::DomainGlobal> edgev;
44 
45  public:
47 
53  template<typename VertexOrder>
54  EdgeS0_5Interpolation(const Geometry& geo,
55  const VertexOrder& vertexOrder) :
56  edgev(s)
57  {
58  for(std::size_t i = 0; i < s; ++i) {
59  const std::size_t i0 = refelem.subEntity(i,dim-1,0,dim);
60  const std::size_t i1 = refelem.subEntity(i,dim-1,1,dim);
61 
62  edgev[i] = geo.corner(i1);
63  edgev[i] -= geo.corner(i0);
64  edgev[i] /= edgev[i].two_norm();
65 
66  const typename VertexOrder::iterator& edgeVertexOrder =
67  vertexOrder.begin(dim-1, i);
68  if(edgeVertexOrder[0] > edgeVertexOrder[1])
69  edgev[i] *= -1;
70  }
71  }
72 
74  template<typename F, typename C>
75  void interpolate(const F& ff, std::vector<C>& out) const {
76  typename Traits::Range y;
77 
78  auto&& f = Impl::makeFunctionWithCallOperator<std::decay_t<decltype(refelem.position(0,dim-1))>>(ff);
79 
80  out.resize(s);
81 
82  for(std::size_t i = 0; i < s; ++i) {
83  y = f(refelem.position(i,dim-1));
84 
85  out[i] = y * edgev[i];
86  }
87  }
88  };
89 
90 } // namespace Dune
91 
92 #endif // DUNE_LOCALFUNCTIONS_WHITNEY_EDGES0_5_INTERPOLATION_HH
Definition: bdfmcube.hh:18
Common base class for edge elements.
Definition: common.hh:19
RefElem refelem
The reference element for this edge element.
Definition: common.hh:26
std::size_t s
The number of base functions.
Definition: common.hh:34
Interpolation for lowest order edge elements on simplices.
Definition: whitney/edges0.5/interpolation.hh:33
void interpolate(const F &ff, std::vector< C > &out) const
Interpolation of a function.
Definition: whitney/edges0.5/interpolation.hh:75
Traits_ Traits
Definition: whitney/edges0.5/interpolation.hh:35
EdgeS0_5Interpolation(const Geometry &geo, const VertexOrder &vertexOrder)
constructor
Definition: whitney/edges0.5/interpolation.hh:54