From 509c33bff6f963762d8bd944867d611cdc4d8a2f Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Tue, 21 Apr 2009 09:42:02 +0000
Subject: [PATCH] for debugging: add a method to compute gradients of local
 geodesic fe functions by finite-difference approximation (only 2d)

[[Imported from SVN: r4065]]
---
 src/localgeodesicfefunction.hh | 49 ++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/src/localgeodesicfefunction.hh b/src/localgeodesicfefunction.hh
index afaeaca1..db9112ad 100644
--- a/src/localgeodesicfefunction.hh
+++ b/src/localgeodesicfefunction.hh
@@ -36,6 +36,9 @@ public:
     /** \brief Evaluate the derivative of the function */
     Dune::FieldMatrix<ctype, EmbeddedTangentVector::size, dim> evaluateDerivative(const Dune::FieldVector<ctype, dim>& local);
 
+    /** \brief Evaluate the derivative of the function using a finite-difference approximation*/
+    Dune::FieldMatrix<ctype, EmbeddedTangentVector::size, dim> evaluateDerivativeFD(const Dune::FieldVector<ctype, dim>& local);
+
 private:
 
     /** \brief Compute the derivate of geodesic interpolation wrt to the initial point
@@ -285,5 +288,51 @@ evaluateDerivative(const Dune::FieldVector<ctype, dim>& local)
 
     return result;
 }
+template <int dim, class ctype, class TargetSpace>
+Dune::FieldMatrix<ctype, TargetSpace::EmbeddedTangentVector::size, dim> LocalGeodesicFEFunction<dim,ctype,TargetSpace>::
+evaluateDerivativeFD(const Dune::FieldVector<ctype, dim>& local)
+{
+    Dune::FieldMatrix<ctype, EmbeddedTangentVector::size, dim> result;
+
+    if (dim==1) {
+
+        EmbeddedTangentVector tmp = TargetSpace::interpolateDerivative(coefficients_[0], coefficients_[1], local[0]);
+
+        for (int i=0; i<EmbeddedTangentVector::size; i++)
+            result[i][0] = tmp[i];
+
+    }
+
+    if (dim==2) {
+
+        double eps = 1e-6;
+
+        Dune::FieldVector<ctype, dim> fX = local;
+        Dune::FieldVector<ctype, dim> bX = local;
+        Dune::FieldVector<ctype, dim> fY = local;
+        Dune::FieldVector<ctype, dim> bY = local;
+
+        fX[0] += eps;
+        bX[0] -= eps;
+        fY[1] += eps;
+        bY[1] -= eps;
+
+        Quaternion<double> dX = (evaluate(fX) - evaluate(bX));
+        Quaternion<double> dY = (evaluate(fY) - evaluate(bY));
+
+        dX /= 2*eps;
+        dY /= 2*eps;
+
+        for (int i=0; i<EmbeddedTangentVector::size; i++){
+            result[i][0] = dX[i];
+            result[i][1] = dY[i];
+        }
+
+    }
+
+    assert(dim==1 || dim==2);
+
+    return result;
+}
 
 #endif
-- 
GitLab