version 0.4.1
linearandglstrains.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
12#pragma once
13
16
17namespace Ikarus::EAS {
18
22template <typename GEO, int ess>
23struct EX
24{
25 static constexpr int myDim = GEO::mydimension;
26 static constexpr int strainSize = myDim * (myDim + 1) / 2;
27 static constexpr int enhancedStrainSize = ess;
28 using AnsatzType = Eigen::Matrix<double, strainSize, enhancedStrainSize>;
29 using DType = Eigen::Matrix<double, enhancedStrainSize, enhancedStrainSize>;
30
31 EX() = default;
32 explicit EX(const GEO& geometry)
33 : geometry_{std::make_optional<GEO>(geometry)},
34 T0InverseTransformed_{Impl::transformationMatrixAtCenterWithDetJ(geometry).inverse()} {}
35
36protected:
37 std::optional<GEO> geometry_;
38 Eigen::Matrix<double, strainSize, strainSize> T0InverseTransformed_;
39};
40
44template <typename GEO>
45struct E0 : EX<GEO, 0>
46{
48 static constexpr int myDim = Base::myDim;
49 static constexpr int strainSize = Base::strainSize;
51 using AnsatzType = typename Base::AnsatzType;
52 using DType = typename Base::DType;
53
54 E0() = default;
55 explicit E0(const GEO& geo)
56 : Base(geo) {}
57
58 // returns an Eigen zero expression for optimization purposes
59 auto operator()(const Dune::FieldVector<double, myDim>& /*quadPos*/) const { return AnsatzType::Zero(); }
60};
61
71template <typename GEO>
72struct E4 : EX<GEO, 4>
73{
75 static constexpr int myDim = Base::myDim;
76 static constexpr int strainSize = Base::strainSize;
78 using AnsatzType = typename Base::AnsatzType;
79 using DType = typename Base::DType;
80
81 E4() = default;
82 explicit E4(const GEO& geo)
83 : Base(geo) {}
84
86 AnsatzType M;
88 const double xi = quadPos[0];
89 const double eta = quadPos[1];
90 M(0, 0) = 2 * xi - 1.0;
91 M(1, 1) = 2 * eta - 1.0;
92 M(2, 2) = 2 * xi - 1.0;
93 M(2, 3) = 2 * eta - 1.0;
94 const double detJ = this->geometry_->integrationElement(quadPos);
95 M = this->T0InverseTransformed_ / detJ * M;
96 return M;
97 }
98};
99
107template <typename GEO>
108struct E5 : EX<GEO, 5>
109{
111 static constexpr int myDim = Base::myDim;
112 static constexpr int strainSize = Base::strainSize;
114 using AnsatzType = typename Base::AnsatzType;
115 using DType = typename Base::DType;
116
117 E5() = default;
118 explicit E5(const GEO& geo)
119 : Base(geo) {}
120
122 AnsatzType M;
123 M.setZero();
124 const double xi = quadPos[0];
125 const double eta = quadPos[1];
126 M(0, 0) = 2 * xi - 1.0;
127 M(1, 1) = 2 * eta - 1.0;
128 M(2, 2) = 2 * xi - 1.0;
129 M(2, 3) = 2 * eta - 1.0;
130 M(2, 4) = (2 * xi - 1.0) * (2 * eta - 1.0);
131 const double detJ = this->geometry_->integrationElement(quadPos);
132 M = this->T0InverseTransformed_ / detJ * M;
133 return M;
134 }
135};
136
144template <typename GEO>
145struct E7 : EX<GEO, 7>
146{
148 static constexpr int myDim = Base::myDim;
149 static constexpr int strainSize = Base::strainSize;
151 using AnsatzType = typename Base::AnsatzType;
152 using DType = typename Base::DType;
153
154 E7() = default;
155 explicit E7(const GEO& geo)
156 : Base(geo) {}
157
159 AnsatzType M;
160 M.setZero();
161 const double xi = quadPos[0];
162 const double eta = quadPos[1];
163 M(0, 0) = 2 * xi - 1.0;
164 M(1, 1) = 2 * eta - 1.0;
165 M(2, 2) = 2 * xi - 1.0;
166 M(2, 3) = 2 * eta - 1.0;
167 M(0, 4) = (2 * xi - 1.0) * (2 * eta - 1.0);
168 M(1, 5) = (2 * xi - 1.0) * (2 * eta - 1.0);
169 M(2, 6) = (2 * xi - 1.0) * (2 * eta - 1.0);
170 const double detJ = this->geometry_->integrationElement(quadPos);
171 M = this->T0InverseTransformed_ / detJ * M;
172 return M;
173 }
174};
175
185template <typename GEO>
186struct E11 : EX<GEO, 11>
187{
189 static constexpr int myDim = Base::myDim;
190 static constexpr int strainSize = Base::strainSize;
192 using AnsatzType = typename Base::AnsatzType;
193 using DType = typename Base::DType;
194
195 E11() = default;
196 explicit E11(const GEO& geo)
197 : Base(geo) {}
198
200 AnsatzType M;
201 M.setZero();
202 const double xi = quadPos[0];
203 const double eta = quadPos[1];
204 const double xi_t = 2 * xi - 1;
205 const double eta_t = 2 * eta - 1;
206
207 const double xi2 = xi_t * xi_t;
208 const double eta2 = eta_t * eta_t;
209 const double xi_eta = xi_t * eta_t;
210
211 M(0, 0) = 1 - 3 * xi2;
212 M(0, 1) = eta_t - 3 * xi2 * eta_t;
213 M(0, 2) = eta2 - 3 * xi2 * eta2;
214
215 M(1, 3) = 1 - 3 * eta2;
216 M(1, 4) = xi_t - 3 * xi_t * eta2;
217 M(1, 5) = xi2 - 3 * xi2 * eta2;
218
219 M(2, 6) = 1 - 3 * xi2;
220 M(2, 7) = 1 - 3 * eta2;
221 M(2, 8) = eta_t - 3 * xi2 * eta_t;
222 M(2, 9) = xi_t - 3 * xi_t * eta2;
223 M(2, 10) = 1 - 3 * (xi2 + eta2) + 9 * xi2 * eta2;
224
225 const double detJ = this->geometry_->integrationElement(quadPos);
226 M = this->T0InverseTransformed_ / detJ * M;
227 return M;
228 }
229};
230
238template <typename GEO>
239struct E9 : EX<GEO, 9>
240{
242 static constexpr int myDim = Base::myDim;
243 static constexpr int strainSize = Base::strainSize;
245 using AnsatzType = typename Base::AnsatzType;
246 using DType = typename Base::DType;
247
248 E9() = default;
249 explicit E9(const GEO& geo)
250 : Base(geo) {}
251
253 AnsatzType M;
254 M.setZero();
255 const double xi = quadPos[0];
256 const double eta = quadPos[1];
257 const double zeta = quadPos[2];
258 M(0, 0) = 2 * xi - 1.0;
259 M(1, 1) = 2 * eta - 1.0;
260 M(2, 2) = 2 * zeta - 1.0;
261 M(3, 3) = 2 * eta - 1.0;
262 M(3, 4) = 2 * zeta - 1.0;
263 M(4, 5) = 2 * xi - 1.0;
264 M(4, 6) = 2 * zeta - 1.0;
265 M(5, 7) = 2 * xi - 1.0;
266 M(5, 8) = 2 * eta - 1.0;
267 const double detJ = this->geometry_->integrationElement(quadPos);
268 M = this->T0InverseTransformed_ / detJ * M;
269 return M;
270 }
271};
272
280template <typename GEO>
281struct E21 : EX<GEO, 21>
282{
284 static constexpr int myDim = Base::myDim;
285 static constexpr int strainSize = Base::strainSize;
287 using AnsatzType = typename Base::AnsatzType;
288 using DType = typename Base::DType;
289
290 E21() = default;
291 explicit E21(const GEO& geo)
292 : Base(geo) {}
293
295 AnsatzType M;
296 M.setZero();
297 const double xi = quadPos[0];
298 const double eta = quadPos[1];
299 const double zeta = quadPos[2];
300 M(0, 0) = 2 * xi - 1.0;
301 M(1, 1) = 2 * eta - 1.0;
302 M(2, 2) = 2 * zeta - 1.0;
303 M(3, 3) = 2 * eta - 1.0;
304 M(3, 4) = 2 * zeta - 1.0;
305 M(4, 5) = 2 * xi - 1.0;
306 M(4, 6) = 2 * zeta - 1.0;
307 M(5, 7) = 2 * xi - 1.0;
308 M(5, 8) = 2 * eta - 1.0;
309
310 M(3, 9) = (2 * xi - 1.0) * (2 * eta - 1.0);
311 M(3, 10) = (2 * xi - 1.0) * (2 * zeta - 1.0);
312 M(4, 11) = (2 * xi - 1.0) * (2 * eta - 1.0);
313 M(4, 12) = (2 * eta - 1.0) * (2 * zeta - 1.0);
314 M(5, 13) = (2 * xi - 1.0) * (2 * zeta - 1.0);
315 M(5, 14) = (2 * eta - 1.0) * (2 * zeta - 1.0);
316
317 M(0, 15) = (2 * xi - 1.0) * (2 * eta - 1.0);
318 M(0, 16) = (2 * xi - 1.0) * (2 * zeta - 1.0);
319 M(1, 17) = (2 * xi - 1.0) * (2 * eta - 1.0);
320 M(1, 18) = (2 * eta - 1.0) * (2 * zeta - 1.0);
321 M(2, 19) = (2 * xi - 1.0) * (2 * zeta - 1.0);
322 M(2, 20) = (2 * eta - 1.0) * (2 * zeta - 1.0);
323
324 const double detJ = this->geometry_->integrationElement(quadPos);
325 M = this->T0InverseTransformed_ / detJ * M;
326 return M;
327 }
328};
329
330} // namespace Ikarus::EAS
Helper for the Eigen::Tensor types.
Definition of the certain helper functions used to transform strain measures.
Definition: easfunctions/displacementgradient.hh:21
Interface for displacement-based EAS elements, where linear or Green-Lagrange strains are enhanced.
Definition: linearandglstrains.hh:24
Eigen::Matrix< double, enhancedStrainSize, enhancedStrainSize > DType
Definition: linearandglstrains.hh:29
Eigen::Matrix< double, strainSize, strainSize > T0InverseTransformed_
Definition: linearandglstrains.hh:38
std::optional< GEO > geometry_
Definition: linearandglstrains.hh:37
static constexpr int strainSize
Definition: linearandglstrains.hh:26
static constexpr int myDim
Definition: linearandglstrains.hh:25
static constexpr int enhancedStrainSize
Definition: linearandglstrains.hh:27
Eigen::Matrix< double, strainSize, enhancedStrainSize > AnsatzType
Definition: linearandglstrains.hh:28
EX(const GEO &geometry)
Definition: linearandglstrains.hh:32
Dummy struct for displacement-based EAS elements, i.e. 0 enhanced modes.
Definition: linearandglstrains.hh:46
auto operator()(const Dune::FieldVector< double, myDim > &) const
Definition: linearandglstrains.hh:59
typename Base::DType DType
Definition: linearandglstrains.hh:52
static constexpr int myDim
Definition: linearandglstrains.hh:48
E0(const GEO &geo)
Definition: linearandglstrains.hh:55
static constexpr int strainSize
Definition: linearandglstrains.hh:49
typename Base::AnsatzType AnsatzType
Definition: linearandglstrains.hh:51
static constexpr int enhancedStrainSize
Definition: linearandglstrains.hh:50
E4 structure for EAS with linear strains and 4 enhanced modes.
Definition: linearandglstrains.hh:73
E4(const GEO &geo)
Definition: linearandglstrains.hh:82
static constexpr int enhancedStrainSize
Definition: linearandglstrains.hh:77
typename Base::DType DType
Definition: linearandglstrains.hh:79
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
Definition: linearandglstrains.hh:85
typename Base::AnsatzType AnsatzType
Definition: linearandglstrains.hh:78
static constexpr int myDim
Definition: linearandglstrains.hh:75
static constexpr int strainSize
Definition: linearandglstrains.hh:76
Structure representing EAS for Q1 with 5 enhanced strains.
Definition: linearandglstrains.hh:109
E5(const GEO &geo)
Definition: linearandglstrains.hh:118
static constexpr int enhancedStrainSize
Definition: linearandglstrains.hh:113
static constexpr int strainSize
Definition: linearandglstrains.hh:112
static constexpr int myDim
Definition: linearandglstrains.hh:111
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
Definition: linearandglstrains.hh:121
typename Base::DType DType
Definition: linearandglstrains.hh:115
typename Base::AnsatzType AnsatzType
Definition: linearandglstrains.hh:114
Structure representing EAS for Q1 with 7 enhanced strains.
Definition: linearandglstrains.hh:146
static constexpr int strainSize
Definition: linearandglstrains.hh:149
static constexpr int enhancedStrainSize
Definition: linearandglstrains.hh:150
E7(const GEO &geo)
Definition: linearandglstrains.hh:155
static constexpr int myDim
Definition: linearandglstrains.hh:148
typename Base::DType DType
Definition: linearandglstrains.hh:152
typename Base::AnsatzType AnsatzType
Definition: linearandglstrains.hh:151
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
Definition: linearandglstrains.hh:158
Structure representing EAS for Q2 with 11 enhanced strains.
Definition: linearandglstrains.hh:187
typename Base::AnsatzType AnsatzType
Definition: linearandglstrains.hh:192
static constexpr int strainSize
Definition: linearandglstrains.hh:190
static constexpr int enhancedStrainSize
Definition: linearandglstrains.hh:191
E11(const GEO &geo)
Definition: linearandglstrains.hh:196
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
Definition: linearandglstrains.hh:199
static constexpr int myDim
Definition: linearandglstrains.hh:189
typename Base::DType DType
Definition: linearandglstrains.hh:193
Structure representing EAS for H1 with 9 enhanced strains.
Definition: linearandglstrains.hh:240
static constexpr int myDim
Definition: linearandglstrains.hh:242
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
Definition: linearandglstrains.hh:252
typename Base::DType DType
Definition: linearandglstrains.hh:246
E9(const GEO &geo)
Definition: linearandglstrains.hh:249
static constexpr int strainSize
Definition: linearandglstrains.hh:243
typename Base::AnsatzType AnsatzType
Definition: linearandglstrains.hh:245
static constexpr int enhancedStrainSize
Definition: linearandglstrains.hh:244
Structure representing EAS for H1 with 21 enhanced strains.
Definition: linearandglstrains.hh:282
static constexpr int enhancedStrainSize
Definition: linearandglstrains.hh:286
static constexpr int myDim
Definition: linearandglstrains.hh:284
E21(const GEO &geo)
Definition: linearandglstrains.hh:291
typename Base::DType DType
Definition: linearandglstrains.hh:288
static constexpr int strainSize
Definition: linearandglstrains.hh:285
AnsatzType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
Definition: linearandglstrains.hh:294
typename Base::AnsatzType AnsatzType
Definition: linearandglstrains.hh:287
Definition: utils/dirichletvalues.hh:32