3#ifndef DUNE_LOCALFUNCTIONS_BREZZIDOUGLASFORTINMARINI_CUBE_LOCALINTERPOLATION_HH
4#define DUNE_LOCALFUNCTIONS_BREZZIDOUGLASFORTINMARINI_CUBE_LOCALINTERPOLATION_HH
19#include <dune/localfunctions/common/localinterpolation.hh>
36 template<
class D,
class R,
unsigned int dim,
unsigned int order>
42 using DomainFieldType = D;
43 using RangeFieldType = R;
45 static constexpr std::size_t numFaces = 2*dim;
47 static constexpr unsigned int interiorDofs = dim*
binomial(dim+order-2, order-2);
48 static constexpr unsigned int faceDofs =
binomial(dim+order-2, order-1);
56 inline static auto legendre(
unsigned int i,
const DomainFieldType& x )
68 return 20*x*x*x-30*x*x+12*x-1;
70 return ((2*i-1)*(2*x-1)*legendre(x,i-1) - (i-1)*legendre(x,i-2)) / i;
84 constexpr inline static auto unrank (std::size_t i)
85 -> std::array<std::size_t, d>
89 std::array<std::size_t, d> mi{};
93 std::size_t k = 0, b = 1;
94 for(;k <= kMax && b <= i; ++k, b =
binomial(d+k-1, k))
98 for(; p < d && i > 0; ++p)
100 std::size_t m = 0, c = 1;
101 for(; m <= k && c <= i; ++m, c =
binomial(d-p+m-2, m))
118 inline static auto embed (
unsigned int face,
const FaceDomainType& x )
124 for (
auto i : range(dim))
137 std::fill(sign_.begin(), sign_.end(), 1.0);
147 for (
auto i : range(numFaces))
149 sign_[i] = s[i] ? -1 : 1;
150 normal_[i][i/2] = i%2 ? 1 : -1;
163 template<
class F,
class C>
166 out.resize(numFaces*faceDofs + interiorDofs);
167 std::fill(out.begin(),out.end(), 0.0);
169 auto&& f = Impl::makeFunctionWithCallOperator<DomainType>(ff);
171 for(
auto i : range(numFaces))
188 template<
class F,
class C>
189 void trace (
unsigned int face,
const F& f, C& out)
const
191 assert(out.size() >= numFaces*faceDofs + interiorDofs);
192 assert(face < numFaces);
194 const auto o = face*faceDofs;
195 const auto& n = normal_[face];
196 const auto& s = sign_[face];
197 const auto& c = n[face/2];
200 for (
const auto& qp : rule)
202 const auto& x = qp.position();
203 auto y = f(embed(face, x));
205 for (
auto i : range(faceDofs))
207 auto mi = unrank<dim-1,order-1>(i);
209 RangeFieldType phi = 1.;
210 for (
auto j : range(dim-1))
211 phi *= legendre(mi[j], x[j]);
213 out[o+i] += (y*n) * phi * qp.weight() * (i%2 ? c : s);
227 template<
class F,
class C>
230 assert(out.size() >= numFaces*faceDofs + interiorDofs);
232 const auto o = numFaces*faceDofs;
235 for(
const auto& qp : rule)
237 const auto& x = qp.position();
240 for (
auto i : range(interiorDofs/dim))
242 auto mi = unrank<dim,order-2>(i);
244 RangeFieldType phi = 1.;
245 for (
auto j : range(dim))
246 phi *= legendre(mi[j], x[j]);
248 for (
auto j : range(dim))
249 out[o+dim*i+j] += y[j]* phi * qp.weight();
255 std::array<RangeFieldType, numFaces> sign_;
256 std::array<DomainType, numFaces> normal_;
260 template<
class D,
class R,
unsigned int dim,
unsigned int order>
261 constexpr std::size_t BDFMCubeLocalInterpolation<D, R, dim, order>::numFaces;
263 template<
class D,
class R,
unsigned int dim,
unsigned int order>
264 constexpr unsigned int BDFMCubeLocalInterpolation<D, R, dim, order>::interiorDofs;
266 template<
class D,
class R,
unsigned int dim,
unsigned int order>
267 constexpr unsigned int BDFMCubeLocalInterpolation<D, R, dim, order>::faceDofs;
271 template<
class D,
class R,
unsigned int dim>
272 class BDFMCubeLocalInterpolation<D, R, dim, 0>
274 static_assert(AlwaysFalse<D>::value,
275 "`BDFMCubeLocalCoefficients` not defined for order 0.");
Interpolation for Brezzi-Douglas-Fortin-Marini shape functions on cubes.
Definition: localinterpolation.hh:38
void interpolate(const F &ff, C &out) const
Interpolate a given function with shape functions.
Definition: localinterpolation.hh:164
BDFMCubeLocalInterpolation(std::bitset< numFaces > s)
Make set number s, where 0 <= s < 2^(2*dim)
Definition: localinterpolation.hh:145
BDFMCubeLocalInterpolation()
Standard constructor.
Definition: localinterpolation.hh:135
void trace(unsigned int face, const F &f, C &out) const
Interpolate a given function with shape functions on a face of the reference element.
Definition: localinterpolation.hh:189
void interior(const F &f, C &out) const
Interpolate a given function with shape functions in the interior of the reference element.
Definition: localinterpolation.hh:228
static const QuadratureRule & rule(const GeometryType &t, int p, QuadratureType::Enum qt=QuadratureType::GaussLegendre)
select the appropriate QuadratureRule for GeometryType t and order p
Definition: quadraturerules.hh:266
Traits for type conversions and type information.
Implements a vector constructed from a given type representing a field and a compile-time given size.
constexpr GeometryType cube(unsigned int dim)
Returns a GeometryType representing a hypercube of dimension dim.
Definition: type.hh:472
auto max(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::max()
Definition: defaults.hh:81
Some useful basic math stuff.
Dune namespace.
Definition: alignedallocator.hh:13
static constexpr T binomial(const T &n, const T &k) noexcept
calculate the binomial coefficient n over k as a constexpr
Definition: math.hh:131
Utilities for reduction like operations on ranges.