diff --git a/src/harmonicenergystiffness.hh b/src/harmonicenergystiffness.hh index a3f30e4eb0183c2895f0f66cb0a98ec8e34ceb7c..4ae83e623892d05134eb07b71ceac0682811a534 100644 --- a/src/harmonicenergystiffness.hh +++ b/src/harmonicenergystiffness.hh @@ -14,7 +14,6 @@ class HarmonicEnergyLocalStiffness // grid types typedef typename GridView::Grid::ctype DT; typedef typename GridView::template Codim<0>::Entity Entity; - typedef typename GridView::template Codim<0>::EntityPointer EntityPointer; // some other sizes enum {gridDim=GridView::dimension}; @@ -33,30 +32,10 @@ public: HarmonicEnergyLocalStiffness () {} - /** \brief assemble local stiffness matrix for given element - */ - void assemble (const Entity& e, - const Dune::BlockVector<Dune::FieldVector<double, 6> >& localSolution, - int k=1) - { - DUNE_THROW(Dune::NotImplemented, "!"); - } - - void assembleBoundaryCondition (const Entity& e, int k=1) - { - DUNE_THROW(Dune::NotImplemented, "!"); - } - - + /** \brief Assemble the energy for a single element */ RT energy (const Entity& e, - const Dune::array<RigidBodyMotion<3>,2>& localSolution) const; + const std::vector<TargetSpace>& localSolution) const; - /** \brief Assemble the element gradient of the energy functional */ - void assembleGradient(const Entity& element, - const Dune::array<RigidBodyMotion<3>,2>& solution, - const Dune::array<RigidBodyMotion<3>,2>& referenceConfiguration, - Dune::array<Dune::FieldVector<double,6>, 2>& gradient) const; - }; template <class GridType, class RT> @@ -66,56 +45,35 @@ energy(const Entity& element, { RT energy = 0; - // /////////////////////////////////////////////////////////////////////////////// - // The following two loops are a reduced integration scheme. We integrate - // the transverse shear and extensional energy with a first-order quadrature - // formula, even though it should be second order. This prevents shear-locking. - // /////////////////////////////////////////////////////////////////////////////// - - const Dune::QuadratureRule<double, 1>& shearingQuad - = Dune::QuadratureRules<double, 1>::rule(element.type(), shearQuadOrder); + assert(element.type().isSimplex()); + + int quadOrder = gridDim; + + const Dune::QuadratureRule<double, 1>& quad + = Dune::QuadratureRules<double, 1>::rule(element.type(), quadOrder); - for (size_t pt=0; pt<shearingQuad.size(); pt++) { + for (size_t pt=0; pt<quad.size(); pt++) { // Local position of the quadrature point - const Dune::FieldVector<double,1>& quadPos = shearingQuad[pt].position(); + const Dune::FieldVector<double,gridDim>& quadPos = quad[pt].position(); const double integrationElement = element.geometry().integrationElement(quadPos); - double weight = shearingQuad[pt].weight() * integrationElement; - - Dune::FieldVector<double,6> strain = getStrain(localSolution, element, quadPos); - - // The reference strain - Dune::FieldVector<double,6> referenceStrain = getStrain(localReferenceConfiguration, element, quadPos); - - for (int i=0; i<3; i++) - energy += weight * 0.5 * A_[i] * (strain[i] - referenceStrain[i]) * (strain[i] - referenceStrain[i]); + double weight = quad[pt].weight() * integrationElement; + + for (int comp=0; comp<4; comp++) { + + for (int dir=0; dir<gridDim; dir++) { + + double derivative = localGeodesicFunction.evaluateDerivative(comp, dir); + energy += weight * derivative * derivative; + + } + + } } - // Get quadrature rule - const Dune::QuadratureRule<double, 1>& bendingQuad - = Dune::QuadratureRules<double, 1>::rule(element.type(), bendingQuadOrder); - - for (size_t pt=0; pt<bendingQuad.size(); pt++) { - - // Local position of the quadrature point - const Dune::FieldVector<double,1>& quadPos = bendingQuad[pt].position(); - - double weight = bendingQuad[pt].weight() * element.geometry().integrationElement(quadPos); - - Dune::FieldVector<double,6> strain = getStrain(localSolution, element, quadPos); - - // The reference strain - Dune::FieldVector<double,6> referenceStrain = getStrain(localReferenceConfiguration, element, quadPos); - - // Part II: the bending and twisting energy - for (int i=0; i<3; i++) - energy += weight * 0.5 * K_[i] * (strain[i+3] - referenceStrain[i+3]) * (strain[i+3] - referenceStrain[i+3]); - - } - return energy; }