version 0.4.2
kirchhoffloveshell.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2021-2024 The Ikarus Developers mueller@ibb.uni-stuttgart.de
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
9#pragma once
10
11#include <dune/geometry/quadraturerules.hh>
12#include <dune/localfefunctions/cachedlocalBasis/cachedlocalBasis.hh>
13#include <dune/localfefunctions/impl/standardLocalFunction.hh>
14
21
22namespace Ikarus {
23template <typename PreFE, typename FE>
24class KirchhoffLoveShell;
25
30{
32 double thickness;
33
34 template <typename PreFE, typename FE>
36};
37
48template <typename PreFE, typename FE>
50{
51public:
54 using FlatBasis = typename Traits::FlatBasis;
57 using LocalView = typename Traits::LocalView;
58 using Geometry = typename Traits::Geometry;
59 using GridView = typename Traits::GridView;
60 using Element = typename Traits::Element;
61 using LocalBasisType = decltype(std::declval<LocalView>().tree().child(0).finiteElement().localBasis());
63
64 static constexpr int myDim = Traits::mydim;
65 static constexpr int worldDim = Traits::worlddim;
66 static constexpr int membraneStrainSize = 3;
67 static constexpr int bendingStrainSize = 3;
68
78 template <typename ST = double>
80 {
81 Eigen::Matrix<double, 3, 3> C;
82 Eigen::Vector3<ST> epsV;
83 Eigen::Vector3<ST> kappaV;
84 Eigen::Matrix<ST, 2, 3> j;
85 Eigen::Matrix<double, 2, 3> J;
86 Eigen::Matrix3<ST> h;
87 Eigen::Matrix3<double> H;
88 Eigen::Vector3<ST> a3N;
89 Eigen::Vector3<ST> a3;
90 };
91
100 : mat_{pre.material},
101 thickness_{pre.thickness} {}
102
103protected:
107 void bindImpl() {
108 const auto& localView = underlying().localView();
109 assert(localView.bound());
110 const auto& element = localView.element();
111 auto& firstChild = localView.tree().child(0);
112
113 const auto& fe = firstChild.finiteElement();
114 // geo_.emplace(element.geometry());
115 numberOfNodes_ = fe.size();
116 order_ = 2 * (fe.localBasis().order());
117 localBasis_ = Dune::CachedLocalBasis(fe.localBasis());
118 if constexpr (requires { element.impl().getQuadratureRule(order_); })
119 if (element.impl().isTrimmed())
120 localBasis_.bind(element.impl().getQuadratureRule(order_), Dune::bindDerivatives(0, 1, 2));
121 else
122 localBasis_.bind(Dune::QuadratureRules<double, myDim>::rule(element.type(), order_),
123 Dune::bindDerivatives(0, 1, 2));
124 else
125 localBasis_.bind(Dune::QuadratureRules<double, myDim>::rule(element.type(), order_),
126 Dune::bindDerivatives(0, 1, 2));
127 }
128
129public:
140 template <typename ST = double>
142 const Requirement& par,
143 const std::optional<std::reference_wrapper<const Eigen::VectorX<ST>>>& dx = std::nullopt) const {
144 const auto& d = par.globalSolution();
145 auto disp = Ikarus::FEHelper::localSolutionBlockVector<Traits>(d, underlying().localView(), dx);
146 Dune::StandardLocalFunction uFunction(
147 localBasis_, disp, std::make_shared<const Geometry>(underlying().localView().element().geometry()));
148 return uFunction;
149 }
150
151 Geometry geometry() const { return underlying().localView().element().geometry(); }
152 [[nodiscard]] size_t numberOfNodes() const { return numberOfNodes_; }
153 [[nodiscard]] int order() const { return order_; }
154
160 template <template <typename, int, int> class RT>
161 static consteval bool canProvideResultType() {
162 return false;
163 }
164
165 using SupportedResultTypes = std::tuple<>;
166
176 template <template <typename, int, int> class RT>
177 requires(canProvideResultType<RT>())
178 auto calculateAtImpl([[maybe_unused]] const Requirement& req,
179 [[maybe_unused]] const Dune::FieldVector<double, Traits::mydim>& local)
181 DUNE_THROW(Dune::NotImplemented, "No results are implemented");
182 }
183
184private:
185 //> CRTP
186 const auto& underlying() const { return static_cast<const FE&>(*this); }
187 auto& underlying() { return static_cast<FE&>(*this); }
188 // std::optional<Geometry> geo_;
189 Dune::CachedLocalBasis<std::remove_cvref_t<LocalBasisType>> localBasis_;
190 // DefaultMembraneStrain membraneStrain_;
191 YoungsModulusAndPoissonsRatio mat_;
192 double thickness_;
193
194 size_t numberOfNodes_{0};
195 int order_{};
196
197protected:
212 auto computeMaterialAndStrains(const Dune::FieldVector<double, 2>& gpPos, int gpIndex, const Geometry& geo,
213 const auto& uFunction) const {
214 using ST = typename std::remove_cvref_t<decltype(uFunction)>::ctype;
215
217 using namespace Dune;
218 using namespace Dune::DerivativeDirections;
219 const auto [X, Jd, Hd] = geo.impl().zeroFirstAndSecondDerivativeOfPosition(gpPos);
220 kin.J = toEigen(Jd);
221 kin.H = toEigen(Hd);
222 const Eigen::Matrix<double, 2, 2> A = kin.J * kin.J.transpose();
223 Eigen::Matrix<double, 3, 3> G = Eigen::Matrix<double, 3, 3>::Zero();
224
225 G.block<2, 2>(0, 0) = A;
226 G(2, 2) = 1;
227 const Eigen::Matrix<double, 3, 3> GInv = G.inverse();
228 kin.C = materialTangent(GInv);
229
230 kin.epsV = DefaultMembraneStrain::value(gpPos, geo, uFunction);
231
232 const auto& Ndd = localBasis_.evaluateSecondDerivatives(gpIndex);
233 const auto uasMatrix = Dune::viewAsEigenMatrixAsDynFixed(uFunction.coefficientsRef());
234 const auto hessianu = Ndd.transpose().template cast<ST>() * uasMatrix;
235 kin.h = kin.H + hessianu;
236 const Eigen::Matrix<ST, 3, 2> gradu = toEigen(uFunction.evaluateDerivative(
237 gpIndex, Dune::wrt(spatialAll), Dune::on(Dune::DerivativeDirections::referenceElement)));
238 kin.j = kin.J + gradu.transpose();
239 kin.a3N = (kin.j.row(0).cross(kin.j.row(1)));
240 kin.a3 = kin.a3N.normalized();
241 Eigen::Vector<ST, 3> bV = kin.h * kin.a3;
242 bV(2) *= 2; // Voigt notation requires the two here
243 const auto BV = toVoigt(toEigen(geo.impl().secondFundamentalForm(gpPos)));
244 kin.kappaV = BV - bV;
245 return kin;
246 }
247
248 template <typename ST>
250 const Requirement& par, const MatrixAffordance& affordance, typename Traits::template MatrixType<ST> K,
251 const std::optional<std::reference_wrapper<const Eigen::VectorX<ST>>>& dx = std::nullopt) const {
252 if (affordance != MatrixAffordance::stiffness)
253 DUNE_THROW(Dune::NotImplemented, "MatrixAffordance not implemented: " + toString(affordance));
254 using namespace Dune::DerivativeDirections;
255 using namespace Dune;
256 const auto uFunction = displacementFunction(par, dx);
257 const auto& lambda = par.parameter();
258 const auto geo = underlying().localView().element().geometry();
259
260 for (const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
261 const auto intElement = geo.integrationElement(gp.position()) * gp.weight();
262 const auto [C, epsV, kappaV, jE, J, h, H, a3N, a3] =
263 computeMaterialAndStrains(gp.position(), gpIndex, geo, uFunction);
264 const Eigen::Vector<ST, membraneStrainSize> membraneForces = thickness_ * C * epsV;
265 const Eigen::Vector<ST, bendingStrainSize> moments = Dune::power(thickness_, 3) / 12.0 * C * kappaV;
266
267 const auto& Nd = localBasis_.evaluateJacobian(gpIndex);
268 const auto& Ndd = localBasis_.evaluateSecondDerivatives(gpIndex);
269 for (size_t i = 0; i < numberOfNodes_; ++i) {
270 Eigen::Matrix<ST, membraneStrainSize, worldDim> bopIMembrane =
271 DefaultMembraneStrain::derivative(gp.position(), jE, Nd, geo, uFunction, localBasis_, i);
272
273 Eigen::Matrix<ST, bendingStrainSize, worldDim> bopIBending = bopBending(jE, h, Nd, Ndd, i, a3N, a3);
274 for (size_t j = i; j < numberOfNodes_; ++j) {
275 auto KBlock = K.template block<worldDim, worldDim>(worldDim * i, worldDim * j);
276 Eigen::Matrix<ST, membraneStrainSize, worldDim> bopJMembrane =
277 DefaultMembraneStrain::derivative(gp.position(), jE, Nd, geo, uFunction, localBasis_, j);
278 Eigen::Matrix<ST, bendingStrainSize, worldDim> bopJBending = bopBending(jE, h, Nd, Ndd, j, a3N, a3);
279 KBlock += thickness_ * bopIMembrane.transpose() * C * bopJMembrane * intElement;
280 KBlock += Dune::power(thickness_, 3) / 12.0 * bopIBending.transpose() * C * bopJBending * intElement;
281
282 Eigen::Matrix<ST, worldDim, worldDim> kgMembraneIJ = DefaultMembraneStrain::secondDerivative(
283 gp.position(), Nd, geo, uFunction, localBasis_, membraneForces, i, j);
284 Eigen::Matrix<ST, worldDim, worldDim> kgBendingIJ = kgBending(jE, h, Nd, Ndd, a3N, a3, moments, i, j);
285 KBlock += kgMembraneIJ * intElement;
286 KBlock += kgBendingIJ * intElement;
287 }
288 }
289 }
290 K.template triangularView<Eigen::StrictlyLower>() = K.transpose();
291 }
292
293 template <typename ST>
295 const Requirement& par, const VectorAffordance& affordance, typename Traits::template VectorType<ST> force,
296 const std::optional<std::reference_wrapper<const Eigen::VectorX<ST>>>& dx = std::nullopt) const {
297 if (affordance != VectorAffordance::forces)
298 DUNE_THROW(Dune::NotImplemented, "VectorAffordance not implemented: " + toString(affordance));
299 using namespace Dune::DerivativeDirections;
300 using namespace Dune;
301 const auto uFunction = displacementFunction(par, dx);
302 const auto& lambda = par.parameter();
303 const auto geo = underlying().localView().element().geometry();
304
305 // Internal forces
306 for (const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
307 const auto [C, epsV, kappaV, jE, J, h, H, a3N, a3] =
308 computeMaterialAndStrains(gp.position(), gpIndex, geo, uFunction);
309 const Eigen::Vector<ST, 3> membraneForces = thickness_ * C * epsV;
310 const Eigen::Vector<ST, 3> moments = Dune::power(thickness_, 3) / 12.0 * C * kappaV;
311
312 const auto& Nd = localBasis_.evaluateJacobian(gpIndex);
313 const auto& Ndd = localBasis_.evaluateSecondDerivatives(gpIndex);
314 for (size_t i = 0; i < numberOfNodes_; ++i) {
315 Eigen::Matrix<ST, 3, 3> bopIMembrane =
316 DefaultMembraneStrain::derivative(gp.position(), jE, Nd, geo, uFunction, localBasis_, i);
317 Eigen::Matrix<ST, 3, 3> bopIBending = bopBending(jE, h, Nd, Ndd, i, a3N, a3);
318 force.template segment<3>(3 * i) +=
319 bopIMembrane.transpose() * membraneForces * geo.integrationElement(gp.position()) * gp.weight();
320 force.template segment<3>(3 * i) +=
321 bopIBending.transpose() * moments * geo.integrationElement(gp.position()) * gp.weight();
322 }
323 }
324 }
325
326 template <typename ST>
328 const Requirement& par, const ScalarAffordance& affordance,
329 const std::optional<std::reference_wrapper<const Eigen::VectorX<ST>>>& dx = std::nullopt) const -> ST {
331 DUNE_THROW(Dune::NotImplemented, "ScalarAffordance not implemented: " + toString(affordance));
332 using namespace Dune::DerivativeDirections;
333 using namespace Dune;
334 const auto uFunction = displacementFunction(par, dx);
335 const auto& lambda = par.parameter();
336 ST energy = 0.0;
337
338 const auto geo = underlying().localView().element().geometry();
339
340 for (const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
341 const auto [C, epsV, kappaV, j, J, h, H, a3N, a3] =
342 computeMaterialAndStrains(gp.position(), gpIndex, geo, uFunction);
343
344 const ST membraneEnergy = 0.5 * thickness_ * epsV.dot(C * epsV);
345 const ST bendingEnergy = 0.5 * Dune::power(thickness_, 3) / 12.0 * kappaV.dot(C * kappaV);
346 energy += (membraneEnergy + bendingEnergy) * geo.integrationElement(gp.position()) * gp.weight();
347 }
348
349 return energy;
350 }
351
352 template <typename ST>
353 Eigen::Matrix<ST, 3, 3> kgBending(const Eigen::Matrix<ST, 2, 3>& jcur, const Eigen::Matrix3<ST>& h, const auto& dN,
354 const auto& ddN, const Eigen::Vector3<ST>& a3N, const Eigen::Vector3<ST>& a3,
355 const Eigen::Vector3<ST>& S, int I, int J) const {
356 Eigen::Matrix<ST, 3, 3> kg;
357 kg.setZero();
358
359 const auto& dN1i = dN(I, 0);
360 const auto& dN1j = dN(J, 0);
361 const auto& dN2i = dN(I, 1);
362 const auto& dN2j = dN(J, 1);
363
364 const Eigen::Matrix<ST, 3, 3> P =
365 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose());
366
367 const auto a1dxI = Eigen::Matrix<double, 3, 3>::Identity() *
368 dN1i; // the auto here allows the exploitation of the identity matrices,
369 // due to Eigen's expression templates
370 const auto a2dxI = Eigen::Matrix<double, 3, 3>::Identity() * dN2i;
371 const auto a1dxJ = Eigen::Matrix<double, 3, 3>::Identity() * dN1j;
372 const auto a2dxJ = Eigen::Matrix<double, 3, 3>::Identity() * dN2j;
373 const auto a1 = jcur.row(0);
374 const auto a2 = jcur.row(1);
375 const Eigen::Matrix<ST, 3, 3> a3NdI = a1dxI.colwise().cross(a2) - a2dxI.colwise().cross(a1);
376 const Eigen::Matrix<ST, 3, 3> a3NdJ = a1dxJ.colwise().cross(a2) - a2dxJ.colwise().cross(a1);
377 Eigen::Matrix<ST, 3, 3> a3dI = P * a3NdI;
378 Eigen::Matrix<ST, 3, 3> a3dJ = P * a3NdJ;
379 for (int i = 0; i < 3; ++i) {
380 const auto a_albe = h.row(i).transpose();
381 const auto& ddNI = ddN(I, i);
382 const auto& ddNJ = ddN(J, i);
383 Eigen::Vector3<ST> vecd = P * a_albe;
384
385 Eigen::Matrix<ST, 3, 3> a3Ndd =
386 1.0 / a3N.squaredNorm() *
387 ((3 * a3 * a3.transpose() - Eigen::Matrix<double, 3, 3>::Identity()) * (a3.dot(a_albe)) -
388 a_albe * a3.transpose() - a3 * a_albe.transpose());
389
390 Eigen::Matrix<ST, 3, 3> secondDerivativeDirectorIJ = skew(((dN2i * dN1j - dN1i * dN2j) * vecd).eval());
391 kg -= (a3NdI.transpose() * a3Ndd * a3NdJ + secondDerivativeDirectorIJ + (ddNI * a3dJ + ddNJ * a3dI.transpose())) *
392 S[i] * (i == 2 ? 2 : 1);
393 }
394
395 return kg;
396 }
397
398 template <typename ST>
399 Eigen::Matrix<ST, 3, 3> bopBending(const Eigen::Matrix<ST, 2, 3>& jcur, const Eigen::Matrix3<ST>& h, const auto& dN,
400 const auto& ddN, const int node, const Eigen::Vector3<ST>& a3N,
401 const Eigen::Vector3<ST>& a3) const {
402 const Eigen::Matrix<ST, 3, 3> a1dxI =
403 Eigen::Matrix<double, 3, 3>::Identity() * dN(node, 0); // this should be double
404 // but the cross-product below complains otherwise
405 const Eigen::Matrix<ST, 3, 3> a2dxI = Eigen::Matrix<double, 3, 3>::Identity() * dN(node, 1);
406 const auto a1 = jcur.row(0);
407 const auto a2 = jcur.row(1);
408 const Eigen::Matrix<ST, 3, 3> a3NdI =
409 a1dxI.colwise().cross(a2) - a2dxI.colwise().cross(a1); // minus needed since order has
410 // to be swapped to get column-wise cross product working
411 const Eigen::Matrix<ST, 3, 3> a3d1 =
412 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose()) * a3NdI;
413
414 Eigen::Matrix<ST, 3, 3> bop = -(h * a3d1 + (a3 * ddN.row(node)).transpose());
415 bop.row(2) *= 2;
416
417 return bop;
418 }
419
426 Eigen::Matrix<double, 3, 3> materialTangent(const Eigen::Matrix<double, 3, 3>& Aconv) const {
427 const double lambda = mat_.emodul * mat_.nu / ((1.0 + mat_.nu) * (1.0 - 2.0 * mat_.nu));
428 const double mu = mat_.emodul / (2.0 * (1.0 + mat_.nu));
429 const double lambdbar = 2.0 * lambda * mu / (lambda + 2.0 * mu);
430 Eigen::TensorFixedSize<double, Eigen::Sizes<3, 3, 3, 3>> moduli;
431 const auto AconvT = tensorView(Aconv, std::array<Eigen::Index, 2>({3, 3}));
432 moduli = lambdbar * dyadic(AconvT, AconvT).eval() + 2.0 * mu * symmetricFourthOrder<double>(Aconv, Aconv);
433
434 auto C = toVoigt(moduli);
435 Eigen::Matrix<double, 3, 3> C33 = C({0, 1, 5}, {0, 1, 5});
436 return C33;
437 }
438};
439
444struct KlArgs
445{
447 double nu;
448 double thickness;
449};
450
456auto kirchhoffLoveShell(const KlArgs& args) {
457 KirchhoffLoveShellPre pre({.emodul = args.youngs_modulus, .nu = args.nu}, args.thickness);
458
459 return pre;
460}
461} // namespace Ikarus
Helper for the autodiff library.
Definition of the LinearElastic class for finite element mechanics computations.
Implementation of membrane strain for shells.
Header file for types of loads in Ikarus finite element mechanics.
Material property functions and conversion utilities.
Derived skew(const Eigen::MatrixBase< Derived > &A)
Returns the skew part of a matrix.
Definition: linearalgebrahelper.hh:410
auto viewAsEigenMatrixAsDynFixed(Dune::BlockVector< ValueType > &blockedVector)
View Dune::BlockVector as an Eigen::Matrix with dynamic rows and fixed columns depending on the size ...
Definition: linearalgebrahelper.hh:88
constexpr Eigen::Index toVoigt(Eigen::Index i, Eigen::Index j) noexcept
Converts 2D indices to Voigt notation index.
Definition: tensorutils.hh:166
Eigen::Tensor< typename Derived::Scalar, rank > tensorView(const Eigen::EigenBase< Derived > &matrix, const std::array< T, rank > &dims)
View an Eigen matrix as an Eigen Tensor with specified dimensions.
Definition: tensorutils.hh:32
auto dyadic(const auto &A_ij, const auto &B_kl)
Computes the dyadic product of two Eigen tensors.
Definition: tensorutils.hh:47
Definition: dirichletbcenforcement.hh:6
MatrixAffordance
A strongly typed enum class representing the matrix affordance.
Definition: ferequirements.hh:63
VectorAffordance
A strongly typed enum class representing the vector affordance.
Definition: ferequirements.hh:48
auto transpose(const Eigen::EigenBase< Derived > &A)
auto kirchhoffLoveShell(const KlArgs &args)
A helper function to create a Kirchhoff-Love shell pre finite element.
Definition: kirchhoffloveshell.hh:456
constexpr std::string toString(DBCOption _e)
Definition: dirichletbcenforcement.hh:7
ScalarAffordance
A strongly typed enum class representing the scalar affordance.
Definition: ferequirements.hh:37
Definition: utils/dirichletvalues.hh:28
FE class is a base class for all finite elements.
Definition: febase.hh:79
FETraits< BH, useEigenRef, useFlat > Traits
Definition: febase.hh:38
Class representing the requirements for finite element calculations.
Definition: ferequirements.hh:252
SolutionVectorReturnType globalSolution()
Get the global solution vector.
Definition: ferequirements.hh:308
PMHelper::ConstReturnType parameter() const
Get the parameter value.
Definition: ferequirements.hh:325
Container that is used for FE Results. It gives access to the stored value, but can also be used to a...
Definition: feresulttypes.hh:155
Traits for handling finite elements.
Definition: fetraits.hh:25
typename Basis::LocalView LocalView
Type of the local view.
Definition: fetraits.hh:42
typename Element::Geometry Geometry
Type of the element geometry.
Definition: fetraits.hh:51
BH BasisHandler
Type of the basis of the finite element.
Definition: fetraits.hh:27
typename Basis::GridView GridView
Type of the grid view.
Definition: fetraits.hh:45
static constexpr int worlddim
Dimension of the world space.
Definition: fetraits.hh:60
typename BasisHandler::FlatBasis FlatBasis
Type of the flat basis.
Definition: fetraits.hh:33
typename LocalView::Element Element
Type of the grid element.
Definition: fetraits.hh:48
static constexpr int mydim
Dimension of the geometry.
Definition: fetraits.hh:63
Kirchhoff-Love shell finite element class.
Definition: kirchhoffloveshell.hh:50
Eigen::Matrix< double, 3, 3 > materialTangent(const Eigen::Matrix< double, 3, 3 > &Aconv) const
Gets the material tangent matrix for the linear elastic material.
Definition: kirchhoffloveshell.hh:426
typename Traits::Element Element
Definition: kirchhoffloveshell.hh:60
typename Traits::Geometry Geometry
Definition: kirchhoffloveshell.hh:58
void calculateVectorImpl(const Requirement &par, const VectorAffordance &affordance, typename Traits::template VectorType< ST > force, const std::optional< std::reference_wrapper< const Eigen::VectorX< ST > > > &dx=std::nullopt) const
Definition: kirchhoffloveshell.hh:294
auto displacementFunction(const Requirement &par, const std::optional< std::reference_wrapper< const Eigen::VectorX< ST > > > &dx=std::nullopt) const
Get the displacement function and nodal displacements.
Definition: kirchhoffloveshell.hh:141
auto computeMaterialAndStrains(const Dune::FieldVector< double, 2 > &gpPos, int gpIndex, const Geometry &geo, const auto &uFunction) const
Compute material properties and strains at a given integration point.
Definition: kirchhoffloveshell.hh:212
size_t numberOfNodes() const
Definition: kirchhoffloveshell.hh:152
static constexpr int myDim
Definition: kirchhoffloveshell.hh:64
auto calculateAtImpl(const Requirement &req, const Dune::FieldVector< double, Traits::mydim > &local) -> ResultWrapper< RT< double, myDim, worldDim >, ResultShape::Vector >
Calculates a requested result at a specific local position.
Definition: kirchhoffloveshell.hh:178
static constexpr int bendingStrainSize
Definition: kirchhoffloveshell.hh:67
static consteval bool canProvideResultType()
Returns whether an element can provide a requested result. Can be used in constant expressions.
Definition: kirchhoffloveshell.hh:161
Geometry geometry() const
Definition: kirchhoffloveshell.hh:151
decltype(std::declval< LocalView >().tree().child(0).finiteElement().localBasis()) LocalBasisType
Definition: kirchhoffloveshell.hh:61
typename Traits::GridView GridView
Definition: kirchhoffloveshell.hh:59
static constexpr int worldDim
Definition: kirchhoffloveshell.hh:65
void bindImpl()
A helper function to bind the local view to the element.
Definition: kirchhoffloveshell.hh:107
typename Traits::FlatBasis FlatBasis
Definition: kirchhoffloveshell.hh:54
KirchhoffLoveShell(const Pre &pre)
Constructor for the KirchhoffLoveShell class.
Definition: kirchhoffloveshell.hh:99
void calculateMatrixImpl(const Requirement &par, const MatrixAffordance &affordance, typename Traits::template MatrixType< ST > K, const std::optional< std::reference_wrapper< const Eigen::VectorX< ST > > > &dx=std::nullopt) const
Definition: kirchhoffloveshell.hh:249
typename Traits::LocalView LocalView
Definition: kirchhoffloveshell.hh:57
typename Traits::BasisHandler BasisHandler
Definition: kirchhoffloveshell.hh:53
Eigen::Matrix< ST, 3, 3 > kgBending(const Eigen::Matrix< ST, 2, 3 > &jcur, const Eigen::Matrix3< ST > &h, const auto &dN, const auto &ddN, const Eigen::Vector3< ST > &a3N, const Eigen::Vector3< ST > &a3, const Eigen::Vector3< ST > &S, int I, int J) const
Definition: kirchhoffloveshell.hh:353
Eigen::Matrix< ST, 3, 3 > bopBending(const Eigen::Matrix< ST, 2, 3 > &jcur, const Eigen::Matrix3< ST > &h, const auto &dN, const auto &ddN, const int node, const Eigen::Vector3< ST > &a3N, const Eigen::Vector3< ST > &a3) const
Definition: kirchhoffloveshell.hh:399
static constexpr int membraneStrainSize
Definition: kirchhoffloveshell.hh:66
auto calculateScalarImpl(const Requirement &par, const ScalarAffordance &affordance, const std::optional< std::reference_wrapper< const Eigen::VectorX< ST > > > &dx=std::nullopt) const -> ST
Definition: kirchhoffloveshell.hh:327
std::tuple<> SupportedResultTypes
Definition: kirchhoffloveshell.hh:165
int order() const
Definition: kirchhoffloveshell.hh:153
A PreFE struct for Kirchhoff-Love shell elements.
Definition: kirchhoffloveshell.hh:30
double thickness
Definition: kirchhoffloveshell.hh:32
YoungsModulusAndPoissonsRatio material
Definition: kirchhoffloveshell.hh:31
A structure representing kinematic variables.
Definition: kirchhoffloveshell.hh:80
Eigen::Matrix3< double > H
Hessian of the reference geometry.
Definition: kirchhoffloveshell.hh:87
Eigen::Vector3< ST > kappaV
bending strain in Voigt notation
Definition: kirchhoffloveshell.hh:83
Eigen::Matrix< double, 3, 3 > C
material tangent
Definition: kirchhoffloveshell.hh:81
Eigen::Matrix< ST, 2, 3 > j
Jacobian of the deformed geometry.
Definition: kirchhoffloveshell.hh:84
Eigen::Vector3< ST > epsV
membrane strain in Voigt notation
Definition: kirchhoffloveshell.hh:82
Eigen::Matrix3< ST > h
Hessian of the deformed geometry.
Definition: kirchhoffloveshell.hh:86
Eigen::Vector3< ST > a3N
Normal vector of the deformed geometry.
Definition: kirchhoffloveshell.hh:88
Eigen::Vector3< ST > a3
normalized normal vector of the deformed geometry
Definition: kirchhoffloveshell.hh:89
Eigen::Matrix< double, 2, 3 > J
Jacobian of the reference geometry.
Definition: kirchhoffloveshell.hh:85
A struct containing information about the Youngs Modulus, Poisson's ratio and the thickness for the K...
Definition: kirchhoffloveshell.hh:445
double youngs_modulus
Definition: kirchhoffloveshell.hh:446
double nu
Definition: kirchhoffloveshell.hh:447
double thickness
Definition: kirchhoffloveshell.hh:448
static auto derivative(const Dune::FieldVector< double, 2 > &gpPos, const Eigen::Matrix< ST, 2, 3 > &jcur, const auto &dNAtGp, const GEO &geo, const auto &uFunction, const auto &localBasis, const int node)
Compute the strain-displacement matrix for a given node and integration point.
Definition: membranestrains.hh:65
static auto secondDerivative(const Dune::FieldVector< double, 2 > &gpPos, const auto &dNAtGp, const GEO &geo, const auto &uFunction, const auto &localBasis, const Eigen::Vector3< ST > &S, int I, int J)
Compute the second derivative of the membrane strain for a given node pair and integration point.
Definition: membranestrains.hh:96
static auto value(const Dune::FieldVector< double, 2 > &gpPos, const GEO &geo, const auto &uFunction) -> Eigen::Vector3< typename std::remove_cvref_t< decltype(uFunction)>::ctype >
Compute the strain vector at a given integration point.
Definition: membranestrains.hh:31
Structure representing Young's modulus and shear modulus.
Definition: physicshelper.hh:53
Definition: utils/dirichletvalues.hh:30