From 1ef03b952e5bab26af42db0ebba44e3e8b556773 Mon Sep 17 00:00:00 2001
From: Oliver Sander <sander@igpm.rwth-aachen.de>
Date: Mon, 17 Sep 2012 12:33:17 +0000
Subject: [PATCH] Use GFEDifferenceNormSquared to compute errors.

This more general method works even when using parametrized
boundaries.

[[Imported from SVN: r8877]]
---
 harmonicmaps-eoc.cc | 23 ++++++++++++++++++-----
 1 file changed, 18 insertions(+), 5 deletions(-)

diff --git a/harmonicmaps-eoc.cc b/harmonicmaps-eoc.cc
index e1c629f5..4e9305b4 100644
--- a/harmonicmaps-eoc.cc
+++ b/harmonicmaps-eoc.cc
@@ -33,6 +33,7 @@ const int order = 3;
 #include <dune/gfe/geodesicfeassembler.hh>
 #include <dune/gfe/riemanniantrsolver.hh>
 #include <dune/gfe/geodesicfefunctionadaptor.hh>
+#include <dune/gfe/gfedifferencenormsquared.hh>
 
 // grid dimension
 const int dim = 2;
@@ -270,12 +271,23 @@ int main (int argc, char *argv[]) try
         for (int j=0; j<solution.size(); j++)
             xEmbedded[j] = solution[j].globalCoordinates();
 
-#if ! defined THIRD_ORDER && ! defined SECOND_ORDER
         LeafAmiraMeshWriter<GridType> amiramesh;
         amiramesh.addGrid(grid->leafView());
+#if ! defined THIRD_ORDER && ! defined SECOND_ORDER
         amiramesh.addVertexData(xEmbedded, grid->leafView());
-        amiramesh.write("harmonic_result_" + numberAsAscii.str() + ".am");
 #endif
+        amiramesh.write("harmonic_result_" + numberAsAscii.str() + ".am");
+        
+        double newL2 = GFEDifferenceNormSquared<FEBasis,TargetSpace>::compute(*referenceGrid, referenceSolution,
+                                                         *grid, solution,
+                                                         &massMatrixLocalAssembler);
+        newL2 = std::sqrt(newL2);
+
+        double newH1 = GFEDifferenceNormSquared<FEBasis,TargetSpace>::compute(*referenceGrid, referenceSolution,
+                                                         *grid, solution,
+                                                         &laplaceLocalAssembler);
+        newH1 = std::sqrt(newH1);
+        
         
         // Prolong solution to the very finest grid
         for (int j=i; j<numLevels; j++) {
@@ -283,7 +295,7 @@ int main (int argc, char *argv[]) try
 #if defined THIRD_ORDER || defined SECOND_ORDER
             GeodesicFEFunctionAdaptor<FEBasis,TargetSpace>::higherOrderGFEFunctionAdaptor<order>(basis, *grid, solution);
 #else
-            geodesicFEFunctionAdaptor(*grid, solution);
+            GeodesicFEFunctionAdaptor<FEBasis,TargetSpace>::geodesicFEFunctionAdaptor(*grid, solution);
 #endif
         }
 
@@ -299,17 +311,18 @@ int main (int argc, char *argv[]) try
         H1SemiNorm< BlockVector<TargetSpace::CoordinateType> > l2Norm(massMatrix);
 
         // Compute max-norm difference
+        std::cout << "Level: " << i-1 << "   vertices: " << xEmbedded.size() << std::endl;
         std::cout << "h: " << std::pow(0.5, i-1) << std::endl;
         std::cout << "Level: " << i-1 
                   << ",   max-norm error: " << difference.infinity_norm()
                   << std::endl;
 
         std::cout << "Level: " << i-1 
-                  << ",   L2 error: " << l2Norm(difference)
+                  << ",   L2 error: " << l2Norm(difference) << ",   new: " << newL2
                   << std::endl;
 
         std::cout << "Level: " << i-1 
-                  << ",   H1 error: " << h1Norm(difference)
+                  << ",   H1 error: " << h1Norm(difference) << ",   new: " << newH1
                   << std::endl;
                   
         logFile << std::pow(0.5, i-1) << "  " << difference.infinity_norm() 
-- 
GitLab