version 0.4
finiteelements/mechanics/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/fufem/boundarypatch.hh>
12#include <dune/geometry/quadraturerules.hh>
13#include <dune/localfefunctions/cachedlocalBasis/cachedlocalBasis.hh>
14#include <dune/localfefunctions/impl/standardLocalFunction.hh>
15#include <dune/localfefunctions/manifolds/realTuple.hh>
16
24
25namespace Ikarus {
26
38 template <typename Basis_, typename FERequirements_ = FERequirements<>, bool useEigenRef = false>
39 class KirchhoffLoveShell : public PowerBasisFE<typename Basis_::FlatBasis>,
40 public Volume<KirchhoffLoveShell<Basis_, FERequirements_, useEigenRef>,
41 TraitsFromFE<Basis_, FERequirements_, useEigenRef>>,
42 public Traction<KirchhoffLoveShell<Basis_, FERequirements_, useEigenRef>,
43 TraitsFromFE<Basis_, FERequirements_, useEigenRef>> {
44 public:
46 using Basis = typename Traits::Basis;
47 using FlatBasis = typename Traits::FlatBasis;
49 using LocalView = typename Traits::LocalView;
50 using Geometry = typename Traits::Geometry;
51 using GridView = typename Traits::GridView;
52 using Element = typename Traits::Element;
54 using BasePowerFE = PowerBasisFE<FlatBasis>; // Handles globalIndices function
57 using LocalBasisType = decltype(std::declval<LocalView>().tree().child(0).finiteElement().localBasis());
58
59 static constexpr int myDim = Traits::mydim;
60 static constexpr int worldDim = Traits::worlddim;
61 static constexpr int membraneStrainSize = 3;
62 static constexpr int bendingStrainSize = 3;
63
73 template <typename ScalarType = double>
75 Eigen::Matrix<double, 3, 3> C;
76 Eigen::Vector3<ScalarType> epsV;
77 Eigen::Vector3<ScalarType> kappaV;
78 Eigen::Matrix<ScalarType, 2, 3> j;
79 Eigen::Matrix<double, 2, 3> J;
80 Eigen::Matrix3<ScalarType> h;
81 Eigen::Matrix3<double> H;
82 Eigen::Vector3<ScalarType> a3N;
83 Eigen::Vector3<ScalarType> a3;
84 };
85
102 template <typename VolumeLoad = utils::LoadDefault, typename NeumannBoundaryLoad = utils::LoadDefault>
103 KirchhoffLoveShell(const Basis& globalBasis, const typename LocalView::Element& element, double emod, double nu,
104 double thickness, VolumeLoad p_volumeLoad = {},
105 const BoundaryPatch<GridView>* p_neumannBoundary = nullptr,
106 NeumannBoundaryLoad p_neumannBoundaryLoad = {})
107 : BasePowerFE(globalBasis.flat(), element),
108 VolumeType(p_volumeLoad),
109 TractionType(p_neumannBoundary, p_neumannBoundaryLoad),
110 emod_{emod},
111 nu_{nu},
112 thickness_{thickness} {
113 this->localView().bind(element);
114 auto& first_child = this->localView().tree().child(0);
115 const auto& fe = first_child.finiteElement();
116 geo_ = std::make_shared<const Geometry>(this->localView().element().geometry());
117 numberOfNodes_ = fe.size();
118 order_ = 2 * (fe.localBasis().order());
119 localBasis = Dune::CachedLocalBasis(fe.localBasis());
120 if constexpr (requires { this->localView().element().impl().getQuadratureRule(order_); })
121 if (this->localView().element().impl().isTrimmed())
122 localBasis.bind(this->localView().element().impl().getQuadratureRule(order_), Dune::bindDerivatives(0, 1, 2));
123 else
124 localBasis.bind(Dune::QuadratureRules<double, myDim>::rule(this->localView().element().type(), order_),
125 Dune::bindDerivatives(0, 1, 2));
126 else
127 localBasis.bind(Dune::QuadratureRules<double, myDim>::rule(this->localView().element().type(), order_),
128 Dune::bindDerivatives(0, 1, 2));
129 }
130
131 public:
142 template <typename ScalarType = double>
144 const std::optional<const Eigen::VectorX<ScalarType>>& dx = std::nullopt) const {
145 const auto& d = par.getGlobalSolution(Ikarus::FESolutions::displacement);
146 auto disp = Ikarus::FEHelper::localSolutionBlockVector<Traits>(d, this->localView(), dx);
147 Dune::StandardLocalFunction uFunction(localBasis, disp, geo_);
148 return uFunction;
149 }
150
151 const Geometry& geometry() const { return *geo_; }
152 [[nodiscard]] size_t numberOfNodes() const { return numberOfNodes_; }
153 [[nodiscard]] int order() const { return order_; }
154
163 double calculateScalar(const FERequirementType& req) const { return calculateScalarImpl<double>(req); }
164
172 void calculateVector(const FERequirementType& req, typename Traits::template VectorType<> force) const {
173 calculateVectorImpl<double>(req, force);
174 }
182 void calculateMatrix(const FERequirementType& req, typename Traits::template MatrixType<> K) const {
183 calculateMatrixImpl<double>(req, K);
184 }
185
196 void calculateAt([[maybe_unused]] const ResultRequirementsType& req,
197 [[maybe_unused]] const Dune::FieldVector<double, Traits::mydim>& local,
198 [[maybe_unused]] ResultTypeMap<double>& result) const {
199 DUNE_THROW(Dune::NotImplemented, "No results are implemented");
200 }
201
202 private:
203 std::shared_ptr<const Geometry> geo_;
204 Dune::CachedLocalBasis<std::remove_cvref_t<LocalBasisType>> localBasis;
205 DefaultMembraneStrain membraneStrain;
206 double emod_;
207 double nu_;
208 double thickness_;
209 size_t numberOfNodes_{0};
210 int order_{};
211
212 protected:
232 auto computeMaterialAndStrains(const Dune::FieldVector<double, 2>& gpPos, int gpIndex, const Geometry& geo,
233 const auto& uFunction) const {
234 using ScalarType = typename std::remove_cvref_t<decltype(uFunction)>::ctype;
235
237 using namespace Dune;
238 using namespace Dune::DerivativeDirections;
239 const auto [X, Jd, Hd] = geo_->impl().zeroFirstAndSecondDerivativeOfPosition(gpPos);
240 kin.J = toEigen(Jd);
241 kin.H = toEigen(Hd);
242 const Eigen::Matrix<double, 2, 2> A = kin.J * kin.J.transpose();
243 Eigen::Matrix<double, 3, 3> G = Eigen::Matrix<double, 3, 3>::Zero();
244
245 G.block<2, 2>(0, 0) = A;
246 G(2, 2) = 1;
247 const Eigen::Matrix<double, 3, 3> GInv = G.inverse();
248 kin.C = materialTangent(GInv);
249
250 kin.epsV = membraneStrain.value(gpPos, geo, uFunction);
251
252 const auto& Ndd = localBasis.evaluateSecondDerivatives(gpIndex);
253 const auto uasMatrix = Dune::viewAsEigenMatrixAsDynFixed(uFunction.coefficientsRef());
254 const auto hessianu = Ndd.transpose().template cast<ScalarType>() * uasMatrix;
255 kin.h = kin.H + hessianu;
256 const Eigen::Matrix<ScalarType, 3, 2> gradu = toEigen(uFunction.evaluateDerivative(
257 gpIndex, Dune::wrt(spatialAll), Dune::on(Dune::DerivativeDirections::referenceElement)));
258 kin.j = kin.J + gradu.transpose();
259 kin.a3N = (kin.j.row(0).cross(kin.j.row(1)));
260 kin.a3 = kin.a3N.normalized();
261 Eigen::Vector<ScalarType, 3> bV = kin.h * kin.a3;
262 bV(2) *= 2; // Voigt notation requires the two here
263 const auto BV = toVoigt(toEigen(geo_->impl().secondFundamentalForm(gpPos)));
264 kin.kappaV = BV - bV;
265 return kin;
266 }
267
268 template <typename ScalarType>
269 void calculateMatrixImpl(const FERequirementType& par, typename Traits::template MatrixType<ScalarType> K,
270 const std::optional<const Eigen::VectorX<ScalarType>>& dx = std::nullopt) const {
271 K.setZero();
272 using namespace Dune::DerivativeDirections;
273 using namespace Dune;
274 const auto uFunction = displacementFunction(par, dx);
275 const auto& lambda = par.getParameter(FEParameter::loadfactor);
276
277 for (const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
278 const auto intElement = geo_->integrationElement(gp.position()) * gp.weight();
279 const auto [C, epsV, kappaV, jE, J, h, H, a3N, a3]
280 = computeMaterialAndStrains(gp.position(), gpIndex, *geo_, uFunction);
281 const Eigen::Vector<ScalarType, membraneStrainSize> membraneForces = thickness_ * C * epsV;
282 const Eigen::Vector<ScalarType, bendingStrainSize> moments = Dune::power(thickness_, 3) / 12.0 * C * kappaV;
283
284 const auto& Nd = localBasis.evaluateJacobian(gpIndex);
285 const auto& Ndd = localBasis.evaluateSecondDerivatives(gpIndex);
286 for (size_t i = 0; i < numberOfNodes_; ++i) {
287 Eigen::Matrix<ScalarType, membraneStrainSize, worldDim> bopIMembrane
288 = membraneStrain.derivative(gp.position(), jE, Nd, *geo_, uFunction, localBasis, i);
289
290 Eigen::Matrix<ScalarType, bendingStrainSize, worldDim> bopIBending = bopBending(jE, h, Nd, Ndd, i, a3N, a3);
291 for (size_t j = i; j < numberOfNodes_; ++j) {
292 auto KBlock = K.template block<worldDim, worldDim>(worldDim * i, worldDim * j);
293 Eigen::Matrix<ScalarType, membraneStrainSize, worldDim> bopJMembrane
294 = membraneStrain.derivative(gp.position(), jE, Nd, *geo_, uFunction, localBasis, j);
295 Eigen::Matrix<ScalarType, bendingStrainSize, worldDim> bopJBending = bopBending(jE, h, Nd, Ndd, j, a3N, a3);
296 KBlock += thickness_ * bopIMembrane.transpose() * C * bopJMembrane * intElement;
297 KBlock += Dune::power(thickness_, 3) / 12.0 * bopIBending.transpose() * C * bopJBending * intElement;
298
299 Eigen::Matrix<ScalarType, worldDim, worldDim> kgMembraneIJ = membraneStrain.secondDerivative(
300 gp.position(), Nd, *geo_, uFunction, localBasis, membraneForces, i, j);
301 Eigen::Matrix<ScalarType, worldDim, worldDim> kgBendingIJ
302 = kgBending(jE, h, Nd, Ndd, a3N, a3, moments, i, j);
303 KBlock += kgMembraneIJ * intElement;
304 KBlock += kgBendingIJ * intElement;
305 }
306 }
307 }
308 K.template triangularView<Eigen::StrictlyLower>() = K.transpose();
309
310 // Update due to displacement-dependent external loads, e.g., follower loads
313 }
314
315 template <typename ScalarType>
316 void calculateVectorImpl(const FERequirementType& par, typename Traits::template VectorType<ScalarType> force,
317 const std::optional<const Eigen::VectorX<ScalarType>>& dx = std::nullopt) const {
318 force.setZero();
319 using namespace Dune::DerivativeDirections;
320 using namespace Dune;
321 const auto uFunction = displacementFunction(par, dx);
322 const auto& lambda = par.getParameter(FEParameter::loadfactor);
323
324 // Internal forces
325 for (const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
326 const auto [C, epsV, kappaV, jE, J, h, H, a3N, a3]
327 = computeMaterialAndStrains(gp.position(), gpIndex, *geo_, uFunction);
328 const Eigen::Vector<ScalarType, 3> membraneForces = thickness_ * C * epsV;
329 const Eigen::Vector<ScalarType, 3> moments = Dune::power(thickness_, 3) / 12.0 * C * kappaV;
330
331 const auto& Nd = localBasis.evaluateJacobian(gpIndex);
332 const auto& Ndd = localBasis.evaluateSecondDerivatives(gpIndex);
333 for (size_t i = 0; i < numberOfNodes_; ++i) {
334 Eigen::Matrix<ScalarType, 3, 3> bopIMembrane
335 = membraneStrain.derivative(gp.position(), jE, Nd, *geo_, uFunction, localBasis, i);
336 Eigen::Matrix<ScalarType, 3, 3> bopIBending = bopBending(jE, h, Nd, Ndd, i, a3N, a3);
337 force.template segment<3>(3 * i)
338 += bopIMembrane.transpose() * membraneForces * geo_->integrationElement(gp.position()) * gp.weight();
339 force.template segment<3>(3 * i)
340 += bopIBending.transpose() * moments * geo_->integrationElement(gp.position()) * gp.weight();
341 }
342 }
343
344 // External forces volume forces over the domain
345 VolumeType::calculateVectorImpl(par, force, dx);
346
347 // External forces, boundary forces, i.e., at the Neumann boundary
348 TractionType::calculateVectorImpl(par, force, dx);
349 }
350
351 template <typename ScalarType>
352 auto calculateScalarImpl(const FERequirementType& par, const std::optional<const Eigen::VectorX<ScalarType>>& dx
353 = std::nullopt) const -> ScalarType {
354 using namespace Dune::DerivativeDirections;
355 using namespace Dune;
356 const auto uFunction = displacementFunction(par, dx);
357 const auto& lambda = par.getParameter(Ikarus::FEParameter::loadfactor);
358 ScalarType energy = 0.0;
359
360 for (const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
361 const auto [C, epsV, kappaV, j, J, h, H, a3N, a3]
362 = computeMaterialAndStrains(gp.position(), gpIndex, *geo_, uFunction);
363
364 const ScalarType membraneEnergy = 0.5 * thickness_ * epsV.dot(C * epsV);
365 const ScalarType bendingEnergy = 0.5 * Dune::power(thickness_, 3) / 12.0 * kappaV.dot(C * kappaV);
366 energy += (membraneEnergy + bendingEnergy) * geo_->integrationElement(gp.position()) * gp.weight();
367 }
368
369 // External forces volume forces over the domain
370 energy += VolumeType::calculateScalarImpl(par, dx);
371
372 // line or surface loads, i.e., neumann boundary
373 energy += TractionType::calculateScalarImpl(par, dx);
374 return energy;
375 }
376
377 template <typename ScalarType>
378 Eigen::Matrix<ScalarType, 3, 3> kgBending(const Eigen::Matrix<ScalarType, 2, 3>& jcur,
379 const Eigen::Matrix3<ScalarType>& h, const auto& dN, const auto& ddN,
380 const Eigen::Vector3<ScalarType>& a3N,
381 const Eigen::Vector3<ScalarType>& a3, const Eigen::Vector3<ScalarType>& S,
382 int I, int J) const {
383 Eigen::Matrix<ScalarType, 3, 3> kg;
384 kg.setZero();
385
386 const auto& dN1i = dN(I, 0);
387 const auto& dN1j = dN(J, 0);
388 const auto& dN2i = dN(I, 1);
389 const auto& dN2j = dN(J, 1);
390
391 const Eigen::Matrix<ScalarType, 3, 3> P
392 = 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose());
393
394 const auto a1dxI = Eigen::Matrix<double, 3, 3>::Identity()
395 * dN1i; // the auto here allows the exploitation of the identity matrices,
396 // due to Eigen's expression templates
397 const auto a2dxI = Eigen::Matrix<double, 3, 3>::Identity() * dN2i;
398 const auto a1dxJ = Eigen::Matrix<double, 3, 3>::Identity() * dN1j;
399 const auto a2dxJ = Eigen::Matrix<double, 3, 3>::Identity() * dN2j;
400 const auto a1 = jcur.row(0);
401 const auto a2 = jcur.row(1);
402 const Eigen::Matrix<ScalarType, 3, 3> a3NdI = a1dxI.colwise().cross(a2) - a2dxI.colwise().cross(a1);
403 const Eigen::Matrix<ScalarType, 3, 3> a3NdJ = a1dxJ.colwise().cross(a2) - a2dxJ.colwise().cross(a1);
404 Eigen::Matrix<ScalarType, 3, 3> a3dI = P * a3NdI;
405 Eigen::Matrix<ScalarType, 3, 3> a3dJ = P * a3NdJ;
406 for (int i = 0; i < 3; ++i) {
407 const auto a_albe = h.row(i).transpose();
408 const auto& ddNI = ddN(I, i);
409 const auto& ddNJ = ddN(J, i);
410 Eigen::Vector3<ScalarType> vecd = P * a_albe;
411
412 Eigen::Matrix<ScalarType, 3, 3> a3Ndd
413 = 1.0 / a3N.squaredNorm()
414 * ((3 * a3 * a3.transpose() - Eigen::Matrix<double, 3, 3>::Identity()) * (a3.dot(a_albe))
415 - a_albe * a3.transpose() - a3 * a_albe.transpose());
416
417 Eigen::Matrix<ScalarType, 3, 3> secondDerivativeDirectorIJ = skew(((dN2i * dN1j - dN1i * dN2j) * vecd).eval());
418 kg -= (a3NdI.transpose() * a3Ndd * a3NdJ + secondDerivativeDirectorIJ + (ddNI * a3dJ + ddNJ * a3dI.transpose()))
419 * S[i] * (i == 2 ? 2 : 1);
420 }
421
422 return kg;
423 }
424
425 template <typename ScalarType>
426 Eigen::Matrix<ScalarType, 3, 3> bopBending(const Eigen::Matrix<ScalarType, 2, 3>& jcur,
427 const Eigen::Matrix3<ScalarType>& h, const auto& dN, const auto& ddN,
428 const int node, const Eigen::Vector3<ScalarType>& a3N,
429 const Eigen::Vector3<ScalarType>& a3) const {
430 const Eigen::Matrix<ScalarType, 3, 3> a1dxI
431 = Eigen::Matrix<double, 3, 3>::Identity() * dN(node, 0); // this should be double
432 // but the cross-product below complains otherwise
433 const Eigen::Matrix<ScalarType, 3, 3> a2dxI = Eigen::Matrix<double, 3, 3>::Identity() * dN(node, 1);
434 const auto a1 = jcur.row(0);
435 const auto a2 = jcur.row(1);
436 const Eigen::Matrix<ScalarType, 3, 3> a3NdI
437 = a1dxI.colwise().cross(a2) - a2dxI.colwise().cross(a1); // minus needed since order has
438 // to be swapped to get column-wise cross product working
439 const Eigen::Matrix<ScalarType, 3, 3> a3d1
440 = 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose()) * a3NdI;
441
442 Eigen::Matrix<ScalarType, 3, 3> bop = -(h * a3d1 + (a3 * ddN.row(node)).transpose());
443 bop.row(2) *= 2;
444
445 return bop;
446 }
447
448 Eigen::Matrix<double, 3, 3> materialTangent(const Eigen::Matrix<double, 3, 3>& Aconv) const {
449 const double lambda = emod_ * nu_ / ((1.0 + nu_) * (1.0 - 2.0 * nu_));
450 const double mu = emod_ / (2.0 * (1.0 + nu_));
451 const double lambdbar = 2.0 * lambda * mu / (lambda + 2.0 * mu);
452 Eigen::TensorFixedSize<double, Eigen::Sizes<3, 3, 3, 3>> moduli;
453 const auto AconvT = tensorView(Aconv, std::array<Eigen::Index, 2>({3, 3}));
454 moduli = lambdbar * dyadic(AconvT, AconvT).eval() + 2.0 * mu * symmetricFourthOrder<double>(Aconv, Aconv);
455
456 auto C = toVoigt(moduli);
457 Eigen::Matrix<double, 3, 3> C33 = C({0, 1, 5}, {0, 1, 5});
458 return C33;
459 }
460 };
461} // namespace Ikarus
Contains the PowerBasisFE class, which works with a power basis in FlatInterLeaved elements.
Material property functions and conversion utilities.
Definition of the LinearElastic class for finite element mechanics computations.
Header file for material models in Ikarus finite element mechanics.
Header file for types of loads in Ikarus finite element mechanics.
Implementation of membrane strain for shells.
Derived skew(const Eigen::MatrixBase< Derived > &A)
Returns the skew part of a matrix.
Definition: linearalgebrahelper.hh:407
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:167
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: simpleassemblers.hh:21
auto transpose(const Eigen::EigenBase< Derived > &A)
Definition: resultevaluators.hh:17
PowerBasisFE class for working with a power basis in FlatInterLeaved elements.
Definition: powerbasisfe.hh:23
const LocalView & localView() const
Get the const reference to the local view.
Definition: powerbasisfe.hh:84
Class representing a map of result types to result arrays.
Definition: ferequirements.hh:342
Kirchhoff-Love shell finite element class.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:43
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: finiteelements/mechanics/kirchhoffloveshell.hh:232
Eigen::Matrix< ScalarType, 3, 3 > kgBending(const Eigen::Matrix< ScalarType, 2, 3 > &jcur, const Eigen::Matrix3< ScalarType > &h, const auto &dN, const auto &ddN, const Eigen::Vector3< ScalarType > &a3N, const Eigen::Vector3< ScalarType > &a3, const Eigen::Vector3< ScalarType > &S, int I, int J) const
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:378
void calculateVector(const FERequirementType &req, typename Traits::template VectorType<> force) const
Calculate the vector associated with the given FERequirementType.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:172
static constexpr int myDim
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:59
static constexpr int membraneStrainSize
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:61
auto displacementFunction(const FERequirementType &par, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const
Get the displacement function and nodal displacements.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:143
typename Traits::Geometry Geometry
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:50
typename Traits::Element Element
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:52
void calculateVectorImpl(const FERequirementType &par, typename Traits::template VectorType< ScalarType > force, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:316
size_t numberOfNodes() const
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:152
typename Traits::FERequirementType FERequirementType
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:48
typename Traits::ResultRequirementsType ResultRequirementsType
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:53
auto calculateScalarImpl(const FERequirementType &par, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const -> ScalarType
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:352
Eigen::Matrix< ScalarType, 3, 3 > bopBending(const Eigen::Matrix< ScalarType, 2, 3 > &jcur, const Eigen::Matrix3< ScalarType > &h, const auto &dN, const auto &ddN, const int node, const Eigen::Vector3< ScalarType > &a3N, const Eigen::Vector3< ScalarType > &a3) const
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:426
int order() const
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:153
Eigen::Matrix< double, 3, 3 > materialTangent(const Eigen::Matrix< double, 3, 3 > &Aconv) const
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:448
void calculateMatrixImpl(const FERequirementType &par, typename Traits::template MatrixType< ScalarType > K, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:269
decltype(std::declval< LocalView >().tree().child(0).finiteElement().localBasis()) LocalBasisType
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:57
void calculateAt(const ResultRequirementsType &req, const Dune::FieldVector< double, Traits::mydim > &local, ResultTypeMap< double > &result) const
Calculate results at local coordinates.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:196
typename Traits::GridView GridView
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:51
typename Traits::LocalView LocalView
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:49
void calculateMatrix(const FERequirementType &req, typename Traits::template MatrixType<> K) const
Calculate the matrix associated with the given FERequirementType.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:182
Volume< KirchhoffLoveShell< Basis_, FERequirements_, useEigenRef >, Traits > VolumeType
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:55
double calculateScalar(const FERequirementType &req) const
Calculate the scalar value.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:163
typename Traits::FlatBasis FlatBasis
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:47
static constexpr int worldDim
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:60
KirchhoffLoveShell(const Basis &globalBasis, const typename LocalView::Element &element, double emod, double nu, double thickness, VolumeLoad p_volumeLoad={}, const BoundaryPatch< GridView > *p_neumannBoundary=nullptr, NeumannBoundaryLoad p_neumannBoundaryLoad={})
Constructor for the KirchhoffLoveShell class.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:103
PowerBasisFE< FlatBasis > BasePowerFE
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:54
const Geometry & geometry() const
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:151
typename Traits::Basis Basis
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:46
Traction< KirchhoffLoveShell< Basis_, FERequirements_, useEigenRef >, Traits > TractionType
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:56
static constexpr int bendingStrainSize
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:62
A structure representing kinematic variables.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:74
Eigen::Matrix< double, 2, 3 > J
Jacobian of the reference geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:79
Eigen::Vector3< ScalarType > a3
normalized normal vector of the deformed geometry
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:83
Eigen::Vector3< ScalarType > kappaV
bending strain in Voigt notation
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:77
Eigen::Matrix< ScalarType, 2, 3 > j
Jacobian of the deformed geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:78
Eigen::Matrix3< ScalarType > h
Hessian of the deformed geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:80
Eigen::Vector3< ScalarType > a3N
Normal vector of the deformed geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:82
Eigen::Matrix< double, 3, 3 > C
material tangent
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:75
Eigen::Matrix3< double > H
Hessian of the reference geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:81
Eigen::Vector3< ScalarType > epsV
membrane strain in Voigt notation
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:76
Traction class represents distributed traction load that can be applied.
Definition: traction.hh:22
void calculateVectorImpl(const FERequirementType &par, typename Traits::template VectorType< ScalarType > force, const std::optional< const Eigen::VectorX< ScalarType > > dx=std::nullopt) const
Definition: traction.hh:112
auto calculateScalarImpl(const FERequirementType &par, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const -> ScalarType
Definition: traction.hh:80
void calculateMatrixImpl(const FERequirementType &par, typename Traits::template MatrixType<> K, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const
Definition: traction.hh:144
Volume class represents distributed volume load that can be applied.
Definition: volume.hh:20
auto calculateScalarImpl(const FERequirementType &par, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const -> ScalarType
Definition: volume.hh:71
void calculateMatrixImpl(const FERequirementType &par, typename Traits::template MatrixType<> K, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const
Definition: volume.hh:108
void calculateVectorImpl(const FERequirementType &par, typename Traits::template VectorType< ScalarType > force, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const
Definition: volume.hh:88
Definition: membranestrains.hh:17
auto derivative(const Dune::FieldVector< double, 2 > &gpPos, const Eigen::Matrix< ScalarType, 2, 3 > &jcur, const auto &dNAtGp, const Geometry &geo, const auto &uFunction, const auto &localBasis, const int node) const
Compute the strain-displacement matrix for a given node and integration point.
Definition: membranestrains.hh:65
auto secondDerivative(const Dune::FieldVector< double, 2 > &gpPos, const auto &dNAtGp, const Geometry &geo, const auto &uFunction, const auto &localBasis, const Eigen::Vector3< ScalarType > &S, int I, int J) const
Compute the second derivative of the membrane strain for a given node pair and integration point.
Definition: membranestrains.hh:96
auto value(const Dune::FieldVector< double, 2 > &gpPos, const Geometry &geo, const auto &uFunction) const -> Eigen::Vector3< typename std::remove_cvref_t< decltype(uFunction)>::ctype >
Compute the strain vector at a given integration point.
Definition: membranestrains.hh:30
Traits for handling finite elements.see https://en.wikipedia.org/wiki/Lam%C3%A9_parameters.
Definition: physicshelper.hh:68
typename LocalView::Element Element
Type of the grid element.
Definition: physicshelper.hh:88
static constexpr int worlddim
Dimension of the world space.
Definition: physicshelper.hh:94
typename FlatBasis::LocalView LocalView
Type of the local view.
Definition: physicshelper.hh:82
typename Basis::FlatBasis FlatBasis
Type of the flat basis.
Definition: physicshelper.hh:79
ResultRequirements< FERequirementType > ResultRequirementsType
Type of the result requirements.
Definition: physicshelper.hh:76
Basis_ Basis
Type of the basis of the finite element.
Definition: physicshelper.hh:70
static constexpr int mydim
Dimension of the geometry.
Definition: physicshelper.hh:97
typename FlatBasis::GridView GridView
Type of the grid view.
Definition: physicshelper.hh:85
FERequirements_ FERequirementType
Type of the requirements for the finite element.
Definition: physicshelper.hh:73
typename Element::Geometry Geometry
Type of the element geometry.
Definition: physicshelper.hh:91
Definition: resultevaluators.hh:20