version 0.4.4
linearandpk2stress.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
12#pragma once
13
16
17namespace Ikarus::PS {
18
19namespace Impl {
20 template <typename GEO>
21 auto transformationMatrixAtCenter(const GEO& geometry) {
22 const auto& referenceElement = Dune::ReferenceElements<double, GEO::mydimension>::general(geometry.type());
23 const auto quadPos0 = referenceElement.position(0, 0);
24
25 return (transformationMatrix(geometry, quadPos0).transpose()).eval();
26 }
27} // namespace Impl
28
34template <typename GEO, int ass>
35struct SX
36{
37 static constexpr int myDim = GEO::mydimension;
38 static constexpr int stressSize = myDim * (myDim + 1) / 2;
39 static constexpr int assumedStressSize = ass;
40 using AnsatzType = Eigen::Matrix<double, stressSize, assumedStressSize>;
41 using HType = Eigen::Matrix<double, assumedStressSize, assumedStressSize>;
42
43 SX() = default;
44 explicit SX(const GEO& geometry)
45 : geometry_{std::make_optional<GEO>(geometry)},
46 T0_{Impl::transformationMatrixAtCenter(geometry)} {}
47
48protected:
49 std::optional<GEO> geometry_;
50 Eigen::Matrix<double, stressSize, stressSize> T0_;
51};
52
58template <typename GEO>
59struct S5 : SX<GEO, 5>
60{
62 static constexpr int myDim = Base::myDim;
63 static constexpr int stressSize = Base::stressSize;
65 using AnsatzType = typename Base::AnsatzType;
66 using HType = typename Base::HType;
67
68 S5() = default;
69 explicit S5(const GEO& geo)
70 : Base(geo) {}
71
78 AnsatzType P;
79 P.setZero(stressSize, assumedStressSize);
80 const double xi = 2.0 * quadPos[0] - 1.0;
81 const double eta = 2.0 * quadPos[1] - 1.0;
82 P(0, 0) = 1.0;
83 P(1, 1) = 1.0;
84 P(2, 2) = 1.0;
85 P(0, 3) = eta;
86 P(1, 4) = xi;
87
88 return this->T0_ * P;
89 }
90};
91
97template <typename GEO>
98struct S18 : SX<GEO, 18>
99{
101 static constexpr int myDim = Base::myDim;
102 static constexpr int stressSize = Base::stressSize;
104 using AnsatzType = typename Base::AnsatzType;
105 using HType = typename Base::HType;
106
107 S18() = default;
108 explicit S18(const GEO& geo)
109 : Base(geo) {}
110
117 AnsatzType P;
118 P.setZero();
119 const double xi = 2.0 * quadPos[0] - 1.0;
120 const double eta = 2.0 * quadPos[1] - 1.0;
121 const double zeta = 2.0 * quadPos[2] - 1.0;
122
123 // ξξ = (1.0, eta, zeta, eta*zeta) → row 0:
124 P(0, 0) = 1.0;
125 P(0, 1) = eta;
126 P(0, 2) = zeta;
127 P(0, 3) = eta * zeta;
128
129 // ηη = (1.0, xi, zeta, xi*zeta) → row 1:
130 P(1, 4) = 1.0;
131 P(1, 5) = xi;
132 P(1, 6) = zeta;
133 P(1, 7) = xi * zeta;
134
135 // ζζ = (1.0, xi, eta, xi*eta) → row 2:
136 P(2, 8) = 1.0;
137 P(2, 9) = xi;
138 P(2, 10) = eta;
139 P(2, 11) = xi * eta;
140
141 // ηζ = (1, xi) → row 3:
142 P(3, 12) = 1.0;
143 P(3, 13) = xi;
144
145 // ξζ = (1.0, eta) → row 4:
146 P(4, 14) = 1.0;
147 P(4, 15) = eta;
148
149 // ξη = (1.0, zeta) → row 5:
150 P(5, 16) = 1.0;
151 P(5, 17) = zeta;
152
153 return this->T0_ * P;
154 }
155};
156
162template <typename GEO>
163struct S24 : SX<GEO, 24>
164{
166 static constexpr int myDim = Base::myDim;
167 static constexpr int stressSize = Base::stressSize;
169 using AnsatzType = typename Base::AnsatzType;
170 using HType = typename Base::HType;
171
172 S24() = default;
173 explicit S24(const GEO& geo)
174 : Base(geo) {}
175
182 AnsatzType P;
183 P.setZero();
184 const double xi = 2.0 * quadPos[0] - 1.0;
185 const double eta = 2.0 * quadPos[1] - 1.0;
186 const double zeta = 2.0 * quadPos[2] - 1.0;
187
188 // ξξ = (1.0, eta, zeta, eta*zeta) → row 0:
189 P(0, 0) = 1.0;
190 P(0, 1) = eta;
191 P(0, 2) = zeta;
192 P(0, 3) = eta * zeta;
193
194 // ηη = (1.0, xi, zeta, xi*zeta) → row 1:
195 P(1, 4) = 1.0;
196 P(1, 5) = xi;
197 P(1, 6) = zeta;
198 P(1, 7) = xi * zeta;
199
200 // ζζ = (1.0, xi, eta, xi*eta) → row 2:
201 P(2, 8) = 1.0;
202 P(2, 9) = xi;
203 P(2, 10) = eta;
204 P(2, 11) = xi * eta;
205
206 // ηζ = (1.0, xi, xi*eta, xi*zeta) → row 3:
207 P(3, 12) = 1.0;
208 P(3, 13) = xi;
209 P(3, 14) = xi * eta;
210 P(3, 15) = xi * zeta;
211
212 // ξζ = (1.0, eta, xi*eta, eta*zeta) → row 4:
213 P(4, 16) = 1.0;
214 P(4, 17) = eta;
215 P(4, 18) = xi * eta;
216 P(4, 19) = eta * zeta;
217
218 // ξη = (1.0, zeta, eta*zeta, xi*zeta) → row 5:
219 P(5, 20) = 1.0;
220 P(5, 21) = zeta;
221 P(5, 22) = eta * zeta;
222 P(5, 23) = xi * zeta;
223
224 return this->T0_ * P;
225 }
226};
227
233template <typename GEO>
234struct S30 : SX<GEO, 30>
235{
237 static constexpr int myDim = Base::myDim;
238 static constexpr int stressSize = Base::stressSize;
240 using AnsatzType = typename Base::AnsatzType;
241 using HType = typename Base::HType;
242
243 S30() = default;
244 explicit S30(const GEO& geo)
245 : Base(geo) {}
246
253 AnsatzType P;
254 P.setZero();
255 const double xi = 2.0 * quadPos[0] - 1.0;
256 const double eta = 2.0 * quadPos[1] - 1.0;
257 const double zeta = 2.0 * quadPos[2] - 1.0;
258
259 // ξξ = (1.0, eta, zeta, eta*zeta) → row 0:
260 P(0, 0) = 1.0;
261 P(0, 1) = eta;
262 P(0, 2) = zeta;
263 P(0, 3) = eta * zeta;
264
265 // ηη = (1.0, xi, zeta, xi*zeta) → row 1:
266 P(1, 4) = 1.0;
267 P(1, 5) = xi;
268 P(1, 6) = zeta;
269 P(1, 7) = xi * zeta;
270
271 // ζζ = (1.0, xi, eta, xi*eta) → row 2:
272 P(2, 8) = 1.0;
273 P(2, 9) = xi;
274 P(2, 10) = eta;
275 P(2, 11) = xi * eta;
276
277 // ηζ = (1.0, xi, xi*eta, xi*zeta) → row 3:
278 P(3, 12) = 1.0;
279 P(3, 13) = xi;
280 P(3, 14) = eta;
281 P(3, 15) = zeta;
282 P(3, 16) = xi * eta;
283 P(3, 17) = xi * zeta;
284
285 // ξζ = (1.0, eta, xi*eta, eta*zeta) → row 4:
286 P(4, 18) = 1.0;
287 P(4, 19) = xi;
288 P(4, 20) = eta;
289 P(4, 21) = zeta;
290 P(4, 22) = xi * eta;
291 P(4, 23) = eta * zeta;
292
293 // ξη = (1.0, zeta, eta*zeta, xi*zeta) → row 5:
294 P(5, 24) = 1.0;
295 P(5, 25) = xi;
296 P(5, 26) = eta;
297 P(5, 27) = zeta;
298 P(5, 28) = eta * zeta;
299 P(5, 29) = xi * zeta;
300
301 return this->T0_ * P;
302 }
303};
304
305} // namespace Ikarus::PS
Helper for the Eigen::Tensor types.
Definition of several material related enums.
auto transpose(const Eigen::EigenBase< Derived > &A)
Eigen::Matrix3d transformationMatrix(const GEO &geometry, const Dune::FieldVector< double, 2 > &pos)
Calculates the 2D transformation matrix.
Definition: tensorutils.hh:410
Definition: linearstress.hh:19
Interface for displacement-based Assumed Stress elements, where linear or PK2 stresses are assumed.
Definition: linearandpk2stress.hh:36
Eigen::Matrix< double, stressSize, stressSize > T0_
Definition: linearandpk2stress.hh:50
SX(const GEO &geometry)
Definition: linearandpk2stress.hh:44
std::optional< GEO > geometry_
Definition: linearandpk2stress.hh:49
Eigen::Matrix< double, stressSize, assumedStressSize > AnsatzType
Definition: linearandpk2stress.hh:40
static constexpr int stressSize
Definition: linearandpk2stress.hh:38
static constexpr int assumedStressSize
Definition: linearandpk2stress.hh:39
static constexpr int myDim
Definition: linearandpk2stress.hh:37
Eigen::Matrix< double, assumedStressSize, assumedStressSize > HType
Definition: linearandpk2stress.hh:41
SX()=default
S5 struct for AssumedStress (PS) for Q1 with 5 assumed stress parameters.
Definition: linearandpk2stress.hh:60
static constexpr int myDim
Definition: linearandpk2stress.hh:62
S5(const GEO &geo)
Definition: linearandpk2stress.hh:69
S5()=default
static constexpr int stressSize
Definition: linearandpk2stress.hh:63
typename Base::HType HType
Definition: linearandpk2stress.hh:66
typename Base::AnsatzType AnsatzType
Definition: linearandpk2stress.hh:65
static constexpr int assumedStressSize
Definition: linearandpk2stress.hh:64
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
A function that implements the ansatz for the stress measure.
Definition: linearandpk2stress.hh:77
S18 struct for AssumedStress (PS) for H1 with 18 stress parameters.
Definition: linearandpk2stress.hh:99
static constexpr int myDim
Definition: linearandpk2stress.hh:101
static constexpr int stressSize
Definition: linearandpk2stress.hh:102
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
A function that implements the ansatz for the stress measure.
Definition: linearandpk2stress.hh:116
S18(const GEO &geo)
Definition: linearandpk2stress.hh:108
typename Base::HType HType
Definition: linearandpk2stress.hh:105
static constexpr int assumedStressSize
Definition: linearandpk2stress.hh:103
typename Base::AnsatzType AnsatzType
Definition: linearandpk2stress.hh:104
S24 struct for AssumedStress (PS) for H1 with 24 assumed stress parameters.
Definition: linearandpk2stress.hh:164
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
A function that implements the ansatz for the stress measure.
Definition: linearandpk2stress.hh:181
static constexpr int stressSize
Definition: linearandpk2stress.hh:167
typename Base::AnsatzType AnsatzType
Definition: linearandpk2stress.hh:169
typename Base::HType HType
Definition: linearandpk2stress.hh:170
static constexpr int myDim
Definition: linearandpk2stress.hh:166
static constexpr int assumedStressSize
Definition: linearandpk2stress.hh:168
S24(const GEO &geo)
Definition: linearandpk2stress.hh:173
S30 struct for AssumedStress (PS) for H1 with 30 assumed stress parameters.
Definition: linearandpk2stress.hh:235
static constexpr int myDim
Definition: linearandpk2stress.hh:237
typename Base::HType HType
Definition: linearandpk2stress.hh:241
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
A function that implements the ansatz for the stress measure.
Definition: linearandpk2stress.hh:252
S30(const GEO &geo)
Definition: linearandpk2stress.hh:244
typename Base::AnsatzType AnsatzType
Definition: linearandpk2stress.hh:240
static constexpr int assumedStressSize
Definition: linearandpk2stress.hh:239
static constexpr int stressSize
Definition: linearandpk2stress.hh:238
Definition: utils/dirichletvalues.hh:32