From 758574cef4db476204f389a84067bd7b34c4c4a6 Mon Sep 17 00:00:00 2001 From: Oliver Sander <sander@igpm.rwth-aachen.de> Date: Mon, 18 Apr 2011 09:36:40 +0000 Subject: [PATCH] add method to compute gfe function gradient by a finite-difference approximation [[Imported from SVN: r7176]] --- dune/gfe/localgeodesicfestiffness.hh | 35 ++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/dune/gfe/localgeodesicfestiffness.hh b/dune/gfe/localgeodesicfestiffness.hh index 0f9cb017..d718cbed 100644 --- a/dune/gfe/localgeodesicfestiffness.hh +++ b/dune/gfe/localgeodesicfestiffness.hh @@ -220,6 +220,10 @@ public: const std::vector<TargetSpace>& solution, std::vector<Dune::FieldVector<double,blocksize> >& gradient) const; + virtual void assembleEmbeddedFDGradient(const Entity& element, + const std::vector<TargetSpace>& solution, + std::vector<typename TargetSpace::EmbeddedTangentVector>& gradient) const; + // assembled data Dune::Matrix<Dune::FieldMatrix<double,blocksize,blocksize> > A_; @@ -234,6 +238,14 @@ assembleGradient(const Entity& element, LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleGradient(element, localSolution, localGradient, this); } +template <class GridView, class TargetSpace> +void LocalGeodesicFEStiffness<GridView, TargetSpace>:: +assembleEmbeddedFDGradient(const Entity& element, + const std::vector<TargetSpace>& localSolution, + std::vector<typename TargetSpace::EmbeddedTangentVector>& localGradient) const +{ + LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleEmbeddedGradient(element, localSolution, localGradient, this); +} template <class GridView, class TargetSpace> void LocalGeodesicFEStiffness<GridView,TargetSpace>:: @@ -423,14 +435,13 @@ public: virtual RT energy (const Entity& e, const std::vector<TargetSpace>& localSolution) const = 0; -#if 0 - /** \brief Assemble the element gradient of the energy functional + /** \brief Assemble the element gradient of the energy functional using a finite-difference approximation - The default implementation in this class uses a finite difference approximation */ - virtual void assembleEmbeddedGradient(const Entity& element, - const std::vector<TargetSpace>& solution, - std::vector<typename TargetSpace::EmbeddedTangentVector>& gradient) const; -#endif + This is mainly for debugging purposes. + */ + virtual void assembleEmbeddedFDGradient(const Entity& element, + const std::vector<TargetSpace>& solution, + std::vector<typename TargetSpace::EmbeddedTangentVector>& gradient) const; /** \brief Assemble the element gradient of the energy functional @@ -507,6 +518,16 @@ assembleGradient(const Entity& element, LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleGradient(element, localSolution, localGradient,this); } +template <class GridView, int dim> +void LocalGeodesicFEStiffness<GridView, UnitVector<dim> >:: +assembleEmbeddedFDGradient(const Entity& element, + const std::vector<TargetSpace>& localSolution, + std::vector<typename TargetSpace::EmbeddedTangentVector>& localGradient) const +{ + LocalGeodesicFEStiffnessImp<GridView,TargetSpace,globalIsometricCoordinates>::assembleEmbeddedGradient(element, localSolution, localGradient, this); +} + + // /////////////////////////////////////////////////////////// // Compute gradient by finite-difference approximation // /////////////////////////////////////////////////////////// -- GitLab