From 9ee0e5e6505023d0b070220162e20b3c395bb8ed Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Mon, 18 Apr 2011 09:13:01 +0000
Subject: [PATCH] method to compute the actual Hesse matrix.  For some strange
 reason this slows down convergence, rather than speeding it up.  to be
 investigated

[[Imported from SVN: r7173]]
---
 dune/gfe/averagedistanceassembler.hh | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/dune/gfe/averagedistanceassembler.hh b/dune/gfe/averagedistanceassembler.hh
index 9a13a682..3e072407 100644
--- a/dune/gfe/averagedistanceassembler.hh
+++ b/dune/gfe/averagedistanceassembler.hh
@@ -73,6 +73,25 @@ public:
             matrix.axpy(weights_[i], TargetSpace::secondDerivativeOfDistanceSquaredWRTSecondArgument(coefficients_[i], x));
     }
 
+    void assembleHessian(const TargetSpace& x,
+                         Dune::FieldMatrix<double,size,size>& matrix) const
+    {
+        Dune::FieldMatrix<double,embeddedSize,embeddedSize> embeddedHessian;
+        assembleEmbeddedHessian(x,embeddedHessian);
+        
+        Dune::FieldMatrix<double,size,embeddedSize> frame = x.orthonormalFrame();
+        
+        // this is frame * embeddedHessian * frame^T
+        for (int i=0; i<size; i++)
+            for (int j=0; j<size; j++) {
+                matrix[i][j] = 0;
+                for (int k=0; k<embeddedSize; k++)
+                    for (int l=0; l<embeddedSize; l++)
+                        matrix[i][j] += frame[i][k]*embeddedHessian[k][l]*frame[j][l];
+            }
+        
+    }
+
     const std::vector<TargetSpace> coefficients_;
 
     const std::vector<double> weights_;
-- 
GitLab