version 0.4.1
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
easvariants/displacementgradient.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
24template <typename GEO, int ess>
25struct HX
26{
27 static constexpr int myDim = GEO::mydimension;
28 static constexpr int strainSize = myDim * (myDim + 1) / 2;
29 static constexpr int enhancedStrainSize = ess;
30 using MType = Eigen::Matrix<double, strainSize, enhancedStrainSize>;
31 using DType = Eigen::Matrix<double, enhancedStrainSize, enhancedStrainSize>;
32 using AnsatzType = Eigen::Matrix<double, myDim, myDim>;
33 using HType = std::array<AnsatzType, enhancedStrainSize>;
34
35 HX() = default;
36 explicit HX(const GEO& geometry)
37 : geometry_{std::make_optional<GEO>(geometry)} {}
38
39protected:
40 std::optional<GEO> geometry_;
41 const auto& geometry() const { return this->geometry_.value(); };
42};
43
48template <typename GEO>
49struct H0 : HX<GEO, 0>
50{
52 static constexpr int myDim = Base::myDim;
53 static constexpr int strainSize = Base::strainSize;
55 using MType = typename Base::MType;
56 using DType = typename Base::DType;
57 using AnsatzType = typename Base::AnsatzType;
58 using HType = typename Base::HType;
59
60 H0() = default;
61 explicit H0(const GEO& geo)
62 : Base(geo) {}
63
64 HType operator()(const Dune::FieldVector<double, myDim>& /*quadPos*/) const { return {}; }
65};
66
75template <typename GEO>
76struct H4 : HX<GEO, 4>
77{
79 static constexpr int myDim = Base::myDim;
80 static constexpr int strainSize = Base::strainSize;
82 using MType = typename Base::MType;
83 using DType = typename Base::DType;
84 using AnsatzType = typename Base::AnsatzType;
85 using HType = typename Base::HType;
86
87 H4() = default;
88 explicit H4(const GEO& geo)
89 : Base(geo) {}
90
92 const double xi = quadPos[0];
93 const double eta = quadPos[1];
94 const double xi_t = 2 * xi - 1.0;
95 const double eta_t = 2 * eta - 1.0;
96
97 HType H;
98 std::ranges::fill(H, AnsatzType::Zero());
99
100 H[0](0, 0) = xi_t;
101 H[1](0, 1) = eta_t;
102 H[2](1, 0) = xi_t;
103 H[3](1, 1) = eta_t;
104
105 for (auto& HMat : H)
106 Impl::transformDisplacementGradient(this->geometry(), HMat, quadPos);
107
108 return H;
109 }
110};
111
120template <typename GEO>
121struct H9 : HX<GEO, 9>
122{
124 static constexpr int myDim = Base::myDim;
125 static constexpr int strainSize = Base::strainSize;
127 using MType = typename Base::MType;
128 using DType = typename Base::DType;
129 using AnsatzType = typename Base::AnsatzType;
130 using HType = typename Base::HType;
131
132 H9() = default;
133 explicit H9(const GEO& geo)
134 : Base(geo) {}
135
137 const double xi = quadPos[0];
138 const double eta = quadPos[1];
139 const double zeta = quadPos[2];
140 const double xi_t = 2 * xi - 1.0;
141 const double eta_t = 2 * eta - 1.0;
142 const double zeta_t = 2 * zeta - 1.0;
143
144 HType H;
145 std::ranges::fill(H, AnsatzType::Zero());
146
147 H[0](0, 0) = xi_t;
148 H[1](0, 1) = eta_t;
149 H[2](0, 2) = zeta_t;
150 H[3](1, 0) = xi_t;
151 H[4](1, 1) = eta_t;
152 H[5](1, 2) = zeta_t;
153 H[6](2, 0) = xi_t;
154 H[7](2, 1) = eta_t;
155 H[8](2, 2) = zeta_t;
156
157 for (auto& HMat : H)
158 Impl::transformDisplacementGradient(this->geometry(), HMat, quadPos);
159
160 return H;
161 }
162};
163} // 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 displacement gradient is enhanced.
Definition: easvariants/displacementgradient.hh:26
static constexpr int myDim
Definition: easvariants/displacementgradient.hh:27
std::array< AnsatzType, enhancedStrainSize > HType
Definition: easvariants/displacementgradient.hh:33
const auto & geometry() const
Definition: easvariants/displacementgradient.hh:41
Eigen::Matrix< double, myDim, myDim > AnsatzType
Definition: easvariants/displacementgradient.hh:32
std::optional< GEO > geometry_
Definition: easvariants/displacementgradient.hh:40
Eigen::Matrix< double, enhancedStrainSize, enhancedStrainSize > DType
Definition: easvariants/displacementgradient.hh:31
static constexpr int enhancedStrainSize
Definition: easvariants/displacementgradient.hh:29
Eigen::Matrix< double, strainSize, enhancedStrainSize > MType
Definition: easvariants/displacementgradient.hh:30
HX(const GEO &geometry)
Definition: easvariants/displacementgradient.hh:36
static constexpr int strainSize
Definition: easvariants/displacementgradient.hh:28
Dummy struct for displacement-based EAS elements, i.e. 0 enhanced modes, where displacement gradient ...
Definition: easvariants/displacementgradient.hh:50
typename Base::DType DType
Definition: easvariants/displacementgradient.hh:56
static constexpr int myDim
Definition: easvariants/displacementgradient.hh:52
HType operator()(const Dune::FieldVector< double, myDim > &) const
Definition: easvariants/displacementgradient.hh:64
static constexpr int strainSize
Definition: easvariants/displacementgradient.hh:53
typename Base::HType HType
Definition: easvariants/displacementgradient.hh:58
H0(const GEO &geo)
Definition: easvariants/displacementgradient.hh:61
typename Base::AnsatzType AnsatzType
Definition: easvariants/displacementgradient.hh:57
static constexpr int enhancedStrainSize
Definition: easvariants/displacementgradient.hh:54
typename Base::MType MType
Definition: easvariants/displacementgradient.hh:55
H4 struct for EAS with 4 enhanced modes.
Definition: easvariants/displacementgradient.hh:77
static constexpr int enhancedStrainSize
Definition: easvariants/displacementgradient.hh:81
static constexpr int strainSize
Definition: easvariants/displacementgradient.hh:80
static constexpr int myDim
Definition: easvariants/displacementgradient.hh:79
H4(const GEO &geo)
Definition: easvariants/displacementgradient.hh:88
typename Base::DType DType
Definition: easvariants/displacementgradient.hh:83
typename Base::AnsatzType AnsatzType
Definition: easvariants/displacementgradient.hh:84
typename Base::MType MType
Definition: easvariants/displacementgradient.hh:82
HType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
Definition: easvariants/displacementgradient.hh:91
typename Base::HType HType
Definition: easvariants/displacementgradient.hh:85
H9 struct for EAS with 9 enhanced modes.
Definition: easvariants/displacementgradient.hh:122
typename Base::AnsatzType AnsatzType
Definition: easvariants/displacementgradient.hh:129
HType operator()(const Dune::FieldVector< double, myDim > &quadPos) const
Definition: easvariants/displacementgradient.hh:136
H9(const GEO &geo)
Definition: easvariants/displacementgradient.hh:133
static constexpr int strainSize
Definition: easvariants/displacementgradient.hh:125
typename Base::HType HType
Definition: easvariants/displacementgradient.hh:130
static constexpr int myDim
Definition: easvariants/displacementgradient.hh:124
typename Base::DType DType
Definition: easvariants/displacementgradient.hh:128
static constexpr int enhancedStrainSize
Definition: easvariants/displacementgradient.hh:126
typename Base::MType MType
Definition: easvariants/displacementgradient.hh:127
Definition: utils/dirichletvalues.hh:32