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>
38 template <
typename Basis_,
typename FERequirements_ = FERequirements<>,
bool useEigenRef = false>
40 public Volume<KirchhoffLoveShell<Basis_, FERequirements_, useEigenRef>,
41 TraitsFromFE<Basis_, FERequirements_, useEigenRef>>,
42 public Traction<KirchhoffLoveShell<Basis_, FERequirements_, useEigenRef>,
43 TraitsFromFE<Basis_, FERequirements_, useEigenRef>> {
57 using LocalBasisType =
decltype(std::declval<LocalView>().tree().child(0).finiteElement().localBasis());
73 template <
typename ScalarType =
double>
75 Eigen::Matrix<double, 3, 3>
C;
76 Eigen::Vector3<ScalarType>
epsV;
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;
102 template <
typename VolumeLoad = utils::LoadDefault,
typename NeumannBoundaryLoad = utils::LoadDefault>
104 double thickness, VolumeLoad p_volumeLoad = {},
105 const BoundaryPatch<GridView>* p_neumannBoundary =
nullptr,
106 NeumannBoundaryLoad p_neumannBoundaryLoad = {})
112 thickness_{thickness} {
114 auto& first_child = this->
localView().tree().child(0);
115 const auto& fe = first_child.finiteElement();
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));
124 localBasis.bind(Dune::QuadratureRules<double, myDim>::rule(this->
localView().element().type(), order_),
125 Dune::bindDerivatives(0, 1, 2));
127 localBasis.bind(Dune::QuadratureRules<double, myDim>::rule(this->
localView().element().type(), order_),
128 Dune::bindDerivatives(0, 1, 2));
142 template <
typename ScalarType =
double>
144 const std::optional<
const Eigen::VectorX<ScalarType>>& dx = std::nullopt)
const {
146 auto disp = Ikarus::FEHelper::localSolutionBlockVector<Traits>(d, this->
localView(), dx);
147 Dune::StandardLocalFunction uFunction(localBasis, disp, geo_);
153 [[nodiscard]]
int order()
const {
return order_; }
173 calculateVectorImpl<double>(req, force);
183 calculateMatrixImpl<double>(req, K);
199 DUNE_THROW(Dune::NotImplemented,
"No results are implemented");
203 std::shared_ptr<const Geometry> geo_;
204 Dune::CachedLocalBasis<std::remove_cvref_t<LocalBasisType>> localBasis;
209 size_t numberOfNodes_{0};
233 const auto& uFunction)
const {
234 using ScalarType =
typename std::remove_cvref_t<
decltype(uFunction)>::ctype;
237 using namespace Dune;
238 using namespace Dune::DerivativeDirections;
239 const auto [X, Jd, Hd] = geo_->impl().zeroFirstAndSecondDerivativeOfPosition(gpPos);
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();
245 G.block<2, 2>(0, 0) = A;
247 const Eigen::Matrix<double, 3, 3> GInv = G.inverse();
250 kin.epsV = membraneStrain.
value(gpPos, geo, uFunction);
252 const auto& Ndd = localBasis.evaluateSecondDerivatives(gpIndex);
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;
263 const auto BV =
toVoigt(toEigen(geo_->impl().secondFundamentalForm(gpPos)));
264 kin.kappaV = BV - bV;
268 template <
typename ScalarType>
270 const std::optional<
const Eigen::VectorX<ScalarType>>& dx = std::nullopt)
const {
272 using namespace Dune::DerivativeDirections;
273 using namespace Dune;
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]
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;
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);
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;
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;
308 K.template triangularView<Eigen::StrictlyLower>() = K.transpose();
315 template <
typename ScalarType>
317 const std::optional<
const Eigen::VectorX<ScalarType>>& dx = std::nullopt)
const {
319 using namespace Dune::DerivativeDirections;
320 using namespace Dune;
325 for (
const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
326 const auto [C, epsV, kappaV, jE, J, h, H, a3N, a3]
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;
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();
351 template <
typename ScalarType>
353 = std::nullopt)
const -> ScalarType {
354 using namespace Dune::DerivativeDirections;
355 using namespace Dune;
358 ScalarType energy = 0.0;
360 for (
const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
361 const auto [C, epsV, kappaV, j, J, h, H, a3N, a3]
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();
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;
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);
391 const Eigen::Matrix<ScalarType, 3, 3> P
392 = 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose());
394 const auto a1dxI = Eigen::Matrix<double, 3, 3>::Identity()
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;
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());
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);
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);
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);
439 const Eigen::Matrix<ScalarType, 3, 3> a3d1
440 = 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose()) * a3NdI;
442 Eigen::Matrix<ScalarType, 3, 3> bop = -(h * a3d1 + (a3 * ddN.row(node)).
transpose());
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);
457 Eigen::Matrix<double, 3, 3> C33 = C({0, 1, 5}, {0, 1, 5});
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