From c1b9706353e0d87a7fdb71ee49699c4c848c21dc Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Fri, 5 Nov 2010 13:24:08 +0000
Subject: [PATCH] add method to assemble the gradient in local coordinates, not
 embedded coordinates

[[Imported from SVN: r6498]]
---
 dune/gfe/harmonicenergystiffness.hh | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/dune/gfe/harmonicenergystiffness.hh b/dune/gfe/harmonicenergystiffness.hh
index d111784d..c2105b09 100644
--- a/dune/gfe/harmonicenergystiffness.hh
+++ b/dune/gfe/harmonicenergystiffness.hh
@@ -35,6 +35,10 @@ public:
     virtual void assembleEmbeddedGradient(const Entity& element,
                                   const std::vector<TargetSpace>& solution,
                                   std::vector<typename TargetSpace::EmbeddedTangentVector>& gradient) const;
+                                    
+    virtual void assembleGradient(const Entity& element,
+                                  const std::vector<TargetSpace>& localSolution,
+                                  std::vector<typename TargetSpace::TangentVector>& localGradient) const;
 #endif
 };
 
@@ -109,7 +113,7 @@ assembleEmbeddedGradient(const Entity& element,
 {
     // initialize gradient
     localGradient.resize(localSolution.size());
-    std::fill(localGradient.begin(), localGradient.end(), typename TargetSpace::TangentVector(0));
+    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);
@@ -161,6 +165,25 @@ assembleEmbeddedGradient(const Entity& element,
 
 	}
 
+}
+
+template <class GridView, class TargetSpace>
+void HarmonicEnergyLocalStiffness<GridView, TargetSpace>::
+assembleGradient(const Entity& element,
+                 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);
+
+    // transform to coordinates on the tangent space
+    localGradient.resize(embeddedLocalGradient.size());
+
+    for (size_t i=0; i<localGradient.size(); i++)
+        localSolution[i].orthonormalFrame().mv(embeddedLocalGradient[i], localGradient[i]);
+
 }
 #endif
 #endif
-- 
GitLab