11#include <dune/geometry/quadraturerules.hh>
12#include <dune/localfefunctions/cachedlocalBasis/cachedlocalBasis.hh>
13#include <dune/localfefunctions/impl/standardLocalFunction.hh>
23template <
typename PreFE,
typename FE>
24class KirchhoffLoveShell;
34 template <
typename PreFE,
typename FE>
48template <
typename PreFE,
typename FE>
61 using LocalBasisType =
decltype(std::declval<LocalView>().tree().child(0).finiteElement().localBasis());
78 template <
typename ST =
double>
81 Eigen::Matrix<double, 3, 3>
C;
84 Eigen::Matrix<ST, 2, 3>
j;
85 Eigen::Matrix<double, 2, 3>
J;
87 Eigen::Matrix3<double>
H;
88 Eigen::Vector3<ST>
a3N;
89 Eigen::Vector3<ST>
a3;
100 : mat_{pre.material},
101 thickness_{pre.thickness} {}
108 const auto& localView = underlying().localView();
109 assert(localView.bound());
110 const auto& element = localView.element();
111 auto& firstChild = localView.tree().child(0);
113 const auto& fe = firstChild.finiteElement();
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));
122 localBasis_.bind(Dune::QuadratureRules<double, myDim>::rule(element.type(), order_),
123 Dune::bindDerivatives(0, 1, 2));
125 localBasis_.bind(Dune::QuadratureRules<double, myDim>::rule(element.type(), order_),
126 Dune::bindDerivatives(0, 1, 2));
140 template <
typename ST =
double>
143 const std::optional<std::reference_wrapper<
const Eigen::VectorX<ST>>>& dx = std::nullopt)
const {
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()));
153 [[nodiscard]]
int order()
const {
return order_; }
160 template <
template <
typename,
int,
int>
class RT>
176 template <
template <
typename,
int,
int>
class RT>
177 requires(canProvideResultType<RT>())
181 DUNE_THROW(Dune::NotImplemented,
"No results are implemented");
186 const auto& underlying()
const {
return static_cast<const FE&
>(*this); }
187 auto& underlying() {
return static_cast<FE&
>(*this); }
189 Dune::CachedLocalBasis<std::remove_cvref_t<LocalBasisType>> localBasis_;
191 YoungsModulusAndPoissonsRatio mat_;
194 size_t numberOfNodes_{0};
213 const auto& uFunction)
const {
214 using ST =
typename std::remove_cvref_t<
decltype(uFunction)>::ctype;
217 using namespace Dune;
218 using namespace Dune::DerivativeDirections;
219 const auto [X, Jd, Hd] = geo.impl().zeroFirstAndSecondDerivativeOfPosition(gpPos);
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();
225 G.block<2, 2>(0, 0) = A;
227 const Eigen::Matrix<double, 3, 3> GInv = G.inverse();
232 const auto& Ndd = localBasis_.evaluateSecondDerivatives(gpIndex);
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;
243 const auto BV =
toVoigt(toEigen(geo.impl().secondFundamentalForm(gpPos)));
244 kin.kappaV = BV - bV;
248 template <
typename ST>
251 const std::optional<std::reference_wrapper<
const Eigen::VectorX<ST>>>& dx = std::nullopt)
const {
253 DUNE_THROW(Dune::NotImplemented,
"MatrixAffordance not implemented: " +
toString(affordance));
254 using namespace Dune::DerivativeDirections;
255 using namespace Dune;
258 const auto geo = underlying().localView().element().geometry();
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] =
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;
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 =
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 =
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;
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;
290 K.template triangularView<Eigen::StrictlyLower>() = K.transpose();
293 template <
typename ST>
296 const std::optional<std::reference_wrapper<
const Eigen::VectorX<ST>>>& dx = std::nullopt)
const {
298 DUNE_THROW(Dune::NotImplemented,
"VectorAffordance not implemented: " +
toString(affordance));
299 using namespace Dune::DerivativeDirections;
300 using namespace Dune;
303 const auto geo = underlying().localView().element().geometry();
306 for (
const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
307 const auto [C, epsV, kappaV, jE, J, h, H, a3N, a3] =
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;
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 =
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();
326 template <
typename ST>
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;
335 const auto& lambda = par.parameter();
338 const auto geo = underlying().localView().element().geometry();
340 for (
const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
341 const auto [C, epsV, kappaV, j, J, h, H, a3N, a3] =
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();
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;
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);
364 const Eigen::Matrix<ST, 3, 3> P =
365 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose());
367 const auto a1dxI = Eigen::Matrix<double, 3, 3>::Identity() *
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;
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());
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);
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);
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);
411 const Eigen::Matrix<ST, 3, 3> a3d1 =
412 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose()) * a3NdI;
414 Eigen::Matrix<ST, 3, 3> bop = -(h * a3d1 + (a3 * ddN.row(node)).
transpose());
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);
435 Eigen::Matrix<double, 3, 3> C33 = C({0, 1, 5}, {0, 1, 5});
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
@ mechanicalPotentialEnergy
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