From efe127e24aa4be8508d7b7e31551e93c05a1a9e1 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Thu, 22 Sep 2011 15:06:43 +0000 Subject: [PATCH] More higher order fixes. Computation of analytical energy gradients doesn't work, yet. [[Imported from SVN: r7839]] --- dune/gfe/harmonicenergystiffness.hh | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/dune/gfe/harmonicenergystiffness.hh b/dune/gfe/harmonicenergystiffness.hh index 266ec1e2..7030b509 100644 --- a/dune/gfe/harmonicenergystiffness.hh +++ b/dune/gfe/harmonicenergystiffness.hh @@ -38,11 +38,13 @@ public: // If the cpp macro is not set we overload it here. /** \brief Assemble the gradient of the energy functional on one element */ virtual void assembleEmbeddedGradient(const Entity& element, - const Dune::array<TargetSpace,gridDim+1>& solution, + const LocalFiniteElement& localFiniteElement, + const std::vector<TargetSpace>& solution, std::vector<typename TargetSpace::EmbeddedTangentVector>& gradient) const; virtual void assembleGradient(const Entity& element, - const Dune::array<TargetSpace,gridDim+1>& localSolution, + const LocalFiniteElement& localFiniteElement, + const std::vector<TargetSpace>& localSolution, std::vector<typename TargetSpace::TangentVector>& localGradient) const; #endif }; @@ -96,18 +98,20 @@ energy(const Entity& element, } #ifndef HARMONIC_ENERGY_FD_GRADIENT -template <class GridView, class TargetSpace> -void HarmonicEnergyLocalStiffness<GridView, TargetSpace>:: +template <class GridView, class LocalFiniteElement, class TargetSpace> +void HarmonicEnergyLocalStiffness<GridView, LocalFiniteElement, TargetSpace>:: assembleEmbeddedGradient(const Entity& element, - const Dune::array<TargetSpace,gridDim+1>& localSolution, - std::vector<typename TargetSpace::EmbeddedTangentVector>& localGradient) const + const LocalFiniteElement& localFiniteElement, + const std::vector<TargetSpace>& localSolution, + std::vector<typename TargetSpace::EmbeddedTangentVector>& localGradient) const { // initialize gradient localGradient.resize(localSolution.size()); std::fill(localGradient.begin(), localGradient.end(), typename TargetSpace::EmbeddedTangentVector(0)); // Set up local gfe function from the local coefficients - LocalGeodesicFEFunction<gridDim, double, TargetSpace> localGeodesicFEFunction(localSolution); + LocalGeodesicFEFunction<gridDim, double, LocalFiniteElement, TargetSpace> localGeodesicFEFunction(localFiniteElement, + localSolution); // I am not sure about the correct quadrature order int quadOrder = 1;//gridDim; @@ -170,20 +174,21 @@ assembleEmbeddedGradient(const Entity& element, } - } + } } -template <class GridView, class TargetSpace> -void HarmonicEnergyLocalStiffness<GridView, TargetSpace>:: +template <class GridView, class LocalFiniteElement, class TargetSpace> +void HarmonicEnergyLocalStiffness<GridView, LocalFiniteElement, TargetSpace>:: assembleGradient(const Entity& element, - const Dune::array<TargetSpace,gridDim+1>& localSolution, + const LocalFiniteElement& localFiniteElement, + const std::vector<TargetSpace>& localSolution, std::vector<typename TargetSpace::TangentVector>& localGradient) const { std::vector<typename TargetSpace::EmbeddedTangentVector> embeddedLocalGradient; // first compute the gradient in embedded coordinates - assembleEmbeddedGradient(element, localSolution, embeddedLocalGradient); + assembleEmbeddedGradient(element, localFiniteElement, localSolution, embeddedLocalGradient); // transform to coordinates on the tangent space localGradient.resize(embeddedLocalGradient.size()); -- GitLab