Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
outsideoperator.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_OUTSIDEOPERATOR_HH
8#define DUNE_FUFEM_FORMS_OUTSIDEOPERATOR_HH
9
10#include <cstddef>
11#include <type_traits>
12#include <tuple>
13#include <utility>
14#include <functional>
15
19
23
24
25
26namespace Dune::Fufem::Forms::Impl {
27
28 template<class Operator, int arity = Operator::arity>
29 struct OutsideOperatorBaseTraits
30 {
31 using type = MultilinearOperator<arity>;
32 };
33
34 template<class Operator>
35 struct OutsideOperatorBaseTraits<Operator, 1>
36 {
37 using type = UnaryOperator<Operator::argIndex>;
38 };
39
40} // namespace Dune::Fufem::Forms::Impl
41
42
43
44namespace Dune::Fufem::Forms {
45
46
47
55 template<class BaseOperator>
57 : public Impl::OutsideOperatorBaseTraits<BaseOperator>::type
58 {
60 using BaseLocalOperator = decltype(localOperator(std::declval<BaseOperator>()));
61
62 static_assert(Base::arity <= 1, "Only unary and nullary outside operators can be constructed");
63
64 public:
65
66 using Element = typename BaseOperator::Element;
67 using Range = typename BaseOperator::Range;
68
69 OutsideOperator(const BaseOperator& baseOperator) :
70 baseOperator_(baseOperator)
71 {}
72
73 class LocalOperator : public BaseLocalOperator
74 {
75 using BaseTensor = decltype(std::declval<BaseLocalOperator>()(0));
76 public:
77
78 using Element = typename BaseLocalOperator::Element;
79 using Intersection = typename BaseLocalOperator::Intersection;
80 using CacheManager = typename BaseLocalOperator::CacheManager;
81 using Range = typename BaseLocalOperator::Range;
82
83 LocalOperator(BaseLocalOperator&& baseLocalOperator) :
84 BaseLocalOperator(std::move(baseLocalOperator))
85 {}
86
88 {
89 using namespace Impl::Tensor;
90 using namespace Dune::Indices;
91 auto y = BaseLocalOperator::operator()(index);
92 if constexpr (Base::arity == 0)
93 return y;
94 else if constexpr (Base::arity == 1)
95 return SparseTensor(y.rank(),
96 [&, y](auto&& f) {
97 sparseForEach(y, [&](const auto& y_i, auto i0, auto... i) {
98 f(y_i, _1, i...);
99 });
100 },
101 y.nnz(),
103 typename BaseLocalOperator::Range&&,
104 typename BaseLocalOperator::Range
105 >>{}
106 );
107 }
108
109 auto quadratureRuleKey() const
110 {
111 return BaseLocalOperator::quadratureRuleKey();
112 }
113
114 template<class... LV>
115 void registerLocalViews(const LV&... lvs)
116 {
117 BaseLocalOperator::registerOutsideLocalViews(lvs...);
118 }
119
120 template<class... LV>
121 void registerOutsideLocalViews(const LV&... lvs)
122 {
123 BaseLocalOperator::registerLocalViews(lvs...);
124 }
125
126 void registerCaches(CacheManager& cacheManager)
127 {
128 BaseLocalOperator::registerOutsideCaches(cacheManager);
129 }
130
132 {
133 BaseLocalOperator::registerCaches(cacheManager);
134 }
135
136 template<class Dummy=void>
137 void bind(const Element&)
138 {
139 static_assert(Dune::AlwaysFalse<Dummy>::value, "Outside operators can only be used for forms integrated over the skeleton");
140 }
141
142 void bind(const Intersection& intersection, const Element& element, const Element& otherElement)
143 {
144 BaseLocalOperator::bind(intersection, otherElement, element);
145 }
146
147 template<class Dummy=void>
148 void bindToCaches(CacheManager& cacheManager)
149 {
150 static_assert(Dune::AlwaysFalse<Dummy>::value, "Outside operators can only be used for forms integrated over the skeleton");
151 }
152
153 void bindToCaches(CacheManager& cacheManager, CacheManager& outsideCacheManager)
154 {
155 BaseLocalOperator::bindToCaches(outsideCacheManager, cacheManager);
156 }
157
158 };
159
160 friend LocalOperator localOperator(const OutsideOperator& outsideOperator)
161 {
162 return LocalOperator(localOperator(outsideOperator.baseOperator()));
163 }
164
165 auto basis() const
166 {
167 return baseOperator_.basis();
168 }
169
170 auto treePath() const
171 {
172 return baseOperator_.treePath();
173 }
174
175 const BaseOperator& baseOperator() const
176 {
177 return baseOperator_;
178 }
179
180 friend auto jacobian(const OutsideOperator& outsideOperator)
181 {
182 using BaseOperatorGradient = decltype(jacobian(outsideOperator.baseOperator()));
184 }
185
186 friend auto gradient(const OutsideOperator& outsideOperator)
187 {
188 using BaseOperatorGradient = decltype(gradient(outsideOperator.baseOperator()));
190 }
191
192 friend auto grad(const OutsideOperator& outsideOperator)
193 {
194 return gradient(outsideOperator);
195 }
196
197 friend auto divergence(const OutsideOperator& outsideOperator)
198 {
199 using BaseOperatorGradient = decltype(divergence(outsideOperator.baseOperator()));
201 }
202
203 friend auto div(const OutsideOperator& outsideOperator)
204 {
205 return divergence(outsideOperator);
206 }
207
208 friend auto curl(const OutsideOperator& outsideOperator)
209 {
210 using BaseOperatorGradient = decltype(curl(outsideOperator.baseOperator()));
212 }
213
214 friend auto rot(const OutsideOperator& outsideOperator)
215 {
216 return curl(outsideOperator);
217 }
218
219 private:
220 BaseOperator baseOperator_;
221 };
222
223
224
225} // namespace Dune::Fufem::Forms
226
227
228#endif // DUNE_FUFEM_FORMS_OUTSIDEOPERATOR_HH
std::ptrdiff_t index() const
STL namespace.
Definition baseclass.hh:22
Base class for multilinear operator implementations.
Definition baseclass.hh:73
Operator for switching to the outside entity.
Definition outsideoperator.hh:58
friend auto gradient(const OutsideOperator &outsideOperator)
Definition outsideoperator.hh:186
OutsideOperator(const BaseOperator &baseOperator)
Definition outsideoperator.hh:69
friend auto divergence(const OutsideOperator &outsideOperator)
Definition outsideoperator.hh:197
friend auto jacobian(const OutsideOperator &outsideOperator)
Definition outsideoperator.hh:180
friend auto curl(const OutsideOperator &outsideOperator)
Definition outsideoperator.hh:208
auto treePath() const
Definition outsideoperator.hh:170
const BaseOperator & baseOperator() const
Definition outsideoperator.hh:175
typename BaseOperator::Range Range
Definition outsideoperator.hh:67
friend LocalOperator localOperator(const OutsideOperator &outsideOperator)
Definition outsideoperator.hh:160
friend auto rot(const OutsideOperator &outsideOperator)
Definition outsideoperator.hh:214
auto basis() const
Definition outsideoperator.hh:165
typename BaseOperator::Element Element
Definition outsideoperator.hh:66
friend auto grad(const OutsideOperator &outsideOperator)
Definition outsideoperator.hh:192
friend auto div(const OutsideOperator &outsideOperator)
Definition outsideoperator.hh:203
void registerOutsideCaches(CacheManager &cacheManager)
Definition outsideoperator.hh:131
void registerCaches(CacheManager &cacheManager)
Definition outsideoperator.hh:126
void bind(const Intersection &intersection, const Element &element, const Element &otherElement)
Definition outsideoperator.hh:142
typename BaseLocalOperator::Range Range
Definition outsideoperator.hh:81
void bindToCaches(CacheManager &cacheManager)
Definition outsideoperator.hh:148
typename BaseLocalOperator::CacheManager CacheManager
Definition outsideoperator.hh:80
void registerOutsideLocalViews(const LV &... lvs)
Definition outsideoperator.hh:121
void registerLocalViews(const LV &... lvs)
Definition outsideoperator.hh:115
void bind(const Element &)
Definition outsideoperator.hh:137
typename BaseLocalOperator::Element Element
Definition outsideoperator.hh:78
LocalOperator(BaseLocalOperator &&baseLocalOperator)
Definition outsideoperator.hh:83
void bindToCaches(CacheManager &cacheManager, CacheManager &outsideCacheManager)
Definition outsideoperator.hh:153
auto operator()(std::size_t index) const
Definition outsideoperator.hh:87
auto quadratureRuleKey() const
Definition outsideoperator.hh:109
typename BaseLocalOperator::Intersection Intersection
Definition outsideoperator.hh:79
T forward(T... args)