From 8f72fa9422c985fef4ae51a36d8b088802bb2a45 Mon Sep 17 00:00:00 2001
From: Elias Pipping <elias.pipping@fu-berlin.de>
Date: Tue, 11 Sep 2012 10:49:46 +0200
Subject: [PATCH] Introduce enum for scheme; Give each a constructor

---
 src/enum_scheme.cc         | 13 ++++++++++++
 src/enums.hh               |  4 ++++
 src/one-body-sample.cc     | 42 +++++++++++++++++++++++---------------
 src/one-body-sample.parset |  2 +-
 4 files changed, 44 insertions(+), 17 deletions(-)
 create mode 100644 src/enum_scheme.cc

diff --git a/src/enum_scheme.cc b/src/enum_scheme.cc
new file mode 100644
index 00000000..188a8645
--- /dev/null
+++ b/src/enum_scheme.cc
@@ -0,0 +1,13 @@
+#include <dune/common/exceptions.hh>
+
+template <> struct StringToEnum<Config::scheme> {
+  static Config::scheme convert(std::string const &s) {
+    if (s == "implicitTwoStep")
+      return Config::ImplicitTwoStep;
+
+    if (s == "implicitEuler")
+      return Config::ImplicitEuler;
+
+    DUNE_THROW(Dune::Exception, "failed to parse enum");
+  }
+};
diff --git a/src/enums.hh b/src/enums.hh
index ffe4b77f..8e59946e 100644
--- a/src/enums.hh
+++ b/src/enums.hh
@@ -10,5 +10,9 @@ struct Config {
     Dieterich,
     Ruina
   };
+  enum scheme {
+    ImplicitTwoStep,
+    ImplicitEuler
+  };
 };
 #endif
diff --git a/src/one-body-sample.cc b/src/one-body-sample.cc
index 1d0ddd74..d8cc01ef 100644
--- a/src/one-body-sample.cc
+++ b/src/one-body-sample.cc
@@ -71,6 +71,7 @@
 #include "enums.hh"
 #include "enum_parser.cc"
 #include "enum_state_model.cc"
+#include "enum_scheme.cc"
 
 #include "timestepping.cc"
 
@@ -259,22 +260,31 @@ int main(int argc, char *argv[]) {
         VectorType *u_old_old_ptr = (run == 1) ? nullptr : &u_old_old;
 
         typedef TimeSteppingScheme<VectorType, MatrixType,
-                                   decltype(dirichletFunction), dim> TS;
-        typedef ImplicitEuler<VectorType, MatrixType,
-                              decltype(dirichletFunction), dim> IE;
-        typedef ImplicitTwoStep<VectorType, MatrixType,
-                                decltype(dirichletFunction), dim> ITS;
-
-        Dune::shared_ptr<TS> timeSteppingScheme;
-        if (run == 1 || !parset.get<bool>("implicitTwoStep"))
-          timeSteppingScheme =
-              Dune::make_shared<IE>(ell, stiffnessMatrix, u_old, u_old_old_ptr,
-                                    ignoreNodes, dirichletFunction, time, tau);
-        else
-          timeSteppingScheme =
-              Dune::make_shared<ITS>(ell, stiffnessMatrix, u_old, u_old_old_ptr,
-                                     ignoreNodes, dirichletFunction, time, tau);
-
+                                   decltype(dirichletFunction),
+                                   dim> TimeSteppingSchemeType;
+        Dune::shared_ptr<TimeSteppingSchemeType> timeSteppingScheme;
+        {
+          typedef ImplicitEuler<VectorType, MatrixType,
+                                decltype(dirichletFunction), dim> IE;
+          typedef ImplicitTwoStep<VectorType, MatrixType,
+                                  decltype(dirichletFunction), dim> ITS;
+
+          switch (parset.get<Config::scheme>("timeSteppingScheme")) {
+            case Config::ImplicitTwoStep:
+              if (run != 1) {
+                timeSteppingScheme = Dune::make_shared<ITS>(
+                    ell, stiffnessMatrix, u_old, u_old_old_ptr, ignoreNodes,
+                    dirichletFunction, time, tau);
+                break;
+              }
+            // Fall through
+            case Config::ImplicitEuler:
+              timeSteppingScheme = Dune::make_shared<IE>(
+                  ell, stiffnessMatrix, u_old, u_old_old_ptr, ignoreNodes,
+                  dirichletFunction, time, tau);
+              break;
+          }
+        }
         timeSteppingScheme->setup(problem_rhs, problem_iterate, problem_A);
 
         VectorType u_saved = u_old;
diff --git a/src/one-body-sample.parset b/src/one-body-sample.parset
index 4fd5a8e3..35834223 100644
--- a/src/one-body-sample.parset
+++ b/src/one-body-sample.parset
@@ -13,7 +13,7 @@ printVelocitySteppingComparison = false
 
 enable_timer = false
 
-implicitTwoStep = false
+timeSteppingScheme = implicitEuler
 
 [grid]
 refinements = 4
-- 
GitLab