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> 
   37  template <
typename Basis_, 
typename FERequirements_ = FERequirements<>, 
bool useEigenRef = false>
 
   46    using Element                 = 
typename LocalView::Element;
 
   52    using LocalBasisType          = 
decltype(std::declval<LocalView>().tree().child(0).finiteElement().localBasis());
 
   66    template <
typename ScalarType = 
double>
 
   68      Eigen::Matrix<double, 3, 3> 
C;      
 
   69      Eigen::Vector3<ScalarType> 
epsV;    
 
   71      Eigen::Matrix<ScalarType, 2, 3> 
j;  
 
   72      Eigen::Matrix<double, 2, 3> 
J;      
 
   73      Eigen::Matrix3<ScalarType> 
h;       
 
   74      Eigen::Matrix3<double> 
H;           
 
   75      Eigen::Vector3<ScalarType> 
a3N;     
 
   76      Eigen::Vector3<ScalarType> 
a3;      
 
   95    template <
typename VolumeLoad = utils::LoadDefault, 
typename NeumannBoundaryLoad = utils::LoadDefault>
 
   97                       double thickness, VolumeLoad p_volumeLoad = {},
 
   98                       const BoundaryPatch<GridView>* p_neumannBoundary = 
nullptr,
 
   99                       NeumannBoundaryLoad p_neumannBoundaryLoad        = {})
 
  106      auto& first_child = this->
localView().tree().child(0);
 
  107      const auto& fe    = first_child.finiteElement();
 
  108      geo_              = std::make_shared<const Geometry>(this->
localView().element().geometry());
 
  110      order             = 2 * (fe.localBasis().order());
 
  111      localBasis        = Dune::CachedLocalBasis(fe.localBasis());
 
  112      if constexpr (
requires { this->
localView().element().impl().getQuadratureRule(
order); })
 
  113        if (this->
localView().element().impl().isTrimmed())
 
  114          localBasis.bind(this->localView().element().impl().getQuadratureRule(
order), Dune::bindDerivatives(0, 1, 2));
 
  117                          Dune::bindDerivatives(0, 1, 2));
 
  120                        Dune::bindDerivatives(0, 1, 2));
 
  122      if constexpr (!std::is_same_v<VolumeLoad, utils::LoadDefault>) 
volumeLoad = p_volumeLoad;
 
  123      if constexpr (!std::is_same_v<NeumannBoundaryLoad, utils::LoadDefault>)
 
  127             && 
"If you pass a Neumann boundary you should also pass the function for the Neumann load!");
 
  141    template <
typename ScalarType = 
double>
 
  143                              const std::optional<
const Eigen::VectorX<ScalarType>>& dx = std::nullopt)
 const {
 
  145      auto disp     = Ikarus::FEHelper::localSolutionBlockVector<FERequirementType>(d, this->
localView(), dx);
 
  168      calculateVectorImpl<double>(req, force);
 
  178      calculateMatrixImpl<double>(req, K);
 
  194      DUNE_THROW(Dune::NotImplemented, 
"No results are implemented");
 
  197    std::shared_ptr<const Geometry> 
geo_;
 
  198    Dune::CachedLocalBasis<std::remove_cvref_t<LocalBasisType>> 
localBasis;
 
  232                                   const auto& uFunction)
 const {
 
  233      using ScalarType = 
typename std::remove_cvref_t<
decltype(uFunction)>::ctype;
 
  236      using namespace Dune;
 
  237      using namespace Dune::DerivativeDirections;
 
  238      const auto [X, Jd, Hd]              = 
geo_->impl().zeroFirstAndSecondDerivativeOfPosition(gpPos);
 
  241      const Eigen::Matrix<double, 2, 2> A = kin.J * kin.J.transpose();
 
  242      Eigen::Matrix<double, 3, 3> G       = Eigen::Matrix<double, 3, 3>::Zero();
 
  244      G.block<2, 2>(0, 0)                    = A;
 
  246      const Eigen::Matrix<double, 3, 3> GInv = G.inverse();
 
  251      const auto& Ndd                             = 
localBasis.evaluateSecondDerivatives(gpIndex);
 
  253      const auto hessianu                         = Ndd.transpose().template cast<ScalarType>() * uasMatrix;
 
  254      kin.h                                       = kin.H + hessianu;
 
  255      const Eigen::Matrix<ScalarType, 3, 2> gradu = toEigen(uFunction.evaluateDerivative(
 
  256          gpIndex, Dune::wrt(spatialAll), Dune::on(Dune::DerivativeDirections::referenceElement)));
 
  257      kin.j                                       = kin.J + gradu.transpose();
 
  258      kin.a3N                                     = (kin.j.row(0).cross(kin.j.row(1)));
 
  259      kin.a3                                      = kin.a3N.normalized();
 
  260      Eigen::Vector<ScalarType, 3> bV             = kin.h * kin.a3;
 
  262      const auto BV = 
toVoigt(toEigen(
geo_->impl().secondFundamentalForm(gpPos)));
 
  263      kin.kappaV    = BV - bV;
 
  267    template <
typename ScalarType>
 
  269                             const std::optional<
const Eigen::VectorX<ScalarType>>& dx = std::nullopt)
 const {
 
  271      using namespace Dune::DerivativeDirections;
 
  272      using namespace Dune;
 
  276      for (
const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
 
  277        const auto intElement = 
geo_->integrationElement(gp.position()) * gp.weight();
 
  278        const auto [C, epsV, kappaV, jE, J, h, H, a3N, a3]
 
  280        const Eigen::Vector<ScalarType, membraneStrainSize> membraneForces = 
thickness_ * C * epsV;
 
  281        const Eigen::Vector<ScalarType, bendingStrainSize> moments = Dune::power(
thickness_, 3) / 12.0 * C * kappaV;
 
  283        const auto& Nd  = 
localBasis.evaluateJacobian(gpIndex);
 
  284        const auto& Ndd = 
localBasis.evaluateSecondDerivatives(gpIndex);
 
  286          Eigen::Matrix<ScalarType, membraneStrainSize, worldDim> bopIMembrane
 
  289          Eigen::Matrix<ScalarType, bendingStrainSize, worldDim> bopIBending = 
bopBending(jE, h, Nd, Ndd, i, a3N, a3);
 
  291            auto KBlock = K.template block<worldDim, worldDim>(
worldDim * i, 
worldDim * j);
 
  292            Eigen::Matrix<ScalarType, membraneStrainSize, worldDim> bopJMembrane
 
  294            Eigen::Matrix<ScalarType, bendingStrainSize, worldDim> bopJBending = 
bopBending(jE, h, Nd, Ndd, j, a3N, a3);
 
  295            KBlock += 
thickness_ * bopIMembrane.transpose() * C * bopJMembrane * intElement;
 
  296            KBlock += Dune::power(
thickness_, 3) / 12.0 * bopIBending.transpose() * C * bopJBending * intElement;
 
  299                gp.position(), Nd, *
geo_, uFunction, 
localBasis, membraneForces, i, j);
 
  300            Eigen::Matrix<ScalarType, worldDim, worldDim> kgBendingIJ
 
  301                = 
kgBending(jE, h, Nd, Ndd, a3N, a3, moments, i, j);
 
  302            KBlock += kgMembraneIJ * intElement;
 
  303            KBlock += kgBendingIJ * intElement;
 
  307      K.template triangularView<Eigen::StrictlyLower>() = K.transpose();
 
  310    template <
typename ScalarType>
 
  312                             const std::optional<
const Eigen::VectorX<ScalarType>>& dx = std::nullopt)
 const {
 
  314      using namespace Dune::DerivativeDirections;
 
  315      using namespace Dune;
 
  320      for (
const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
 
  321        const auto [C, epsV, kappaV, jE, J, h, H, a3N, a3]
 
  323        const Eigen::Vector<ScalarType, 3> membraneForces = 
thickness_ * C * epsV;
 
  324        const Eigen::Vector<ScalarType, 3> moments        = Dune::power(
thickness_, 3) / 12.0 * C * kappaV;
 
  326        const auto& Nd  = 
localBasis.evaluateJacobian(gpIndex);
 
  327        const auto& Ndd = 
localBasis.evaluateSecondDerivatives(gpIndex);
 
  329          Eigen::Matrix<ScalarType, 3, 3> bopIMembrane
 
  331          Eigen::Matrix<ScalarType, 3, 3> bopIBending = 
bopBending(jE, h, Nd, Ndd, i, a3N, a3);
 
  332          force.template segment<3>(3 * i)
 
  333              += bopIMembrane.transpose() * membraneForces * 
geo_->integrationElement(gp.position()) * gp.weight();
 
  334          force.template segment<3>(3 * i)
 
  335              += bopIBending.transpose() * moments * 
geo_->integrationElement(gp.position()) * gp.weight();
 
  342        for (
const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
 
  343          Eigen::Vector<double, worldDim> fext = 
volumeLoad(
geo_->global(gp.position()), lambda);
 
  345            const auto udCi = uFunction.evaluateDerivative(gpIndex, wrt(coeff(i)));
 
  346            force.template segment<worldDim>(
worldDim * i)
 
  347                -= udCi * fext * 
geo_->integrationElement(gp.position()) * gp.weight();
 
  355      for (
auto&& intersection : intersections(
neumannBoundary->gridView(), this->localView().element())) {
 
  358        const auto& quadLine = QuadratureRules<double, Element::mydimension - 1>::rule(intersection.type(), 
order);
 
  360        for (
const auto& curQuad : quadLine) {
 
  363              = intersection.geometryInInside().global(curQuad.position());
 
  365          const double intElement = intersection.geometry().integrationElement(curQuad.position()) * curQuad.weight();
 
  367            const auto udCi = uFunction.evaluateDerivative(quadPos, wrt(coeff(i)));
 
  370            auto neumannValue = 
neumannBoundaryLoad(intersection.geometry().global(curQuad.position()), lambda);
 
  371            force.template segment<worldDim>(
worldDim * i) -= udCi * neumannValue * intElement;
 
  377    template <
typename ScalarType>
 
  379                                                           = std::nullopt) 
const -> ScalarType {
 
  380      using namespace Dune::DerivativeDirections;
 
  381      using namespace Dune;
 
  384      ScalarType energy    = 0.0;
 
  386      for (
const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
 
  387        const auto [C, epsV, kappaV, j, J, h, H, a3N, a3]
 
  390        const ScalarType membraneEnergy = 0.5 * 
thickness_ * epsV.dot(C * epsV);
 
  391        const ScalarType bendingEnergy  = 0.5 * Dune::power(
thickness_, 3) / 12.0 * kappaV.dot(C * kappaV);
 
  392        energy += (membraneEnergy + bendingEnergy) * 
geo_->integrationElement(gp.position()) * gp.weight();
 
  396        for (
const auto& [gpIndex, gp] : uFunction.viewOverIntegrationPoints()) {
 
  397          const auto u                               = uFunction.evaluate(gpIndex);
 
  398          const Eigen::Vector<double, worldDim> fExt = 
volumeLoad(
geo_->global(gp.position()), lambda);
 
  399          energy -= u.dot(fExt) * 
geo_->integrationElement(gp.position()) * gp.weight();
 
  406      const auto& element = this->
localView().element();
 
  407      for (
auto&& intersection : intersections(
neumannBoundary->gridView(), element)) {
 
  410        const auto& quadLine = QuadratureRules<double, Traits::mydim - 1>::rule(intersection.type(), 
order);
 
  412        for (
const auto& curQuad : quadLine) {
 
  415              = intersection.geometryInInside().global(curQuad.position());
 
  417          const double intElement = intersection.geometry().integrationElement(curQuad.position());
 
  420          const auto u = uFunction.evaluate(quadPos);
 
  423          const auto neumannValue = 
neumannBoundaryLoad(intersection.geometry().global(curQuad.position()), lambda);
 
  424          energy -= neumannValue.dot(u) * curQuad.weight() * intElement;
 
  430    template <
typename ScalarType>
 
  431    Eigen::Matrix<ScalarType, 3, 3> 
kgBending(
const Eigen::Matrix<ScalarType, 2, 3>& jcur,
 
  432                                              const Eigen::Matrix3<ScalarType>& h, 
const auto& dN, 
const auto& ddN,
 
  433                                              const Eigen::Vector3<ScalarType>& a3N,
 
  434                                              const Eigen::Vector3<ScalarType>& a3, 
const Eigen::Vector3<ScalarType>& S,
 
  435                                              int I, 
int J)
 const {
 
  436      Eigen::Matrix<ScalarType, 3, 3> kg;
 
  439      const auto& dN1i = dN(I, 0);
 
  440      const auto& dN1j = dN(J, 0);
 
  441      const auto& dN2i = dN(I, 1);
 
  442      const auto& dN2j = dN(J, 1);
 
  444      const Eigen::Matrix<ScalarType, 3, 3> P
 
  445          = 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose());
 
  447      const auto a1dxI = Eigen::Matrix<double, 3, 3>::Identity()
 
  450      const auto a2dxI                            = Eigen::Matrix<double, 3, 3>::Identity() * dN2i;
 
  451      const auto a1dxJ                            = Eigen::Matrix<double, 3, 3>::Identity() * dN1j;
 
  452      const auto a2dxJ                            = Eigen::Matrix<double, 3, 3>::Identity() * dN2j;
 
  453      const auto a1                               = jcur.row(0);
 
  454      const auto a2                               = jcur.row(1);
 
  455      const Eigen::Matrix<ScalarType, 3, 3> a3NdI = a1dxI.colwise().cross(a2) - a2dxI.colwise().cross(a1);
 
  456      const Eigen::Matrix<ScalarType, 3, 3> a3NdJ = a1dxJ.colwise().cross(a2) - a2dxJ.colwise().cross(a1);
 
  457      Eigen::Matrix<ScalarType, 3, 3> a3dI        = P * a3NdI;
 
  458      Eigen::Matrix<ScalarType, 3, 3> a3dJ        = P * a3NdJ;
 
  459      for (
int i = 0; i < 3; ++i) {
 
  460        const auto a_albe               = h.row(i).transpose();
 
  461        const auto& ddNI                = ddN(I, i);
 
  462        const auto& ddNJ                = ddN(J, i);
 
  463        Eigen::Vector3<ScalarType> vecd = P * a_albe;
 
  465        Eigen::Matrix<ScalarType, 3, 3> a3Ndd
 
  466            = 1.0 / a3N.squaredNorm()
 
  467              * ((3 * a3 * a3.transpose() - Eigen::Matrix<double, 3, 3>::Identity()) * (a3.dot(a_albe))
 
  468                 - a_albe * a3.transpose() - a3 * a_albe.transpose());
 
  470        Eigen::Matrix<ScalarType, 3, 3> secondDerivativeDirectorIJ = 
skew(((dN2i * dN1j - dN1i * dN2j) * vecd).eval());
 
  471        kg -= (a3NdI.transpose() * a3Ndd * a3NdJ + secondDerivativeDirectorIJ + (ddNI * a3dJ + ddNJ * a3dI.transpose()))
 
  472              * S[i] * (i == 2 ? 2 : 1);
 
  478    template <
typename ScalarType>
 
  479    Eigen::Matrix<ScalarType, 3, 3> 
bopBending(
const Eigen::Matrix<ScalarType, 2, 3>& jcur,
 
  480                                               const Eigen::Matrix3<ScalarType>& h, 
const auto& dN, 
const auto& ddN,
 
  481                                               const int node, 
const Eigen::Vector3<ScalarType>& a3N,
 
  482                                               const Eigen::Vector3<ScalarType>& a3)
 const {
 
  483      const Eigen::Matrix<ScalarType, 3, 3> a1dxI
 
  484          = Eigen::Matrix<double, 3, 3>::Identity() * dN(node, 0);  
 
  486      const Eigen::Matrix<ScalarType, 3, 3> a2dxI = Eigen::Matrix<double, 3, 3>::Identity() * dN(node, 1);
 
  487      const auto a1                               = jcur.row(0);
 
  488      const auto a2                               = jcur.row(1);
 
  489      const Eigen::Matrix<ScalarType, 3, 3> a3NdI
 
  490          = a1dxI.colwise().cross(a2) - a2dxI.colwise().cross(a1);  
 
  492      const Eigen::Matrix<ScalarType, 3, 3> a3d1
 
  493          = 1.0 / a3N.norm() * (Eigen::Matrix<double, 3, 3>::Identity() - a3 * a3.transpose()) * a3NdI;
 
  495      Eigen::Matrix<ScalarType, 3, 3> bop = -(h * a3d1 + (a3 * ddN.row(node)).
transpose());
 
  501    Eigen::Matrix<double, 3, 3> 
materialTangent(
const Eigen::Matrix<double, 3, 3>& Aconv)
 const {
 
  502      const double lambda   = 
emod_ * 
nu_ / ((1.0 + 
nu_) * (1.0 - 2.0 * 
nu_));
 
  503      const double mu       = 
emod_ / (2.0 * (1.0 + 
nu_));
 
  504      const double lambdbar = 2.0 * lambda * mu / (lambda + 2.0 * mu);
 
  505      Eigen::TensorFixedSize<double, Eigen::Sizes<3, 3, 3, 3>> moduli;
 
  506      const auto AconvT = 
tensorView(Aconv, std::array<Eigen::Index, 2>({3, 3}));
 
  507      moduli = lambdbar * 
dyadic(AconvT, AconvT).eval() + 2.0 * mu * symmetricFourthOrder<double>(Aconv, Aconv);
 
  510      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.
 
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
 
Class representing the requirements for obtaining specific results.
Definition: ferequirements.hh:405
 
Kirchhoff-Love shell finite element class.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:38
 
typename Basis::FlatBasis FlatBasis
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:41
 
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:231
 
const BoundaryPatch< GridView > * neumannBoundary
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:203
 
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:431
 
typename FlatBasis::LocalView LocalView
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:45
 
void calculateVector(const FERequirementType &req, typename Traits::template VectorType<> force) const
Calculate the vector associated with the given FERequirementType.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:167
 
static constexpr int myDim
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:50
 
static constexpr int membraneStrainSize
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:54
 
double nu_
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:206
 
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:142
 
std::shared_ptr< const Geometry > geo_
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:197
 
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:311
 
double emod_
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:205
 
std::function< Eigen::Vector< double, worldDim >(const Dune::FieldVector< double, worldDim > &, const double &)> neumannBoundaryLoad
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:202
 
typename Element::Geometry Geometry
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:47
 
size_t numberOfNodes
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:208
 
int order
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:209
 
Dune::CachedLocalBasis< std::remove_cvref_t< LocalBasisType > > localBasis
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:198
 
typename LocalView::Element Element
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:46
 
std::function< Eigen::Vector< double, worldDim >(const Dune::FieldVector< double, worldDim > &, const double &)> volumeLoad
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:200
 
auto calculateScalarImpl(const FERequirementType &par, const std::optional< const Eigen::VectorX< ScalarType > > &dx=std::nullopt) const -> ScalarType
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:378
 
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:479
 
double thickness_
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:207
 
Eigen::Matrix< double, 3, 3 > materialTangent(const Eigen::Matrix< double, 3, 3 > &Aconv) const
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:501
 
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:268
 
decltype(std::declval< LocalView >().tree().child(0).finiteElement().localBasis()) LocalBasisType
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:52
 
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:191
 
typename FlatBasis::GridView GridView
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:48
 
void calculateMatrix(const FERequirementType &req, typename Traits::template MatrixType<> K) const
Calculate the matrix associated with the given FERequirementType.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:177
 
FERequirements_ FERequirementType
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:43
 
double calculateScalar(const FERequirementType &req) const
Calculate the scalar value.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:158
 
static constexpr int worldDim
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:51
 
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:96
 
PowerBasisFE< FlatBasis > BasePowerFE
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:42
 
DefaultMembraneStrain membraneStrain
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:204
 
Basis_ Basis
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:40
 
static constexpr int bendingStrainSize
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:55
 
A structure representing kinematic variables.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:67
 
Eigen::Matrix< double, 2, 3 > J
Jacobian of the reference geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:72
 
Eigen::Vector3< ScalarType > a3
normalized normal vector of the deformed geometry
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:76
 
Eigen::Vector3< ScalarType > kappaV
bending strain in Voigt notation
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:70
 
Eigen::Matrix< ScalarType, 2, 3 > j
Jacobian of the deformed geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:71
 
Eigen::Matrix3< ScalarType > h
Hessian of the deformed geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:73
 
Eigen::Vector3< ScalarType > a3N
Normal vector of the deformed geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:75
 
Eigen::Matrix< double, 3, 3 > C
material tangent
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:68
 
Eigen::Matrix3< double > H
Hessian of the reference geometry.
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:74
 
Eigen::Vector3< ScalarType > epsV
membrane strain in Voigt notation
Definition: finiteelements/mechanics/kirchhoffloveshell.hh:69
 
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 local views.see https://en.wikipedia.org/wiki/Lam%C3%A9_parameters.
Definition: physicshelper.hh:65
 
static constexpr int worlddim
Dimension of the world space.
Definition: physicshelper.hh:68
 
static constexpr int mydim
Dimension of the geometry.
Definition: physicshelper.hh:71
 
Definition: resultevaluators.hh:20
 
decltype(Dune::Functions::DefaultGlobalBasis(Ikarus::flatPreBasis(std::declval< PreBasis >()))) FlatBasis
The type of the flattened basis.
Definition: utils/basis.hh:36