From e666231f1373057e4f220d7e611edf2fb8f32d24 Mon Sep 17 00:00:00 2001
From: Oliver Sander <oliver.sander@tu-dresden.de>
Date: Thu, 11 Feb 2016 11:06:38 +0100
Subject: [PATCH] Make TargetSpace a local rather than a global variable

This is a preparation to allow to select the TargetSpace at run-time.
---
 src/compute-disc-error.cc | 121 ++++++++++++++++++++------------------
 1 file changed, 64 insertions(+), 57 deletions(-)

diff --git a/src/compute-disc-error.cc b/src/compute-disc-error.cc
index d67f3ced..5558e2e1 100644
--- a/src/compute-disc-error.cc
+++ b/src/compute-disc-error.cc
@@ -26,16 +26,9 @@
 const int dim = 2;
 const int dimworld = 2;
 
-// Image space of the geodesic fe functions
-const int targetDim = 3;
-// typedef Rotation<double,targetDim> TargetSpace;
-// typedef UnitVector<double,targetDim> TargetSpace;
-// typedef RealTuple<double,targetDim> TargetSpace;
-using TargetSpace = RigidBodyMotion<double,targetDim>;
-
 using namespace Dune;
 
-template <class GridView, int order>
+template <class GridView, int order, class TargetSpace>
 void measureDiscreteEOC(const GridView gridView,
                         const GridView referenceGridView,
                         const ParameterTree& parameterSet)
@@ -59,7 +52,7 @@ void measureDiscreteEOC(const GridView gridView,
   //////////////////////////////////////////////////////////////////////////////////
 
   // Input data
-  typedef BlockVector<TargetSpace::CoordinateType> EmbeddedVectorType;
+  typedef BlockVector<typename TargetSpace::CoordinateType> EmbeddedVectorType;
 
   EmbeddedVectorType embeddedX(feBasis.size());
   std::ifstream inFile(parameterSet.get<std::string>("simulationData"), std::ios_base::binary);
@@ -132,7 +125,7 @@ void measureDiscreteEOC(const GridView gridView,
             << std::endl;
 }
 
-template <class GridView, int order>
+template <class GridView, int order, class TargetSpace>
 void measureAnalyticalEOC(const GridView gridView,
                           const ParameterTree& parameterSet)
 {
@@ -150,7 +143,7 @@ void measureAnalyticalEOC(const GridView gridView,
   //////////////////////////////////////////////////////////////////////////////////
 
   // Input data
-  typedef BlockVector<TargetSpace::CoordinateType> EmbeddedVectorType;
+  typedef BlockVector<typename TargetSpace::CoordinateType> EmbeddedVectorType;
 
   EmbeddedVectorType embeddedX(feBasis.size());
   std::ifstream inFile(parameterSet.get<std::string>("simulationData"), std::ios_base::binary);
@@ -171,7 +164,7 @@ void measureAnalyticalEOC(const GridView gridView,
   FufemFEBasis fufemFEBasis(feBasis);
 
   // Read reference solution and its derivative into a PythonFunction
-  typedef VirtualDifferentiableFunction<FieldVector<double, dim>, TargetSpace::CoordinateType> FBase;
+  typedef VirtualDifferentiableFunction<FieldVector<double, dim>, typename TargetSpace::CoordinateType> FBase;
 
   Python::Module module = Python::import(parameterSet.get<std::string>("referenceSolution"));
   auto referenceSolution = module.get("fdf").toC<std::shared_ptr<FBase>>();
@@ -200,9 +193,65 @@ void measureAnalyticalEOC(const GridView gridView,
   std::cout << "H^1 error: " << std::sqrt(l2Error*l2Error + h1Error) << std::endl;
 }
 
+template <class GridType, class TargetSpace>
+void measureEOC(const std::shared_ptr<GridType> grid,
+                const std::shared_ptr<GridType> referenceGrid,
+                const ParameterTree& parameterSet)
+{
+  const int order = parameterSet.get<int>("order");
+
+  if (parameterSet.get<std::string>("discretizationErrorMode")=="discrete")
+  {
+    switch (order)
+    {
+      case 1:
+      measureDiscreteEOC<typename GridType::LeafGridView,1,TargetSpace>(grid->leafGridView(), referenceGrid->leafGridView(), parameterSet);
+      break;
+
+      case 2:
+      measureDiscreteEOC<typename GridType::LeafGridView,2,TargetSpace>(grid->leafGridView(), referenceGrid->leafGridView(), parameterSet);
+      break;
+
+      case 3:
+      measureDiscreteEOC<typename GridType::LeafGridView,3,TargetSpace>(grid->leafGridView(), referenceGrid->leafGridView(), parameterSet);
+      break;
+
+      default:
+        DUNE_THROW(NotImplemented, "Order '" << order << "' is not implemented");
+    }
+  }
+
+  if (parameterSet.get<std::string>("discretizationErrorMode")=="analytical")
+  {
+    switch (order)
+    {
+      case 1:
+      measureAnalyticalEOC<typename GridType::LeafGridView,1,TargetSpace>(grid->leafGridView(), parameterSet);
+      break;
+
+      case 2:
+      measureAnalyticalEOC<typename GridType::LeafGridView,2,TargetSpace>(grid->leafGridView(), parameterSet);
+      break;
+
+      case 3:
+      measureAnalyticalEOC<typename GridType::LeafGridView,3,TargetSpace>(grid->leafGridView(), parameterSet);
+      break;
+
+      default:
+        DUNE_THROW(NotImplemented, "Order '" << order << "' is not implemented");
+    }
+  }
+}
 
 int main (int argc, char *argv[]) try
 {
+  // Image space of the geodesic fe functions
+  const int targetDim = 3;
+  // typedef Rotation<double,targetDim> TargetSpace;
+  // typedef UnitVector<double,targetDim> TargetSpace;
+  // typedef RealTuple<double,targetDim> TargetSpace;
+  using TargetSpace = RigidBodyMotion<double,targetDim>;
+
   // Start Python interpreter
   Python::start();
   Python::Reference main = Python::import("__main__");
@@ -258,51 +307,9 @@ int main (int argc, char *argv[]) try
 
   // Do the actual measurement
 
-  const int order = parameterSet.get<int>("order");
-
-  if (parameterSet.get<std::string>("discretizationErrorMode")=="discrete")
-  {
-    switch (order)
-    {
-      case 1:
-      measureDiscreteEOC<GridType::LeafGridView,1>(grid->leafGridView(), referenceGrid->leafGridView(), parameterSet);
-      break;
-
-      case 2:
-      measureDiscreteEOC<GridType::LeafGridView,2>(grid->leafGridView(), referenceGrid->leafGridView(), parameterSet);
-      break;
-
-      case 3:
-      measureDiscreteEOC<GridType::LeafGridView,3>(grid->leafGridView(), referenceGrid->leafGridView(), parameterSet);
-      break;
-
-      default:
-        DUNE_THROW(NotImplemented, "Order '" << order << "' is not implemented");
-    }
-  }
-
-  if (parameterSet.get<std::string>("discretizationErrorMode")=="analytical")
-  {
-    switch (order)
-    {
-      case 1:
-      measureAnalyticalEOC<GridType::LeafGridView,1>(grid->leafGridView(), parameterSet);
-      break;
-
-      case 2:
-      measureAnalyticalEOC<GridType::LeafGridView,2>(grid->leafGridView(), parameterSet);
-      break;
-
-      case 3:
-      measureAnalyticalEOC<GridType::LeafGridView,3>(grid->leafGridView(), parameterSet);
-      break;
-
-      default:
-        DUNE_THROW(NotImplemented, "Order '" << order << "' is not implemented");
-    }
-  }
-
-
+  measureEOC<GridType,TargetSpace>(grid,
+                          referenceGrid,
+                          parameterSet);
 
   return 0;
 }
-- 
GitLab