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