diff --git a/src/enum_scheme.cc b/src/enum_scheme.cc new file mode 100644 index 0000000000000000000000000000000000000000..188a864545df7239b55eaa9985935236efbc0da9 --- /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 ffe4b77ffd5e35a733802324e6963b219e01328c..8e59946e53f67ce17b8fab9f3b6062a4c50298a9 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 1d0ddd749567dd06f5ff63e5c1f745cf7ed89976..d8cc01ef2f2c35520cb41f282d8583cf4bbf46cb 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 4fd5a8e30cdfb5c2d357e136fdb4062a98844867..35834223cb031a7662c125e408c82e53b42195cb 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