version 0.4.1
assemblermanipulatorfuser.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2025 The Ikarus Developers mueller@ibb.uni-stuttgart.de
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
9#pragma once
11
12namespace Ikarus {
13
14namespace Impl {
15 template <template <typename, typename, typename, typename> typename AInterface,
16 template <typename Wrapper, typename Assembler> typename AImplementation>
17 struct AssemblerInterfaceHelper
18 {
19 template <typename WA, typename A, typename ReturnValueType>
20 using Interface = AInterface<WA, typename A::FEContainer, typename A::DirichletValuesType, ReturnValueType>;
21 template <typename WA, typename A>
22 using Implementation = AImplementation<WA, A>;
23 };
24
25} // namespace Impl
35template <Concepts::FlatAssembler A, typename... Ass>
37
38#define BASECLASSMEMBERFUNCTION(func, A) \
39 template <typename... Args> \
40 decltype(auto) base_##func(Args... args) { \
41 return A::func(std::forward<Args>(args)...); \
42 }
43
52template <Concepts::FlatAssembler A, typename ScalarAss>
53class AssemblerManipulator<A, ScalarAss>
54 : public ScalarAss::template Interface<AssemblerManipulator<A, ScalarAss>, A, typename A::ScalarType>,
55 public ScalarAss::template Implementation<AssemblerManipulator<A, ScalarAss>, A>,
56 private A
57{
58public:
60
61protected:
62 using ScalarAssemblerImpl = ScalarAss::template Implementation<AssemblerManipulator, WrappedAssembler>;
63 using ScalarAssemblerInterface = ScalarAss::template Interface<AssemblerManipulator, A, typename A::ScalarType>;
64
67
68public:
69 // typdefs from FlatAssemblerBase
70 using typename WrappedAssembler::AffordanceCollectionType;
71 using typename WrappedAssembler::Basis;
72 using typename WrappedAssembler::DirichletValuesType;
73 using typename WrappedAssembler::FEContainer;
74 using typename WrappedAssembler::FERequirement;
75 using typename WrappedAssembler::ScalarType;
76 using typename WrappedAssembler::SizeType;
77
78 // functions from FlatAssemblerBase
79 using WrappedAssembler::bind;
80 using WrappedAssembler::bound;
81 using WrappedAssembler::boundToAffordanceCollection;
82 using WrappedAssembler::boundToDBCOption;
83 using WrappedAssembler::boundToRequirement;
84 using WrappedAssembler::createFullVector;
85
86 using WrappedAssembler::affordanceCollection;
87 using WrappedAssembler::constraintsBelow;
88 using WrappedAssembler::dBCOption;
89 using WrappedAssembler::estimateOfConnectivity;
90 using WrappedAssembler::finiteElements;
91 using WrappedAssembler::gridView;
92 using WrappedAssembler::isConstrained;
93 using WrappedAssembler::reducedSize;
94 using WrappedAssembler::requirement;
95 using WrappedAssembler::size;
96
97 // functions from implementations
98 using ScalarAssemblerImpl::bind;
99
100private:
101 using ScalarAssemblerImpl::getScalarImpl;
102
103public:
104 // functions from interfaces of the new manipulator assembler
105 using ScalarAssemblerInterface::scalar;
106
108 std::tuple<typename ScalarAss::template Implementation<AssemblerManipulator<A, ScalarAss>, A>::FunctionType>;
109
116 template <typename... Args>
117 requires(not std::is_same_v<std::remove_cvref_t<std::tuple_element_t<0, std::tuple<Args...>>>, AssemblerManipulator>)
118 explicit AssemblerManipulator(Args&&... args)
119 : WrappedAssembler(std::forward<Args>(args)...) {}
120
121private:
122 BASECLASSMEMBERFUNCTION(getScalarImpl, A)
123
124 A& base() { return *this; }
125 const A& base() const { return *this; }
126};
127
137template <Concepts::FlatAssembler A, typename ScalarAss, typename VectorAss>
138class AssemblerManipulator<A, ScalarAss, VectorAss>
139 : public ScalarAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss>, A, typename A::ScalarType>,
140 public ScalarAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss>, A>,
141 public VectorAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss>, A, typename A::VectorType>,
142 public VectorAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss>, A>,
143 private A
144{
145public:
147
148protected:
149 using ScalarAssemblerImpl = ScalarAss::template Implementation<AssemblerManipulator, WrappedAssembler>;
150 using VectorAssemblerImpl = VectorAss::template Implementation<AssemblerManipulator, WrappedAssembler>;
151 using ScalarAssemblerInterface = ScalarAss::template Interface<AssemblerManipulator, A, typename A::ScalarType>;
152 using VectorAssemblerInterface = VectorAss::template Interface<AssemblerManipulator, A, typename A::VectorType>;
153
158
159public:
160 // typdefs from FlatAssemblerBase
161 using typename WrappedAssembler::AffordanceCollectionType;
162 using typename WrappedAssembler::Basis;
163 using typename WrappedAssembler::DirichletValuesType;
164 using typename WrappedAssembler::FEContainer;
165 using typename WrappedAssembler::FERequirement;
166 using typename WrappedAssembler::ScalarType;
167 using typename WrappedAssembler::SizeType;
168 using typename WrappedAssembler::VectorType;
169
170 // functions from FlatAssemblerBase
171 using WrappedAssembler::bind;
172 using WrappedAssembler::bound;
173 using WrappedAssembler::boundToAffordanceCollection;
174 using WrappedAssembler::boundToDBCOption;
175 using WrappedAssembler::boundToRequirement;
176 using WrappedAssembler::createFullVector;
177
178 using WrappedAssembler::affordanceCollection;
179 using WrappedAssembler::constraintsBelow;
180 using WrappedAssembler::dBCOption;
181 using WrappedAssembler::estimateOfConnectivity;
182 using WrappedAssembler::finiteElements;
183 using WrappedAssembler::gridView;
184 using WrappedAssembler::isConstrained;
185 using WrappedAssembler::reducedSize;
186 using WrappedAssembler::requirement;
187 using WrappedAssembler::size;
188
189 // functions from implementations
190 using ScalarAssemblerImpl::bind;
191 using VectorAssemblerImpl::bind;
192
193private:
194 using ScalarAssemblerImpl::getScalarImpl;
195 using VectorAssemblerImpl::getRawVectorImpl;
196 using VectorAssemblerImpl::getReducedVectorImpl;
197 using VectorAssemblerImpl::getVectorImpl;
198
199public:
200 // functions from interfaces of the new manipulator assembler
201 using ScalarAssemblerInterface::scalar;
202 using VectorAssemblerInterface::vector;
203
205 std::tuple<typename ScalarAssemblerImpl::FunctionType, typename VectorAssemblerImpl::FunctionType>;
206
213 template <typename... Args>
214 requires(not std::is_same_v<std::remove_cvref_t<std::tuple_element_t<0, std::tuple<Args...>>>, AssemblerManipulator>)
215 explicit AssemblerManipulator(Args&&... args)
216 : WrappedAssembler(std::forward<Args>(args)...) {}
217
218private:
219 BASECLASSMEMBERFUNCTION(getScalarImpl, WrappedAssembler)
220 BASECLASSMEMBERFUNCTION(getRawVectorImpl, WrappedAssembler)
221 BASECLASSMEMBERFUNCTION(getReducedVectorImpl, WrappedAssembler)
222 BASECLASSMEMBERFUNCTION(getVectorImpl, WrappedAssembler)
223
224 WrappedAssembler& base() { return *this; }
225 const WrappedAssembler& base() const { return *this; }
226};
227
238template <Concepts::FlatAssembler A, typename ScalarAss, typename VectorAss, typename MatrixAss>
239class AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>
240 : public ScalarAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A,
241 typename A::ScalarType>,
242 public ScalarAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A>,
243 public VectorAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A,
244 typename A::VectorType>,
245 public VectorAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A>,
246 public MatrixAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A,
247 typename A::MatrixType>,
248 public MatrixAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A>,
249 private A
250{
251public:
253
254protected:
255 using ScalarAssemblerImpl = ScalarAss::template Implementation<AssemblerManipulator, A>;
256 using VectorAssemblerImpl = VectorAss::template Implementation<AssemblerManipulator, A>;
257 using MatrixAssemblerImpl = MatrixAss::template Implementation<AssemblerManipulator, A>;
258 using ScalarAssemblerInterface = ScalarAss::template Interface<AssemblerManipulator, A, typename A::ScalarType>;
259 using VectorAssemblerInterface = VectorAss::template Interface<AssemblerManipulator, A, typename A::VectorType>;
260 using MatrixAssemblerInterface = MatrixAss::template Interface<AssemblerManipulator, A, typename A::MatrixType>;
261
268
269public:
270 // typdefs from FlatAssemblerBase
271 using typename WrappedAssembler::AffordanceCollectionType;
272 using typename WrappedAssembler::Basis;
273 using typename WrappedAssembler::DirichletValuesType;
274 using typename WrappedAssembler::FEContainer;
275 using typename WrappedAssembler::FERequirement;
276 using typename WrappedAssembler::MatrixType;
277 using typename WrappedAssembler::ScalarType;
278 using typename WrappedAssembler::SizeType;
279 using typename WrappedAssembler::VectorType;
280
281 // functions from FlatAssemblerBase
282 using WrappedAssembler::bind;
283 using WrappedAssembler::bound;
284 using WrappedAssembler::boundToAffordanceCollection;
285 using WrappedAssembler::boundToDBCOption;
286 using WrappedAssembler::boundToRequirement;
287 using WrappedAssembler::createFullVector;
288
289 using WrappedAssembler::affordanceCollection;
290 using WrappedAssembler::constraintsBelow;
291 using WrappedAssembler::dBCOption;
292 using WrappedAssembler::estimateOfConnectivity;
293 using WrappedAssembler::finiteElements;
294 using WrappedAssembler::gridView;
295 using WrappedAssembler::isConstrained;
296 using WrappedAssembler::reducedSize;
297 using WrappedAssembler::requirement;
298 using WrappedAssembler::size;
299
300 // functions from implementations
301 using MatrixAssemblerImpl::bind;
302 using ScalarAssemblerImpl::bind;
303 using VectorAssemblerImpl::bind;
304
305private:
306 using MatrixAssemblerImpl::getMatrixImpl;
307 using MatrixAssemblerImpl::getRawMatrixImpl;
308 using MatrixAssemblerImpl::getReducedMatrixImpl;
309 using ScalarAssemblerImpl::getScalarImpl;
310 using VectorAssemblerImpl::getRawVectorImpl;
311 using VectorAssemblerImpl::getReducedVectorImpl;
312 using VectorAssemblerImpl::getVectorImpl;
313
314public:
315 // functions from interfaces of the new manipulator assembler
316 using MatrixAssemblerInterface::matrix;
317 using ScalarAssemblerInterface::scalar;
318 using VectorAssemblerInterface::vector;
319
321 std::tuple<typename ScalarAssemblerImpl::FunctionType, typename VectorAssemblerImpl::FunctionType,
322 typename MatrixAssemblerImpl::FunctionType>;
323
330 template <typename... Args>
331 requires(not std::is_same_v<std::remove_cvref_t<std::tuple_element_t<0, std::tuple<Args...>>>, AssemblerManipulator>)
332 explicit AssemblerManipulator(Args&&... args)
333 : WrappedAssembler(std::forward<Args>(args)...) {}
334
335private:
336 BASECLASSMEMBERFUNCTION(getScalarImpl, A)
337 BASECLASSMEMBERFUNCTION(getRawVectorImpl, A)
338 BASECLASSMEMBERFUNCTION(getReducedVectorImpl, A)
339 BASECLASSMEMBERFUNCTION(getVectorImpl, A)
340 BASECLASSMEMBERFUNCTION(getRawMatrixImpl, A)
341
342 BASECLASSMEMBERFUNCTION(getReducedMatrixImpl, A)
343
344 BASECLASSMEMBERFUNCTION(getMatrixImpl, A)
345
346 A& base() { return *this; }
347 const A& base() const { return *this; }
348};
349
360template <typename A>
365 if constexpr (scal && vec && mat)
366 return std::make_shared<
367 AssemblerManipulator<std::remove_cvref_t<A>, Impl::AssemblerInterfaceHelper<ScalarAssembler, ScalarManipulator>,
368 Impl::AssemblerInterfaceHelper<VectorAssembler, VectorManipulator>,
369 Impl::AssemblerInterfaceHelper<MatrixAssembler, MatrixManipulator>>>(std::forward<A>(a));
370 else if constexpr (scal && vec)
371 return std::make_shared<
372 AssemblerManipulator<std::remove_cvref_t<A>, Impl::AssemblerInterfaceHelper<ScalarAssembler, ScalarManipulator>,
373 Impl::AssemblerInterfaceHelper<VectorAssembler, VectorManipulator>>>(std::forward<A>(a));
374 else if constexpr (scal)
375 return std::make_shared<AssemblerManipulator<std::remove_cvref_t<A>,
376 Impl::AssemblerInterfaceHelper<ScalarAssembler, ScalarManipulator>>>(
377 std::forward<A>(a));
378}
379} // namespace Ikarus
#define BASECLASSMEMBERFUNCTION(func, A)
Definition: assemblermanipulatorfuser.hh:38
Definition: assemblermanipulatorbuildingblocks.hh:22
auto makeAssemblerManipulator(A &&a)
Creates an AssemblerManipulator instance based on the type of the provided assembler.
Definition: assemblermanipulatorfuser.hh:361
The AssemblerManipulator defines a decorator for the assemblers that helps to manipulate the assemble...
Definition: assemblermanipulatorfuser.hh:36
ScalarAss::template Interface< AssemblerManipulator, A, typename A::ScalarType > ScalarAssemblerInterface
Definition: assemblermanipulatorfuser.hh:63
AssemblerManipulator(Args &&... args)
Constructor that forwards arguments to the base assembler.
Definition: assemblermanipulatorfuser.hh:118
std::tuple< typename ScalarAss::template Implementation< AssemblerManipulator< A, ScalarAss >, A >::FunctionType > CallBackTypes
Definition: assemblermanipulatorfuser.hh:108
friend ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:65
friend ScalarAssemblerInterface
Definition: assemblermanipulatorfuser.hh:66
ScalarAss::template Implementation< AssemblerManipulator, WrappedAssembler > ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:62
A WrappedAssembler
Definition: assemblermanipulatorfuser.hh:59
friend ScalarAssemblerInterface
Definition: assemblermanipulatorfuser.hh:156
friend ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:154
VectorAss::template Interface< AssemblerManipulator, A, typename A::VectorType > VectorAssemblerInterface
Definition: assemblermanipulatorfuser.hh:152
A WrappedAssembler
Definition: assemblermanipulatorfuser.hh:146
VectorAss::template Implementation< AssemblerManipulator, WrappedAssembler > VectorAssemblerImpl
Definition: assemblermanipulatorfuser.hh:150
std::tuple< typename ScalarAssemblerImpl::FunctionType, typename VectorAssemblerImpl::FunctionType > CallBackTypes
Definition: assemblermanipulatorfuser.hh:205
friend VectorAssemblerImpl
Definition: assemblermanipulatorfuser.hh:155
AssemblerManipulator(Args &&... args)
Constructor that forwards arguments to the base assembler.
Definition: assemblermanipulatorfuser.hh:215
ScalarAss::template Interface< AssemblerManipulator, A, typename A::ScalarType > ScalarAssemblerInterface
Definition: assemblermanipulatorfuser.hh:151
ScalarAss::template Implementation< AssemblerManipulator, WrappedAssembler > ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:149
friend VectorAssemblerInterface
Definition: assemblermanipulatorfuser.hh:157
std::tuple< typename ScalarAssemblerImpl::FunctionType, typename VectorAssemblerImpl::FunctionType, typename MatrixAssemblerImpl::FunctionType > CallBackTypes
Definition: assemblermanipulatorfuser.hh:322
ScalarAss::template Interface< AssemblerManipulator, A, typename A::ScalarType > ScalarAssemblerInterface
Definition: assemblermanipulatorfuser.hh:258
MatrixAss::template Implementation< AssemblerManipulator, A > MatrixAssemblerImpl
Definition: assemblermanipulatorfuser.hh:257
friend VectorAssemblerImpl
Definition: assemblermanipulatorfuser.hh:263
A WrappedAssembler
Definition: assemblermanipulatorfuser.hh:252
MatrixAss::template Interface< AssemblerManipulator, A, typename A::MatrixType > MatrixAssemblerInterface
Definition: assemblermanipulatorfuser.hh:260
VectorAss::template Interface< AssemblerManipulator, A, typename A::VectorType > VectorAssemblerInterface
Definition: assemblermanipulatorfuser.hh:259
friend VectorAssemblerInterface
Definition: assemblermanipulatorfuser.hh:267
friend ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:262
friend MatrixAssemblerInterface
Definition: assemblermanipulatorfuser.hh:265
friend MatrixAssemblerImpl
Definition: assemblermanipulatorfuser.hh:264
AssemblerManipulator(Args &&... args)
Constructor that forwards arguments to the base assembler.
Definition: assemblermanipulatorfuser.hh:332
ScalarAss::template Implementation< AssemblerManipulator, A > ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:255
VectorAss::template Implementation< AssemblerManipulator, A > VectorAssemblerImpl
Definition: assemblermanipulatorfuser.hh:256
friend ScalarAssemblerInterface
Definition: assemblermanipulatorfuser.hh:266
Concept representing the requirements for a ScalarFlatAssembler.A type T satisfies ScalarFlatAssemble...
Definition: utils/concepts.hh:538
Concept representing the requirements for a VectorFlatAssembler.A type T satisfies VectorFlatAssemble...
Definition: utils/concepts.hh:552
Concept representing the requirements for a MatrixFlatAssembler.A type T satisfies MatrixFlatAssemble...
Definition: utils/concepts.hh:569