Loading [MathJax]/extensions/TeX/AMSsymbols.js

DUNE-ACFEM (unstable)

restriction.hh
1#ifndef __DUNE_ACFEM_TENSORS_OPTIMIZATION_RESTRICTION_HH__
2#define __DUNE_ACFEM_TENSORS_OPTIMIZATION_RESTRICTION_HH__
3
4#include "../../expressions/optimizegeneral.hh"
5#include "../expressionoperations.hh"
6#include "../modules.hh"
7#include "../operations/restriction.hh"
8
9namespace Dune {
10
11 namespace ACFem {
12
13 namespace Expressions {
14
15 template<class DefectPositions, class PivotSequence, class T>
16 constexpr inline bool IsUnaryZeroV<
17 OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >,
18 T> = (DefectPositions::size() == PivotSequence::size() // only compile-time constant restrictions
19 && TensorTraits<T>::isZero(PivotSequence{}, DefectPositions{}));
20
21 }
22
23 namespace Tensor {
24
25 namespace Optimization::Restriction {
26
27 using RestrictionTag = OptimizeNext<Policy::DefaultOptimizationTag>;
28
29 template<class DefectPositions, class PivotSequence, class T>
30 constexpr auto zero(OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >, T&&)
31 {
32 using Signature = typename TensorTraits<T>::Signature;
33 using DefectSignature = SequenceSliceComplement<Signature, DefectPositions>;
34
35 DUNE_ACFEM_EXPRESSION_RESULT(
36 zeros(DefectSignature{}, Disclosure{})
37 , "zero restriction"
38 );
39 }
40
41 template<class F, class T>
42 constexpr inline bool IsConstRestrictionOfConstRestrictionV = false;
43
44 template<class DefectPositions, class PivotSequence, class T>
45 constexpr inline bool IsConstRestrictionOfConstRestrictionV<
46 OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >,
48 && IsConstRestriction<T>::value);
49
51 template<class F, class T, std::enable_if_t<IsConstRestrictionOfConstRestrictionV<std::decay_t<F>, T>, int> = 0>
52 constexpr decltype(auto) operate(RestrictionTag, F&&, T&& t)
53 {
54 DUNE_ACFEM_RECORD_OPTIMIZATION;
55
56 using OuterTraits = RestrictionTraits<std::decay_t<F> >;
57 using InnerTraits = RestrictionTraits<Operation<T> >;
58 using OuterDefects = typename OuterTraits::DefectPositions;
59 using OuterPivots = typename OuterTraits::PivotSequence;
60 using InnerDefects = typename InnerTraits::DefectPositions;
61 using InnerPivots = typename InnerTraits::PivotSequence;
62
63 using MergedDefects = JoinedDefects<InnerDefects, OuterDefects>;
64 using Injects = JoinedInjections<InnerDefects, OuterDefects>;
65 using MergedPivots = InsertAt<InnerPivots, OuterPivots, Injects>;
66
67 DUNE_ACFEM_EXPRESSION_RESULT(
68 (operate<RestrictionOperation<MergedDefects, MergedPivots> >(
69 std::forward<T>(t).operand(0_c)
70 ))
71 , "merge restrictions"
72 );
73 }
74
75 template<class F, class T>
76 constexpr inline bool IsNonConstRestrictionOfNonConstRestrictionV = false;
77
78 template<std::size_t D0, std::size_t... DRest, class T>
79 constexpr inline bool IsNonConstRestrictionOfNonConstRestrictionV<
80 OperationTraits<RestrictionOperation<Seq<D0, DRest...>, Seq<> > >,
81 T> = (IsDynamicRestriction<T>::value
82 && !std::is_reference<Operand<0, T> >::value);
83
85 template<class F, class T, std::enable_if_t<IsNonConstRestrictionOfNonConstRestrictionV<F, T>, int> = 0>
86 constexpr decltype(auto) operate(RestrictionTag, F&& f, T&& t)
87 {
88 DUNE_ACFEM_RECORD_OPTIMIZATION;
89
90 using OuterTraits = RestrictionTraits<std::decay_t<F> >;
91 using InnerTraits = RestrictionTraits<Operation<T> >;
92 using InnerDefects = typename InnerTraits::DefectPositions;
93 using OuterDefects = typename OuterTraits::DefectPositions;
94
95 using MergedDefects = JoinedDefects<InnerDefects, OuterDefects>;
96 using Injects = JoinedInjections<InnerDefects, OuterDefects>;
97
98 auto at = insertAt(std::forward<T>(t).lookAt(), f.pivotIndices_, Injects{});
99
100 DUNE_ACFEM_EXPRESSION_RESULT(
101 operate(OperationTraits<RestrictionOperation<MergedDefects, Seq<> > >(at), std::move(std::forward<T>(t)).operand(0_c))
102 , "merge non-const restrictions"
103 );
104 }
105
106 template<class F, class T>
107 constexpr inline bool IsConstRestrictionOfEyeV = false;
108
109 template<class DefectPositions, class PivotSequence, class T>
110 constexpr inline bool IsConstRestrictionOfEyeV<
111 OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >,
113 && IsEye<T>::value
114 && isConstant(PivotSequence{}));
115
122 template<class F, class T, std::enable_if_t<IsConstRestrictionOfEyeV<F, T>, int> = 0>
123 constexpr auto operate(OptimizeTerminal1, F&&, T&& t)
124 {
125 DUNE_ACFEM_RECORD_OPTIMIZATION;
126
127 using Traits = RestrictionTraits<std::decay_t<F> >;
128 using DefectPositions = typename Traits::DefectPositions;
129 using PivotSequence = typename Traits::PivotSequence;
130 using Signature = typename TensorTraits<T>::Signature;
131 using DefectSignature = SequenceSliceComplement<Signature, DefectPositions>;
132 using ValueType = typename std::decay_t<T>::ValueType;
133 constexpr std::size_t defectRank = DefectSignature::size();
134
135 DUNE_ACFEM_EXPRESSION_RESULT(
136 (KroneckerDelta<DefectSignature, MakeConstantSequence<defectRank, Head<PivotSequence>::value>, ValueType>{})
137 , "non-zero restriction of eye"
138 );
139 }
140
141 template<class F, class T>
142 constexpr inline bool IsConstRestrictionOfBlockEyeV = false;
143
144 template<class DefectPositions, class PivotSequence, class T>
145 constexpr inline bool IsConstRestrictionOfBlockEyeV<
146 OperationTraits<RestrictionOperation<DefectPositions, PivotSequence> >,
148 && IsBlockEye<T>::value
149 && IsBlockEyePositionsV<DefectPositions, BlockEyeTraits<T>::blockRank_, typename BlockEyeTraits<T>::BlockSignature>);
150
167 template<class F, class T, std::enable_if_t<IsConstRestrictionOfBlockEyeV<F, T>, int> = 0>
168 constexpr auto operate(OptimizeTerminal1, F&&, T&& t)
169 {
170 DUNE_ACFEM_RECORD_OPTIMIZATION;
171
172 using OperandType = std::decay_t<T>;
173 using Signature = typename OperandType::Signature;
174 using Traits = RestrictionTraits<std::decay_t<F> >;
175 using DefectPositions = typename Traits::DefectPositions;
176 using PivotSequence = typename Traits::PivotSequence;
177 using DefectSignature = SequenceSliceComplement<Signature, DefectPositions>;
178
179 using ValueType = typename OperandType::ValueType;
180 constexpr std::size_t defectRank = DefectSignature::size();
181
182 using BlockSignature = typename BlockEyeTraits<OperandType>::BlockSignature;
183 constexpr std::size_t blockSize = BlockSignature::size();
184
185 static_assert(defectRank % blockSize == 0,
186 "Internal template specialization error: rank of resulting KroneckerDelta must be a multiple of the BlockSignature size.");
187
188 constexpr std::size_t numBlocks = defectRank / blockSize;
189
190 // One building block for the Kronecker-delta
191 using PivotBlock = HeadPart<blockSize, PivotSequence>;
192
193 // Generate the Pivot sequence
194 using KroneckerPivots = SequenceProd<numBlocks, PivotBlock>;
195
196 DUNE_ACFEM_EXPRESSION_RESULT(
197 (KroneckerDelta<DefectSignature, KroneckerPivots, ValueType>{})
198 , "non-zero restriction of block-eye"
199 );
200 }
201
202 } // Optimization::Restriction::
203
205
206 } // Tensor::
207
208 namespace Expressions {
209
210 using Tensor::Optimization::Restriction::operate;
211
212 } // Expressions
213
214 } // ACFem
215
216} // Dune
217
218#endif // __DUNE_ACFEM_TENSORS_OPTIMIZATION_RESTRICTION_HH__
constexpr auto zero(T &&t)
Use the zero fraction as canonical zero element for scalars.
Definition: constantoperations.hh:80
constexpr std::size_t size()
Gives the number of elements in tuple-likes and std::integer_sequence.
Definition: size.hh:73
MakeIndexSequence< N, Value, 0 > MakeConstantSequence
Generate a constant index sequence of the given size.
Definition: generators.hh:45
auto insertAt(SrcTuple &&src, DataTuple &&data, BoolConstant< AssumeSorted >=BoolConstant< AssumeSorted >{})
Insert the elements of data at positions given by pos into src in turn.
Definition: subtuple.hh:106
constexpr bool isConstant(Sequence< T, T0, Ts... >)
Definition: compare.hh:285
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Mar 12, 23:28, 2025)