Dune-Functions 2.11
Loading...
Searching...
No Matches
transformedfiniteelementmixin.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// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
5// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
6
7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDFINITEELEMENTMIXIN_HH
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDFINITEELEMENTMIXIN_HH
9
10#include <array>
11#include <type_traits>
12#include <utility>
13#include <vector>
14
15namespace Dune::Functions::Impl {
16
24template<class FEImplementation, class ReferenceLocalBasisTraits>
25class TransformedLocalBasis
26{
27 public:
28 using Traits = ReferenceLocalBasisTraits;
29
30 TransformedLocalBasis(FEImplementation const& feImpl)
31 : feImpl_(&feImpl)
32 {}
33
34 public:
39 auto size() const
40 {
41 return feImpl_->size();
42 }
43
45 void evaluateFunction(const typename Traits::DomainType &x,
46 std::vector<typename Traits::RangeType> &out) const
47 {
48 feImpl_->referenceLocalBasis().evaluateFunction(x, rangeBuffer_);
49 out.resize(size());
50 feImpl_->transform(rangeBuffer_, out);
51 }
52
59 void evaluateJacobian(const typename Traits::DomainType &x,
60 std::vector<typename Traits::JacobianType> &out) const
61 {
62 feImpl_->referenceLocalBasis().evaluateJacobian(x, jacobianBuffer_);
63 out.resize(size());
64 feImpl_->transform(jacobianBuffer_, out);
65 }
66
77 template<class TT,
78 std::enable_if_t<std::is_same_v<TT, typename Traits::HessianType>, int> = 0>
79 void evaluateHessian(const typename Traits::DomainType &x,
80 std::vector<TT> &out) const
81 {
82 feImpl_->referenceLocalBasis().evaluateHessian(x, hessianBuffer_);
83 out.resize(size());
84 feImpl_->transform(hessianBuffer_, out);
85 }
86
94 void partial(std::array<unsigned int, Traits::dimDomain> const &order,
95 const typename Traits::DomainType &x,
96 std::vector<typename Traits::RangeType> &out) const
97 {
98 feImpl_->referenceLocalBasis().partial(order, x, rangeBuffer_);
99 out.resize(size());
100 feImpl_->transform(rangeBuffer_, out);
101 }
102
104 auto order() const { return feImpl_->referenceLocalBasis().order(); }
105
106 private:
107 FEImplementation const* feImpl_;
108 mutable std::vector<typename Traits::RangeType> rangeBuffer_;
109 mutable std::vector<typename Traits::JacobianType> jacobianBuffer_;
110 mutable std::vector<typename Traits::HessianType> hessianBuffer_;
111};
112
113
114
146template<class FEImplementation, class ReferenceLocalBasisTraits>
147class TransformedFiniteElementMixin
148{
149 public:
150 TransformedFiniteElementMixin()
151 : tlb_(this->asImpl())
152 {}
153
154 TransformedFiniteElementMixin(TransformedFiniteElementMixin const& other)
155 : TransformedFiniteElementMixin()
156 {}
157
158 const FEImplementation& asImpl() const
159 {
160 return *(static_cast<FEImplementation const*>(this));
161 }
162
163 auto const& localBasis() const
164 {
165 return tlb_;
166 }
167
168 protected:
169 TransformedLocalBasis<FEImplementation, ReferenceLocalBasisTraits> tlb_;
170};
171
172} // end namespace Dune::Functions::Impl
173
174#endif