diff --git a/dune/elasticity/materials/geomexactstvenantkirchhoffmaterial.hh b/dune/elasticity/materials/geomexactstvenantkirchhoffmaterial.hh index 4c6b0f722886f21f362aef5143b0539c09839548..ab0f63cf3596d16c787831cf16b081373bb7c7fd 100644 --- a/dune/elasticity/materials/geomexactstvenantkirchhoffmaterial.hh +++ b/dune/elasticity/materials/geomexactstvenantkirchhoffmaterial.hh @@ -34,9 +34,9 @@ public: private: using Base::dim; typedef typename GridType::ctype ctype; - typedef GeomExactStVenantKirchhoffFunctionalAssembler<GridType,Lfe> GeomLinearization; - typedef GeomExactStVenantKirchhoffOperatorAssembler<GridType, Lfe, Lfe> GeomHessian; - typedef typename GridType::template Codim<0>::Geometry::LocalCoordinate LocalCoordinate; + typedef GeomExactStVenantKirchhoffFunctionalAssembler<GridType,Lfe> LinearisationAssembler; + typedef GeomExactStVenantKirchhoffOperatorAssembler<GridType, Lfe, Lfe> HessianAssembler; + using Derivative = typename GridFunction::DerivativeType; using StressFunction = std::function<SymmetricTensor<dim, ReturnType>(Derivative)>; @@ -51,8 +51,8 @@ public: lambda_(E*nu/((1+nu)*(1-2*nu))), mu_(E/(2+2*nu)) { - localLinearization_ = std::make_shared<GeomLinearization>(E,nu); - localHessian_ = std::make_shared<GeomHessian>(E,nu); + localLinearisation_.setStiffnessParameter(E, nu); + localHessian_.setStiffnessParameter(E, nu); } void setup(ReturnType E, ReturnType nu, const Basis& basis) @@ -61,8 +61,8 @@ public: lambda_ = E*nu/((1+nu)*(1-2*nu)); mu_ = E/(2+2*nu); - localLinearization_ = std::make_shared<GeomLinearization>(E,nu); - localHessian_ = std::make_shared<GeomHessian>(E,nu); + localLinearisation_.setStiffnessParameter(E, nu); + localHessian_.setStiffnessParameter(E, nu); this->basis_ = &basis; } @@ -70,9 +70,9 @@ public: //! Evaluate the strain energy ReturnType energy(std::shared_ptr<GridFunction> displace) const { - ReturnType energy=0; + ReturnType energy{0}; - const auto gridView = this->basis_->getGridView(); + const auto& gridView = this->basis_->getGridView(); for (const auto& e : elements(gridView)) { @@ -82,55 +82,45 @@ public: const auto& quad = QuadratureRuleCache<ctype, dim>::rule(quadKey); - // get the element geometry const auto& geometry = e.geometry(); - // loop over quadrature points - for (size_t pt=0; pt < quad.size(); ++pt) { - - // get quadrature point - const LocalCoordinate& quadPos = quad[pt].position(); + for (const auto& pt : quad) { - // get integration factor - const ctype integrationElement = geometry.integrationElement(quadPos); - - // evaluate displacement gradient at the quadrature point - typename GridFunction::DerivativeType localDispGrad; + const auto& quadPos = pt.position(); + Derivative localDispGrad; if (displace->isDefinedOn(e)) displace->evaluateDerivativeLocal(e, quadPos, localDispGrad); else - displace->evaluateDerivative(geometry.global(quadPos),localDispGrad); + displace->evaluateDerivative(geometry.global(quadPos), localDispGrad); - // Compute the nonlinear strain tensor from the deformation gradient - SymmetricTensor<dim,ReturnType> strain; - Dune::Elasticity::strain(localDispGrad,strain); + SymmetricTensor<dim, ReturnType> strain; + Dune::Elasticity::strain(localDispGrad, strain); - // and the stress - SymmetricTensor<dim,ReturnType> stress = strain; + SymmetricTensor<dim, ReturnType> stress = strain; stress *= 2*mu_; - stress.addToDiag(lambda_*strain.trace()); + stress.addToDiag(lambda_ * strain.trace()); - ctype z = quad[pt].weight()*integrationElement; + ReturnType z = pt.weight() * geometry.integrationElement(quadPos); energy += (stress*strain)*z; } } - return 0.5*energy; } //! Return the local assembler of the first derivative of the strain energy - LocalLinearization& firstDerivative(std::shared_ptr<GridFunction> displace) + LinearisationAssembler& firstDerivative(std::shared_ptr<GridFunction> displace) { - localLinearization_->setConfiguration(displace); - return *localLinearization_; + localLinearisation_.setConfiguration(displace); + return localLinearisation_; } //! Return the local assembler of the second derivative of the strain energy - LocalHessian& secondDerivative(std::shared_ptr<GridFunction> displace) + HessianAssembler& secondDerivative(std::shared_ptr<GridFunction> displace) { - localHessian_->setConfiguration(displace); - return *localHessian_; + localHessian_.setConfiguration(displace); + return localHessian_; + } static StressFunction stressFunction(ReturnType E, ReturnType nu) { ReturnType lambda{E * nu / (1.0+nu) / (1.0-2.0*nu)}; @@ -151,10 +141,10 @@ public: private: //! First derivative of the strain energy - std::shared_ptr<GeomLinearization> localLinearization_; + LinearisationAssembler localLinearisation_; //! Second derivative of the strain energy - std::shared_ptr<GeomHessian> localHessian_; + HessianAssembler localHessian_; //! 1. Lam\'e constant ReturnType lambda_;