version 0.4.4
assemblermanipulatorfuser.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2025 The Ikarus Developers ikarus@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 using WrappedAssembler::createReducedVector;
87
88 using WrappedAssembler::affordanceCollection;
89 using WrappedAssembler::constraintsBelow;
90 using WrappedAssembler::dBCOption;
91 using WrappedAssembler::estimateOfConnectivity;
92 using WrappedAssembler::finiteElements;
93 using WrappedAssembler::gridView;
94 using WrappedAssembler::isConstrained;
95 using WrappedAssembler::reducedSize;
96 using WrappedAssembler::requirement;
97 using WrappedAssembler::size;
98
99 // functions from implementations
100 using ScalarAssemblerImpl::bind;
101
102private:
103 using ScalarAssemblerImpl::getScalarImpl;
104
105public:
106 // functions from interfaces of the new manipulator assembler
107 using ScalarAssemblerInterface::scalar;
108
110 std::tuple<typename ScalarAss::template Implementation<AssemblerManipulator<A, ScalarAss>, A>::FunctionType>;
111
118 template <typename... Args>
119 requires(not std::is_same_v<std::remove_cvref_t<std::tuple_element_t<0, std::tuple<Args...>>>, AssemblerManipulator>)
120 explicit AssemblerManipulator(Args&&... args)
121 : WrappedAssembler(std::forward<Args>(args)...) {}
122
123private:
124 BASECLASSMEMBERFUNCTION(getScalarImpl, A)
125
126 A& base() { return *this; }
127 const A& base() const { return *this; }
128};
129
139template <Concepts::FlatAssembler A, typename ScalarAss, typename VectorAss>
140class AssemblerManipulator<A, ScalarAss, VectorAss>
141 : public ScalarAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss>, A, typename A::ScalarType>,
142 public ScalarAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss>, A>,
143 public VectorAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss>, A, typename A::VectorType>,
144 public VectorAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss>, A>,
145 private A
146{
147public:
149
150protected:
151 using ScalarAssemblerImpl = ScalarAss::template Implementation<AssemblerManipulator, WrappedAssembler>;
152 using VectorAssemblerImpl = VectorAss::template Implementation<AssemblerManipulator, WrappedAssembler>;
153 using ScalarAssemblerInterface = ScalarAss::template Interface<AssemblerManipulator, A, typename A::ScalarType>;
154 using VectorAssemblerInterface = VectorAss::template Interface<AssemblerManipulator, A, typename A::VectorType>;
155
160
161public:
162 // typdefs from FlatAssemblerBase
163 using typename WrappedAssembler::AffordanceCollectionType;
164 using typename WrappedAssembler::Basis;
165 using typename WrappedAssembler::DirichletValuesType;
166 using typename WrappedAssembler::FEContainer;
167 using typename WrappedAssembler::FERequirement;
168 using typename WrappedAssembler::ScalarType;
169 using typename WrappedAssembler::SizeType;
170 using typename WrappedAssembler::VectorType;
171
172 // functions from FlatAssemblerBase
173 using WrappedAssembler::bind;
174 using WrappedAssembler::bound;
175 using WrappedAssembler::boundToAffordanceCollection;
176 using WrappedAssembler::boundToDBCOption;
177 using WrappedAssembler::boundToRequirement;
178 using WrappedAssembler::createFullVector;
179 using WrappedAssembler::createReducedVector;
181
182 using WrappedAssembler::affordanceCollection;
183 using WrappedAssembler::constraintsBelow;
184 using WrappedAssembler::dBCOption;
185 using WrappedAssembler::estimateOfConnectivity;
186 using WrappedAssembler::finiteElements;
187 using WrappedAssembler::gridView;
188 using WrappedAssembler::isConstrained;
189 using WrappedAssembler::reducedSize;
190 using WrappedAssembler::requirement;
191 using WrappedAssembler::size;
192
193 // functions from implementations
194 using ScalarAssemblerImpl::bind;
195 using VectorAssemblerImpl::bind;
196
197private:
198 using ScalarAssemblerImpl::getScalarImpl;
199 using VectorAssemblerImpl::getRawVectorImpl;
200 using VectorAssemblerImpl::getReducedVectorImpl;
201 using VectorAssemblerImpl::getVectorImpl;
202
203public:
204 // functions from interfaces of the new manipulator assembler
205 using ScalarAssemblerInterface::scalar;
206 using VectorAssemblerInterface::vector;
207
209 std::tuple<typename ScalarAssemblerImpl::FunctionType, typename VectorAssemblerImpl::FunctionType>;
210
217 template <typename... Args>
218 requires(not std::is_same_v<std::remove_cvref_t<std::tuple_element_t<0, std::tuple<Args...>>>, AssemblerManipulator>)
219 explicit AssemblerManipulator(Args&&... args)
220 : WrappedAssembler(std::forward<Args>(args)...) {}
221
222private:
223 BASECLASSMEMBERFUNCTION(getScalarImpl, WrappedAssembler)
224 BASECLASSMEMBERFUNCTION(getRawVectorImpl, WrappedAssembler)
225 BASECLASSMEMBERFUNCTION(getReducedVectorImpl, WrappedAssembler)
226 BASECLASSMEMBERFUNCTION(getVectorImpl, WrappedAssembler)
227
228 WrappedAssembler& base() { return *this; }
229 const WrappedAssembler& base() const { return *this; }
230};
231
242template <Concepts::FlatAssembler A, typename ScalarAss, typename VectorAss, typename MatrixAss>
243class AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>
244 : public ScalarAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A,
245 typename A::ScalarType>,
246 public ScalarAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A>,
247 public VectorAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A,
248 typename A::VectorType>,
249 public VectorAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A>,
250 public MatrixAss::template Interface<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A,
251 typename A::MatrixType>,
252 public MatrixAss::template Implementation<AssemblerManipulator<A, ScalarAss, VectorAss, MatrixAss>, A>,
253 private A
254{
255public:
257
258protected:
259 using ScalarAssemblerImpl = ScalarAss::template Implementation<AssemblerManipulator, A>;
260 using VectorAssemblerImpl = VectorAss::template Implementation<AssemblerManipulator, A>;
261 using MatrixAssemblerImpl = MatrixAss::template Implementation<AssemblerManipulator, A>;
262 using ScalarAssemblerInterface = ScalarAss::template Interface<AssemblerManipulator, A, typename A::ScalarType>;
263 using VectorAssemblerInterface = VectorAss::template Interface<AssemblerManipulator, A, typename A::VectorType>;
264 using MatrixAssemblerInterface = MatrixAss::template Interface<AssemblerManipulator, A, typename A::MatrixType>;
265
272
273public:
274 // typdefs from FlatAssemblerBase
275 using typename WrappedAssembler::AffordanceCollectionType;
276 using typename WrappedAssembler::Basis;
277 using typename WrappedAssembler::DirichletValuesType;
278 using typename WrappedAssembler::FEContainer;
279 using typename WrappedAssembler::FERequirement;
280 using typename WrappedAssembler::MatrixType;
281 using typename WrappedAssembler::ScalarType;
282 using typename WrappedAssembler::SizeType;
283 using typename WrappedAssembler::VectorType;
284
285 // functions from FlatAssemblerBase
286 using WrappedAssembler::bind;
287 using WrappedAssembler::bound;
288 using WrappedAssembler::boundToAffordanceCollection;
289 using WrappedAssembler::boundToDBCOption;
290 using WrappedAssembler::boundToRequirement;
291 using WrappedAssembler::createFullVector;
292 using WrappedAssembler::createReducedVector;
294
295 using WrappedAssembler::affordanceCollection;
296 using WrappedAssembler::constraintsBelow;
297 using WrappedAssembler::dBCOption;
298 using WrappedAssembler::estimateOfConnectivity;
299 using WrappedAssembler::finiteElements;
300 using WrappedAssembler::gridView;
301 using WrappedAssembler::isConstrained;
302 using WrappedAssembler::reducedSize;
303 using WrappedAssembler::requirement;
304 using WrappedAssembler::size;
305
306 // functions from implementations
307 using MatrixAssemblerImpl::bind;
308 using ScalarAssemblerImpl::bind;
309 using VectorAssemblerImpl::bind;
310
311private:
312 using MatrixAssemblerImpl::getMatrixImpl;
313 using MatrixAssemblerImpl::getRawMatrixImpl;
314 using MatrixAssemblerImpl::getReducedMatrixImpl;
315 using ScalarAssemblerImpl::getScalarImpl;
316 using VectorAssemblerImpl::getRawVectorImpl;
317 using VectorAssemblerImpl::getReducedVectorImpl;
318 using VectorAssemblerImpl::getVectorImpl;
319
320public:
321 // functions from interfaces of the new manipulator assembler
322 using MatrixAssemblerInterface::matrix;
323 using ScalarAssemblerInterface::scalar;
324 using VectorAssemblerInterface::vector;
325
327 std::tuple<typename ScalarAssemblerImpl::FunctionType, typename VectorAssemblerImpl::FunctionType,
328 typename MatrixAssemblerImpl::FunctionType>;
329
336 template <typename... Args>
337 requires(not std::is_same_v<std::remove_cvref_t<std::tuple_element_t<0, std::tuple<Args...>>>, AssemblerManipulator>)
338 explicit AssemblerManipulator(Args&&... args)
339 : WrappedAssembler(std::forward<Args>(args)...) {}
340
341private:
342 BASECLASSMEMBERFUNCTION(getScalarImpl, A)
343 BASECLASSMEMBERFUNCTION(getRawVectorImpl, A)
344 BASECLASSMEMBERFUNCTION(getReducedVectorImpl, A)
345 BASECLASSMEMBERFUNCTION(getVectorImpl, A)
346 BASECLASSMEMBERFUNCTION(getRawMatrixImpl, A)
347
348 BASECLASSMEMBERFUNCTION(getReducedMatrixImpl, A)
349
350 BASECLASSMEMBERFUNCTION(getMatrixImpl, A)
351
352 A& base() { return *this; }
353 const A& base() const { return *this; }
354};
355
366template <typename A>
371 if constexpr (scal && vec && mat)
372 return std::make_shared<
373 AssemblerManipulator<std::remove_cvref_t<A>, Impl::AssemblerInterfaceHelper<ScalarAssembler, ScalarManipulator>,
374 Impl::AssemblerInterfaceHelper<VectorAssembler, VectorManipulator>,
375 Impl::AssemblerInterfaceHelper<MatrixAssembler, MatrixManipulator>>>(std::forward<A>(a));
376 else if constexpr (scal && vec)
377 return std::make_shared<
378 AssemblerManipulator<std::remove_cvref_t<A>, Impl::AssemblerInterfaceHelper<ScalarAssembler, ScalarManipulator>,
379 Impl::AssemblerInterfaceHelper<VectorAssembler, VectorManipulator>>>(std::forward<A>(a));
380 else if constexpr (scal)
381 return std::make_shared<AssemblerManipulator<std::remove_cvref_t<A>,
382 Impl::AssemblerInterfaceHelper<ScalarAssembler, ScalarManipulator>>>(
383 std::forward<A>(a));
384}
385} // 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:367
def dirichletValues(basis)
Definition: dirichlet_values.py:38
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:120
std::tuple< typename ScalarAss::template Implementation< AssemblerManipulator< A, ScalarAss >, A >::FunctionType > CallBackTypes
Definition: assemblermanipulatorfuser.hh:110
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:158
friend ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:156
VectorAss::template Interface< AssemblerManipulator, A, typename A::VectorType > VectorAssemblerInterface
Definition: assemblermanipulatorfuser.hh:154
A WrappedAssembler
Definition: assemblermanipulatorfuser.hh:148
VectorAss::template Implementation< AssemblerManipulator, WrappedAssembler > VectorAssemblerImpl
Definition: assemblermanipulatorfuser.hh:152
std::tuple< typename ScalarAssemblerImpl::FunctionType, typename VectorAssemblerImpl::FunctionType > CallBackTypes
Definition: assemblermanipulatorfuser.hh:209
friend VectorAssemblerImpl
Definition: assemblermanipulatorfuser.hh:157
AssemblerManipulator(Args &&... args)
Constructor that forwards arguments to the base assembler.
Definition: assemblermanipulatorfuser.hh:219
ScalarAss::template Interface< AssemblerManipulator, A, typename A::ScalarType > ScalarAssemblerInterface
Definition: assemblermanipulatorfuser.hh:153
ScalarAss::template Implementation< AssemblerManipulator, WrappedAssembler > ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:151
friend VectorAssemblerInterface
Definition: assemblermanipulatorfuser.hh:159
std::tuple< typename ScalarAssemblerImpl::FunctionType, typename VectorAssemblerImpl::FunctionType, typename MatrixAssemblerImpl::FunctionType > CallBackTypes
Definition: assemblermanipulatorfuser.hh:328
ScalarAss::template Interface< AssemblerManipulator, A, typename A::ScalarType > ScalarAssemblerInterface
Definition: assemblermanipulatorfuser.hh:262
MatrixAss::template Implementation< AssemblerManipulator, A > MatrixAssemblerImpl
Definition: assemblermanipulatorfuser.hh:261
friend VectorAssemblerImpl
Definition: assemblermanipulatorfuser.hh:267
A WrappedAssembler
Definition: assemblermanipulatorfuser.hh:256
MatrixAss::template Interface< AssemblerManipulator, A, typename A::MatrixType > MatrixAssemblerInterface
Definition: assemblermanipulatorfuser.hh:264
VectorAss::template Interface< AssemblerManipulator, A, typename A::VectorType > VectorAssemblerInterface
Definition: assemblermanipulatorfuser.hh:263
friend VectorAssemblerInterface
Definition: assemblermanipulatorfuser.hh:271
friend ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:266
friend MatrixAssemblerInterface
Definition: assemblermanipulatorfuser.hh:269
friend MatrixAssemblerImpl
Definition: assemblermanipulatorfuser.hh:268
AssemblerManipulator(Args &&... args)
Constructor that forwards arguments to the base assembler.
Definition: assemblermanipulatorfuser.hh:338
ScalarAss::template Implementation< AssemblerManipulator, A > ScalarAssemblerImpl
Definition: assemblermanipulatorfuser.hh:259
VectorAss::template Implementation< AssemblerManipulator, A > VectorAssemblerImpl
Definition: assemblermanipulatorfuser.hh:260
friend ScalarAssemblerInterface
Definition: assemblermanipulatorfuser.hh:270
Concept representing the requirements for a ScalarFlatAssembler.A type T satisfies ScalarFlatAssemble...
Definition: utils/concepts.hh:548
Concept representing the requirements for a VectorFlatAssembler.A type T satisfies VectorFlatAssemble...
Definition: utils/concepts.hh:562
Concept representing the requirements for a MatrixFlatAssembler.A type T satisfies MatrixFlatAssemble...
Definition: utils/concepts.hh:579