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