Dune-Fufem 2.11-git
Loading...
Searching...
No Matches
sumoperator.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_SUMOPERATOR_HH
8#define DUNE_FUFEM_FORMS_SUMOPERATOR_HH
9
10#include <cstddef>
11#include <type_traits>
12#include <tuple>
13#include <utility>
14
16
21
22
23
24namespace Dune::Fufem::Forms {
25
26
27
36 template<class Operator0, class... Operators>
38 {
39 static_assert(
40 std::is_invocable_v<LocalOperators::SumOp, typename Operator0::Range, typename Operators::Range...>,
41 "Trying do build sum of operators with non-interoperable ranges.");
42
43 public:
44 static constexpr std::size_t arity = Operator0::arity;
45
46 using Element = typename Operator0::Element;
47 using Range = std::invoke_result_t<LocalOperators::SumOp, typename Operator0::Range, typename Operators::Range...>;
48
49 SumOperator(Operator0 operator0, Operators... operators) :
50 operators_(operator0, operators...)
51 {}
52
54 {
55 public:
56
57 using Element = typename SumOperator::Element;
58 using Intersection = typename Operator0::LocalOperator::Intersection;
59 using CacheManager = typename Operator0::LocalOperator::CacheManager;
60 using Range = typename SumOperator::Range;
61
62 LocalOperator(const typename Operator0::LocalOperator& localOperator0, const typename Operators::LocalOperator&... localOperators) :
63 localOperators_(localOperator0, localOperators...)
64 {}
65
66 auto quadratureRuleKey() const
67 {
68 auto quadKey = QuadratureRuleKey();
69 Impl::forEachTupleEntry(localOperators_, [&](const auto& localOperator) {
70 quadKey = localOperator.quadratureRuleKey().sum(quadKey);
71 });
72 return quadKey;
73 }
74
75 void bind(const Element& element)
76 {
77 Impl::forEachTupleEntry(localOperators_, [&](auto& localOperator) {
78 localOperator.bind(element);
79 });
80 }
81
82 void bind(const Intersection& intersection, const Element& element, const Element& otherElement)
83 {
84 Impl::forEachTupleEntry(localOperators_, [&](auto& localOperator) {
85 localOperator.bind(intersection, element, otherElement);
86 });
87 }
88
89 void unbind()
90 {
91 Impl::forEachTupleEntry(localOperators_, [&](auto& localOperator) {
93 });
94 }
95
97 requires(arity==0)
98 {
99 Range y;
100 y = 0;
101 Impl::forEachTupleEntry(localOperators_, [&](auto& localOperator) {
103 });
104 return Impl::Tensor::RankZeroTensor(y);
105 }
106
107 template<class... LocalViews>
108 void registerLocalViews(const LocalViews&... localViews)
109 {
110 Impl::forEachTupleEntry(localOperators_, [&](auto& localOperator) {
111 localOperator.registerLocalViews(localViews...);
112 });
113 }
114
115 template<class... LocalViews>
116 void registerOutsideLocalViews(const LocalViews&... localViews)
117 {
118 Impl::forEachTupleEntry(localOperators_, [&](auto& localOperator) {
120 });
121 }
122
123 void registerCaches(CacheManager& cacheManager)
124 {
125 Impl::forEachTupleEntry(localOperators_, [&](auto& localOperator) {
126 localOperator.registerCaches(cacheManager);
127 });
128 }
129
131 {
132 Impl::forEachTupleEntry(localOperators_, [&](auto& localOperator) {
134 });
135 }
136
137 template<class... OutsideCacheManager>
138 void bindToCaches(CacheManager& cacheManager, OutsideCacheManager&... outsideCacheManager)
139 {
140 Impl::forEachTupleEntry(localOperators_, [&](auto& localOperator) {
141 localOperator.bindToCaches(cacheManager, outsideCacheManager...);
142 });
143 }
144
145 auto& operators()
146 {
147 return localOperators_;
148 }
149
150 const auto& operators() const
151 {
152 return localOperators_;
153 }
154
155 private:
156 std::tuple<typename Operator0::LocalOperator, typename Operators::LocalOperator...> localOperators_;
157 };
158
159 friend LocalOperator localOperator(const SumOperator& sumOperator)
160 {
161 return std::apply([&](const auto&... op) {
162 return LocalOperator(localOperator(op)...);
163 }, sumOperator.operators());
164 }
165
166 template<bool dummy=true, std::enable_if_t<dummy and (SumOperator::arity==0), int> = 0>
171
172 auto& operators()
173 {
174 return operators_;
175 }
176
177 const auto& operators() const
178 {
179 return operators_;
180 }
181
182 auto basis() const
183 {
184 return std::get<0>(operators_).basis();
185 }
186
187 private:
188 std::tuple<Operator0, Operators...> operators_;
189 };
190
191
192
193} // namespace Dune::Fufem::Forms
194
195
196#endif // DUNE_FUFEM_FORMS_SUMOPERATOR_HH
std::ptrdiff_t index() const
Definition baseclass.hh:22
Sum of several multilinear operators.
Definition sumoperator.hh:38
SumOperator(Operator0 operator0, Operators... operators)
Definition sumoperator.hh:49
const auto & operators() const
Definition sumoperator.hh:177
typename Operator0::Element Element
Definition sumoperator.hh:46
friend LocalOperator localOperator(const SumOperator &sumOperator)
Definition sumoperator.hh:159
auto basis() const
Definition sumoperator.hh:182
auto & operators()
Definition sumoperator.hh:172
static constexpr std::size_t arity
Definition sumoperator.hh:44
std::invoke_result_t< LocalOperators::SumOp, typename Operator0::Range, typename Operators::Range... > Range
Definition sumoperator.hh:47
friend LocalFunctionAdaptor< LocalOperator > localFunction(const SumOperator &sumOperator)
Definition sumoperator.hh:167
Adaptor for turning a Fufem::Forms LocalOperator into a LocalFunction.
Definition localfunctionadaptor.hh:42
Definition localoperators.hh:36
static void addTo(K1 &x, const K2 &y)
Definition localoperators.hh:40
typename SumOperator::Range Range
Definition sumoperator.hh:60
void bind(const Element &element)
Definition sumoperator.hh:75
void registerOutsideCaches(CacheManager &cacheManager)
Definition sumoperator.hh:130
typename Operator0::LocalOperator::CacheManager CacheManager
Definition sumoperator.hh:59
void registerLocalViews(const LocalViews &... localViews)
Definition sumoperator.hh:108
LocalOperator(const typename Operator0::LocalOperator &localOperator0, const typename Operators::LocalOperator &... localOperators)
Definition sumoperator.hh:62
void bindToCaches(CacheManager &cacheManager, OutsideCacheManager &... outsideCacheManager)
Definition sumoperator.hh:138
auto & operators()
Definition sumoperator.hh:145
typename Operator0::LocalOperator::Intersection Intersection
Definition sumoperator.hh:58
typename SumOperator::Element Element
Definition sumoperator.hh:57
auto operator()(std::size_t index) const
Definition sumoperator.hh:96
auto quadratureRuleKey() const
Definition sumoperator.hh:66
void unbind()
Definition sumoperator.hh:89
const auto & operators() const
Definition sumoperator.hh:150
void registerOutsideLocalViews(const LocalViews &... localViews)
Definition sumoperator.hh:116
void registerCaches(CacheManager &cacheManager)
Definition sumoperator.hh:123
void bind(const Intersection &intersection, const Element &element, const Element &otherElement)
Definition sumoperator.hh:82
A token that specifies a quadrature rule.
Definition quadraturerulecache.hh:39
T apply(T... args)
T forward(T... args)
T is_invocable_v