Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
transformedoperator.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-FUFEM 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_FUFEM_FORMS_TRANSFORMEDOPERATOR_HH
8#define DUNE_FUFEM_FORMS_TRANSFORMEDOPERATOR_HH
9
10#include <cstddef>
11#include <type_traits>
12#include <tuple>
13#include <utility>
14#include <functional>
15
20
21
22
23namespace Dune::Fufem::Forms::Impl {
24
25 template<class Operator, int arity = Operator::arity>
26 struct TransformedOperatorBaseTraits
27 {
28 using type = MultilinearOperator<arity>;
29 };
30
31 template<class Operator>
32 struct TransformedOperatorBaseTraits<Operator, 1>
33 {
34 using type = UnaryOperator<Operator::argIndex>;
35 };
36
37} // namespace Dune::Fufem::Forms::Impl
38
39
40
41namespace Dune::Fufem::Forms {
42
43
44
53 template<class Op, class BaseOperator, class QuadratureHint=Dune::Fufem::Forms::QuadratureHints::KeepOrder>
55 : public Impl::TransformedOperatorBaseTraits<BaseOperator>::type
56 {
57 using Transformation = Op;
58 using BaseLocalOperator = decltype(localOperator(std::declval<BaseOperator>()));
59
60 public:
61
62 using Element = typename BaseOperator::Element;
64
65 TransformedOperator(const Transformation& transformation, const BaseOperator& baseOperator, QuadratureHint quadratureHint)
66 : baseOperator_(baseOperator)
67 , transformation_(transformation)
68 , quadratureHint_(quadratureHint)
69 {}
70
71 TransformedOperator(const Transformation& transformation, const BaseOperator& baseOperator)
73 : baseOperator_(baseOperator)
74 , transformation_(transformation)
75 , quadratureHint_()
76 {}
77
78 TransformedOperator(const BaseOperator& baseOperator)
80 : baseOperator_(baseOperator)
81 , transformation_()
82 , quadratureHint_()
83 {}
84
85
86 class LocalOperator : public BaseLocalOperator
87 {
88 public:
89
90 using Element = typename BaseLocalOperator::Element;
91 using Intersection = typename BaseLocalOperator::Intersection;
93
94 LocalOperator(const Transformation& transformation, BaseLocalOperator&& baseLocalOperator, QuadratureHint quadratureHint)
95 : BaseLocalOperator(std::move(baseLocalOperator))
96 , transformation_(transformation)
97 , quadratureHint_(quadratureHint)
98 {}
99
100 void bind(const Element& element)
101 {
102 BaseLocalOperator::bind(element);
103 quadratureRuleKey_ = quadratureHint_(BaseLocalOperator::quadratureRuleKey());
104 }
105
106 void bind(const Intersection& intersection, const Element& element, const Element& otherElement)
107 {
108 BaseLocalOperator::bind(intersection, element, otherElement);
109 quadratureRuleKey_ = quadratureHint_(BaseLocalOperator::quadratureRuleKey());
110 }
111
112 auto quadratureRuleKey() const
113 {
114 return quadratureRuleKey_;
115 }
116
118 {
119 return compose(std::cref(transformation_), BaseLocalOperator::operator()(index));
120 }
121
122 private:
123 Transformation transformation_;
124 QuadratureHint quadratureHint_;
125 QuadratureRuleKey quadratureRuleKey_;
126 };
127
128 friend LocalOperator localOperator(const TransformedOperator& transformedOperator)
129 {
130 return LocalOperator(
131 transformedOperator.transformation(),
132 localOperator(transformedOperator.baseOperator()),
133 transformedOperator.quadratureHint_
134 );
135 }
136
138 requires (TransformedOperator::arity==0)
139 {
140 return LocalFunctionAdaptor<LocalOperator>(localOperator(transformedOperator));
141 }
142
143 auto basis() const
144 {
145 return baseOperator_.basis();
146 }
147
148 auto treePath() const
149 {
150 return baseOperator_.treePath();
151 }
152
153 const BaseOperator& baseOperator() const
154 {
155 return baseOperator_;
156 }
157
158 const Transformation& transformation() const
159 {
160 return transformation_;
161 }
162
163 friend auto gradient(const TransformedOperator& f)
164 {
165 static constexpr auto dimension = Element::Geometry::Coordinate::dimension;
166 static_assert(dimension<4);
167
168 auto gradientTransformation = [transformation = f.transformation()](const auto& g) {
169 static_assert(dimension<=3, "The gradient of a transformed operator is not implemented for range dimensions > 3.");
170 if constexpr (dimension==1)
171 return std::array{transformation(g[0])};
172 else if constexpr (dimension==2)
173 return std::array{transformation(g[0]), transformation(g[1])};
174 else if constexpr (dimension==3)
175 return std::array{transformation(g[0]), transformation(g[1]), transformation(g[2])};
176 };
177 return compose(gradientTransformation, gradient(f.baseOperator()));
178 }
179
180 friend auto grad(const TransformedOperator& f)
181 {
182 return gradient(f);
183 }
184
186 template<std::size_t k>
187 auto rebindArgIndex() const
188 {
189 auto reboundBaseOperator = baseOperator_.template rebindArgIndex<k>();
190 using ReboundBaseOperator = decltype(reboundBaseOperator);
191 return TransformedOperator<Op, ReboundBaseOperator>(transformation_, reboundBaseOperator);
192 }
193
194 private:
195 BaseOperator baseOperator_;
196 Transformation transformation_;
197 QuadratureHint quadratureHint_;
198 };
199
200
201
202} // namespace Dune::Fufem::Forms
203
204
205#endif // DUNE_FUFEM_FORMS_TRANSFORMEDOPERATOR_HH
std::ptrdiff_t index() const
auto compose(const OuterOp &outerOp, const InnerOp &innerOp)
Generic composition of a multilinear operators with a pointwise outer operator.
Definition userfunctions.hh:483
STL namespace.
Definition baseclass.hh:22
static constexpr std::size_t arity
Definition baseclass.hh:75
Adaptor for turning a Fufem::Forms LocalOperator into a LocalFunction.
Definition localfunctionadaptor.hh:42
Pointwise transformation of a multilinear operator.
Definition transformedoperator.hh:56
TransformedOperator(const Transformation &transformation, const BaseOperator &baseOperator)
Definition transformedoperator.hh:71
auto rebindArgIndex() const
Get a copy of this operator bound to another argument.
Definition transformedoperator.hh:187
auto treePath() const
Definition transformedoperator.hh:148
const BaseOperator & baseOperator() const
Definition transformedoperator.hh:153
friend auto grad(const TransformedOperator &f)
Definition transformedoperator.hh:180
friend LocalFunctionAdaptor< LocalOperator > localFunction(const TransformedOperator &transformedOperator)
Definition transformedoperator.hh:137
decltype(std::declval< Op >()(std::declval< typename BaseOperator::Range >())) Range
Definition transformedoperator.hh:63
TransformedOperator(const BaseOperator &baseOperator)
Definition transformedoperator.hh:78
friend LocalOperator localOperator(const TransformedOperator &transformedOperator)
Definition transformedoperator.hh:128
TransformedOperator(const Transformation &transformation, const BaseOperator &baseOperator, QuadratureHint quadratureHint)
Definition transformedoperator.hh:65
const Transformation & transformation() const
Definition transformedoperator.hh:158
friend auto gradient(const TransformedOperator &f)
Definition transformedoperator.hh:163
auto basis() const
Definition transformedoperator.hh:143
typename BaseOperator::Element Element
Definition transformedoperator.hh:62
Definition transformedoperator.hh:87
typename BaseLocalOperator::Element Element
Definition transformedoperator.hh:90
void bind(const Element &element)
Definition transformedoperator.hh:100
void bind(const Intersection &intersection, const Element &element, const Element &otherElement)
Definition transformedoperator.hh:106
LocalOperator(const Transformation &transformation, BaseLocalOperator &&baseLocalOperator, QuadratureHint quadratureHint)
Definition transformedoperator.hh:94
typename BaseLocalOperator::Intersection Intersection
Definition transformedoperator.hh:91
typename TransformedOperator::Range Range
Definition transformedoperator.hh:92
auto operator()(std::size_t index) const
Definition transformedoperator.hh:117
auto quadratureRuleKey() const
Definition transformedoperator.hh:112
A token that specifies a quadrature rule.
Definition quadraturerulecache.hh:39
T forward(T... args)
T cref(T... args)