From e40bcd0cb00a7437a7b3cf4782a406b3939129c6 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Fri, 14 Oct 2011 16:59:39 +0000
Subject: [PATCH] implement the missing parts for the higher-order case

[[Imported from SVN: r7925]]
---
 dune/gfe/localgeodesicfefunction.hh | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/dune/gfe/localgeodesicfefunction.hh b/dune/gfe/localgeodesicfefunction.hh
index ce4cdb90..094b58ff 100644
--- a/dune/gfe/localgeodesicfefunction.hh
+++ b/dune/gfe/localgeodesicfefunction.hh
@@ -10,6 +10,7 @@
 #include <dune/gfe/rigidbodymotion.hh>
 
 #include <dune/gfe/tensor3.hh>
+#include <dune/gfe/tensorssd.hh>
 #include <dune/gfe/linearalgebra.hh>
 
 // forward declaration
@@ -428,10 +429,11 @@ evaluateDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim>&
     
    
     Dune::FieldMatrix<ctype,embeddedDim,embeddedDim> mixedDerivative = TargetSpace::secondDerivativeOfDistanceSquaredWRTFirstAndSecondArgument(coefficients_[coefficient], q);
-    Tensor3<double,embeddedDim,embeddedDim,dim+1> dvDwF(0);
+    TensorSSD<double,embeddedDim,embeddedDim> dvDwF(coefficients_.size());
+    dvDwF = 0;
     for (int i=0; i<embeddedDim; i++)
         for (int j=0; j<embeddedDim; j++)
-            dvDwF[i][j][coefficient] = mixedDerivative[i][j];
+            dvDwF.data_[i][j][coefficient] = mixedDerivative[i][j];
     
     
     // dFDq is not invertible, if the target space is embedded into a higher-dimensional
@@ -454,26 +456,33 @@ evaluateDerivativeOfGradientWRTCoefficient(const Dune::FieldVector<ctype, dim>&
     Tensor3<double, embeddedDim,embeddedDim,embeddedDim> dqdqF;
     dqdqF = computeDqDqF(w,q);
 
-    Tensor3<double, embeddedDim,embeddedDim,dim+1> dqdwF;
+    TensorSSD<double, embeddedDim,embeddedDim> dqdwF(coefficients_.size());
 
-    for (int k=0; k<dim+1; k++) {
+    for (size_t k=0; k<coefficients_.size(); k++) {
         Dune::FieldMatrix<ctype,embeddedDim,embeddedDim> hesse = TargetSpace::secondDerivativeOfDistanceSquaredWRTSecondArgument(coefficients_[k], q);
         for (int i=0; i<embeddedDim; i++)
             for (int j=0; j<embeddedDim; j++)
-                dqdwF[i][j][k] = hesse[i][j];
+                dqdwF.data_[i][j][k] = hesse[i][j];
     }
 
-    Tensor3<double, embeddedDim,embeddedDim,dim+1> dqdwF_times_dvq;
+    TensorSSD<double, embeddedDim,embeddedDim> dqdwF_times_dvq(coefficients_.size());
     for (int i=0; i<embeddedDim; i++)
         for (int j=0; j<embeddedDim; j++)
-            for (int k=0; k<dim+1; k++) {
-                dqdwF_times_dvq[i][j][k] = 0;
+            for (size_t k=0; k<coefficients_.size(); k++) {
+                dqdwF_times_dvq.data_[i][j][k] = 0;
                 for (int l=0; l<embeddedDim; l++)
-                    dqdwF_times_dvq[i][j][k] += dqdwF[l][j][k] * dvq[l][i];
+                    dqdwF_times_dvq.data_[i][j][k] += dqdwF.data_[l][j][k] * dvq[l][i];
             }
 
     Tensor3<double, embeddedDim,embeddedDim,dim> foo;
-    foo =  -1 * dvDqF*derivative - (dvq*dqdqF)*derivative - dvDwF * B - dqdwF_times_dvq*B;
+    foo =  -1 * dvDqF*derivative - (dvq*dqdqF)*derivative;
+    TensorSSD<double,embeddedDim,embeddedDim> bar(dim);
+    bar = dvDwF * B + dqdwF_times_dvq*B;
+
+    for (int i=0; i<embeddedDim; i++)
+        for (int j=0; j<embeddedDim; j++)
+            for (int k=0; k<dim; k++)
+                foo[i][j][k] -= bar.data_[i][j][k];
     
     result = 0;
     for (int i=0; i<embeddedDim; i++)
-- 
GitLab