diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3003c979d5dc5722c2b307b99a2016a55e88d179..373792ddb6765373c36941a89a150045c381666d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -5,12 +5,13 @@ set(SOURCE_FILES enumparser.cc fixedpointiterator.cc friction_writer.cc + rate.cc + rate/rateupdater.cc sand-wedge.cc sand-wedge-data/mygeometry.cc sand-wedge-data/mygrid.cc solverfactory.cc state.cc - timestepping.cc vtk.cc ) diff --git a/src/adaptivetimestepper.hh b/src/adaptivetimestepper.hh index 48634e3684ec8e556bf4cf7fdcd77bc374561285..a6864a7c31e24545af043edf759eb24a8966fba7 100644 --- a/src/adaptivetimestepper.hh +++ b/src/adaptivetimestepper.hh @@ -8,13 +8,13 @@ std::pair<T1, T2> clonePair(std::pair<T1, T2> in) { template <class Factory, class UpdaterPair, class ErrorNorm> class AdaptiveTimeStepper { using StateUpdater = typename UpdaterPair::first_type::element_type; - using VelocityUpdater = typename UpdaterPair::second_type::element_type; + using RateUpdater = typename UpdaterPair::second_type::element_type; using Vector = typename Factory::Vector; using ConvexProblem = typename Factory::ConvexProblem; using Nonlinearity = typename ConvexProblem::NonlinearityType; using MyCoupledTimeStepper = - CoupledTimeStepper<Factory, StateUpdater, VelocityUpdater, ErrorNorm>; + CoupledTimeStepper<Factory, StateUpdater, RateUpdater, ErrorNorm>; public: AdaptiveTimeStepper( diff --git a/src/coupledtimestepper.cc b/src/coupledtimestepper.cc index 49d454e474d326d3a945ec578d82b973ddebabc3..1c12c5c99c0e4269853a23fc9e23845c4eb4da73 100644 --- a/src/coupledtimestepper.cc +++ b/src/coupledtimestepper.cc @@ -4,14 +4,13 @@ #include "coupledtimestepper.hh" -template <class Factory, class StateUpdater, class VelocityUpdater, - class ErrorNorm> -CoupledTimeStepper<Factory, StateUpdater, VelocityUpdater, ErrorNorm>:: +template <class Factory, class StateUpdater, class RateUpdater, class ErrorNorm> +CoupledTimeStepper<Factory, StateUpdater, RateUpdater, ErrorNorm>:: CoupledTimeStepper(double finalTime, Factory &factory, Dune::ParameterTree const &parset, std::shared_ptr<Nonlinearity> globalFriction, std::shared_ptr<StateUpdater> stateUpdater, - std::shared_ptr<VelocityUpdater> velocityUpdater, + std::shared_ptr<RateUpdater> velocityUpdater, ErrorNorm const &errorNorm, std::function<void(double, Vector &)> externalForces) : finalTime_(finalTime), @@ -23,11 +22,10 @@ CoupledTimeStepper<Factory, StateUpdater, VelocityUpdater, ErrorNorm>:: externalForces_(externalForces), errorNorm_(errorNorm) {} -template <class Factory, class StateUpdater, class VelocityUpdater, - class ErrorNorm> -FixedPointIterationCounter -CoupledTimeStepper<Factory, StateUpdater, VelocityUpdater, ErrorNorm>::step( - double relativeTime, double relativeTau) { +template <class Factory, class StateUpdater, class RateUpdater, class ErrorNorm> +FixedPointIterationCounter CoupledTimeStepper< + Factory, StateUpdater, RateUpdater, ErrorNorm>::step(double relativeTime, + double relativeTau) { stateUpdater_->nextTimeStep(); velocityUpdater_->nextTimeStep(); @@ -43,7 +41,7 @@ CoupledTimeStepper<Factory, StateUpdater, VelocityUpdater, ErrorNorm>::step( stateUpdater_->setup(tau); velocityUpdater_->setup(ell, tau, newRelativeTime, velocityRHS, velocityIterate, velocityMatrix); - FixedPointIterator<Factory, StateUpdater, VelocityUpdater, ErrorNorm> + FixedPointIterator<Factory, StateUpdater, RateUpdater, ErrorNorm> fixedPointIterator(factory_, parset_, globalFriction_, errorNorm_); auto const iterations = fixedPointIterator.run(stateUpdater_, velocityUpdater_, velocityMatrix, diff --git a/src/coupledtimestepper.hh b/src/coupledtimestepper.hh index a039829932757ed6d7abcd91dc84fb309a459eb9..98c4b0e971ccb44084a6a12dbd4ac334c3f0fd7f 100644 --- a/src/coupledtimestepper.hh +++ b/src/coupledtimestepper.hh @@ -7,8 +7,7 @@ #include <dune/common/parametertree.hh> #include "fixedpointiterator.hh" -template <class Factory, class StateUpdater, class VelocityUpdater, - class ErrorNorm> +template <class Factory, class StateUpdater, class RateUpdater, class ErrorNorm> class CoupledTimeStepper { using Vector = typename Factory::Vector; using Matrix = typename Factory::Matrix; @@ -20,7 +19,7 @@ class CoupledTimeStepper { Dune::ParameterTree const &parset, std::shared_ptr<Nonlinearity> globalFriction, std::shared_ptr<StateUpdater> stateUpdater, - std::shared_ptr<VelocityUpdater> velocityUpdater, + std::shared_ptr<RateUpdater> velocityUpdater, ErrorNorm const &errorNorm, std::function<void(double, Vector &)> externalForces); @@ -32,7 +31,7 @@ class CoupledTimeStepper { Dune::ParameterTree const &parset_; std::shared_ptr<Nonlinearity> globalFriction_; std::shared_ptr<StateUpdater> stateUpdater_; - std::shared_ptr<VelocityUpdater> velocityUpdater_; + std::shared_ptr<RateUpdater> velocityUpdater_; std::function<void(double, Vector &)> externalForces_; ErrorNorm const &errorNorm_; }; diff --git a/src/coupledtimestepper_tmpl.cc b/src/coupledtimestepper_tmpl.cc index 33f448bdac63ece19511b737d286908b8d229d0d..059922fd0f0208c4eb4f1b48da1703f5a6d9d5dd 100644 --- a/src/coupledtimestepper_tmpl.cc +++ b/src/coupledtimestepper_tmpl.cc @@ -13,9 +13,9 @@ #include "explicitgrid.hh" #include "explicitvectors.hh" +#include "rate/rateupdater.hh" #include "solverfactory.hh" #include "state/stateupdater.hh" -#include "timestepping.hh" using Function = Dune::VirtualFunction<double, double>; using Factory = SolverFactory< @@ -23,9 +23,9 @@ using Factory = SolverFactory< MyBlockProblem<ConvexProblem<GlobalFriction<Matrix, Vector>, Matrix>>, Grid>; using MyStateUpdater = StateUpdater<ScalarVector, Vector>; -using MyVelocityUpdater = TimeSteppingScheme<Vector, Matrix, Function, MY_DIM>; +using MyRateUpdater = RateUpdater<Vector, Matrix, Function, MY_DIM>; using ErrorNorm = EnergyNorm<ScalarMatrix, ScalarVector>; -template class CoupledTimeStepper<Factory, MyStateUpdater, MyVelocityUpdater, +template class CoupledTimeStepper<Factory, MyStateUpdater, MyRateUpdater, ErrorNorm>; diff --git a/src/fixedpointiterator.cc b/src/fixedpointiterator.cc index 295574802fee524025492d400cde0a7258b445c5..67caf40c3b6fc068ff29f05d0c29fcd05430391b 100644 --- a/src/fixedpointiterator.cc +++ b/src/fixedpointiterator.cc @@ -13,9 +13,8 @@ #include "fixedpointiterator.hh" -template <class Factory, class StateUpdater, class VelocityUpdater, - class ErrorNorm> -FixedPointIterator<Factory, StateUpdater, VelocityUpdater, ErrorNorm>:: +template <class Factory, class StateUpdater, class RateUpdater, class ErrorNorm> +FixedPointIterator<Factory, StateUpdater, RateUpdater, ErrorNorm>:: FixedPointIterator(Factory &factory, Dune::ParameterTree const &parset, std::shared_ptr<Nonlinearity> globalFriction, ErrorNorm const &errorNorm) @@ -30,14 +29,12 @@ FixedPointIterator<Factory, StateUpdater, VelocityUpdater, ErrorNorm>:: verbosity_(parset.get<Solver::VerbosityMode>("v.solver.verbosity")), errorNorm_(errorNorm) {} -template <class Factory, class StateUpdater, class VelocityUpdater, - class ErrorNorm> +template <class Factory, class StateUpdater, class RateUpdater, class ErrorNorm> FixedPointIterationCounter -FixedPointIterator<Factory, StateUpdater, VelocityUpdater, ErrorNorm>::run( +FixedPointIterator<Factory, StateUpdater, RateUpdater, ErrorNorm>::run( std::shared_ptr<StateUpdater> stateUpdater, - std::shared_ptr<VelocityUpdater> velocityUpdater, - Matrix const &velocityMatrix, Vector const &velocityRHS, - Vector &velocityIterate) { + std::shared_ptr<RateUpdater> velocityUpdater, Matrix const &velocityMatrix, + Vector const &velocityRHS, Vector &velocityIterate) { EnergyNorm<Matrix, Vector> energyNorm(velocityMatrix); LoopSolver<Vector> velocityProblemSolver(step_.get(), velocityMaxIterations_, velocityTolerance_, &energyNorm, diff --git a/src/fixedpointiterator.hh b/src/fixedpointiterator.hh index 56ba7f28bce2c5e1ef9dd09bd623de1a2f934e53..7543b12e27f52e9b25f7033d798e557862f5e07d 100644 --- a/src/fixedpointiterator.hh +++ b/src/fixedpointiterator.hh @@ -16,8 +16,7 @@ struct FixedPointIterationCounter { std::ostream &operator<<(std::ostream &stream, FixedPointIterationCounter const &fpic); -template <class Factory, class StateUpdater, class VelocityUpdater, - class ErrorNorm> +template <class Factory, class StateUpdater, class RateUpdater, class ErrorNorm> class FixedPointIterator { using ScalarVector = typename StateUpdater::ScalarVector; using Vector = typename Factory::Vector; @@ -31,11 +30,11 @@ class FixedPointIterator { std::shared_ptr<Nonlinearity> globalFriction, ErrorNorm const &errorNorm_); - FixedPointIterationCounter run( - std::shared_ptr<StateUpdater> stateUpdater, - std::shared_ptr<VelocityUpdater> velocityUpdater, - Matrix const &velocityMatrix, Vector const &velocityRHS, - Vector &velocityIterate); + FixedPointIterationCounter run(std::shared_ptr<StateUpdater> stateUpdater, + std::shared_ptr<RateUpdater> velocityUpdater, + Matrix const &velocityMatrix, + Vector const &velocityRHS, + Vector &velocityIterate); private: std::shared_ptr<typename Factory::Step> step_; diff --git a/src/fixedpointiterator_tmpl.cc b/src/fixedpointiterator_tmpl.cc index 5004029355128d59f91b677cb0574e22fdddf991..c39287d6a800a80e22da26f430af6b702b8a3536 100644 --- a/src/fixedpointiterator_tmpl.cc +++ b/src/fixedpointiterator_tmpl.cc @@ -13,9 +13,9 @@ #include "explicitgrid.hh" #include "explicitvectors.hh" +#include "rate/rateupdater.hh" #include "solverfactory.hh" #include "state/stateupdater.hh" -#include "timestepping.hh" using Function = Dune::VirtualFunction<double, double>; using Factory = SolverFactory< @@ -23,9 +23,9 @@ using Factory = SolverFactory< MyBlockProblem<ConvexProblem<GlobalFriction<Matrix, Vector>, Matrix>>, Grid>; using MyStateUpdater = StateUpdater<ScalarVector, Vector>; -using MyVelocityUpdater = TimeSteppingScheme<Vector, Matrix, Function, MY_DIM>; +using MyRateUpdater = RateUpdater<Vector, Matrix, Function, MY_DIM>; using ErrorNorm = EnergyNorm<ScalarMatrix, ScalarVector>; -template class FixedPointIterator<Factory, MyStateUpdater, MyVelocityUpdater, +template class FixedPointIterator<Factory, MyStateUpdater, MyRateUpdater, ErrorNorm>; diff --git a/src/rate.cc b/src/rate.cc new file mode 100644 index 0000000000000000000000000000000000000000..eaa69fb17645a8e48262867289fe138a375e9362 --- /dev/null +++ b/src/rate.cc @@ -0,0 +1,31 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "rate.hh" +#include "rate/newmark.cc" +#include "rate/backward_euler.cc" + +template <class Vector, class Matrix, class Function, int dimension> +std::shared_ptr<RateUpdater<Vector, Matrix, Function, dimension>> +initRateUpdater(Config::scheme scheme, + Function const &velocityDirichletFunction, + Dune::BitSetVector<dimension> const &velocityDirichletNodes, + Matrices<Matrix> const &matrices, Vector const &u_initial, + Vector const &v_initial, Vector const &a_initial) { + switch (scheme) { + case Config::Newmark: + return std::make_shared<Newmark<Vector, Matrix, Function, dimension>>( + matrices, u_initial, v_initial, a_initial, velocityDirichletNodes, + velocityDirichletFunction); + case Config::BackwardEuler: + return std::make_shared< + BackwardEuler<Vector, Matrix, Function, dimension>>( + matrices, u_initial, v_initial, a_initial, velocityDirichletNodes, + velocityDirichletFunction); + default: + assert(false); + } +} + +#include "rate_tmpl.cc" diff --git a/src/rate.hh b/src/rate.hh new file mode 100644 index 0000000000000000000000000000000000000000..b5fe8b3021548bd4baa0fa641167f558ff222826 --- /dev/null +++ b/src/rate.hh @@ -0,0 +1,16 @@ +#ifndef SRC_RATE_HH +#define SRC_RATE_HH + +#include <memory> + +#include "enums.hh" +#include "rate/rateupdater.hh" + +template <class Vector, class Matrix, class Function, int dimension> +std::shared_ptr<RateUpdater<Vector, Matrix, Function, dimension>> +initRateUpdater(Config::scheme scheme, + Function const &velocityDirichletFunction, + Dune::BitSetVector<dimension> const &velocityDirichletNodes, + Matrices<Matrix> const &matrices, Vector const &u_initial, + Vector const &v_initial, Vector const &a_initial); +#endif diff --git a/src/timestepping/backward_euler.cc b/src/rate/backward_euler.cc similarity index 95% rename from src/timestepping/backward_euler.cc rename to src/rate/backward_euler.cc index e9d672194cba6e4fd5b010e15cbcb4f7f5cceede..6664f02b7dd11f266c7729dc18a1fe952312701d 100644 --- a/src/timestepping/backward_euler.cc +++ b/src/rate/backward_euler.cc @@ -1,12 +1,14 @@ #include <dune/solvers/common/arithmetic.hh> +#include "backward_euler.hh" + template <class Vector, class Matrix, class Function, size_t dim> BackwardEuler<Vector, Matrix, Function, dim>::BackwardEuler( Matrices<Matrix> const &_matrices, Vector const &_u_initial, Vector const &_v_initial, Vector const &_a_initial, Dune::BitSetVector<dim> const &_dirichletNodes, Function const &_dirichletFunction) - : TimeSteppingScheme<Vector, Matrix, Function, dim>( + : RateUpdater<Vector, Matrix, Function, dim>( _matrices, _u_initial, _v_initial, _a_initial, _dirichletNodes, _dirichletFunction) {} @@ -84,7 +86,7 @@ void BackwardEuler<Vector, Matrix, Function, dim>::postProcess( } template <class Vector, class Matrix, class Function, size_t dim> -std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, dim>> +std::shared_ptr<RateUpdater<Vector, Matrix, Function, dim>> BackwardEuler<Vector, Matrix, Function, dim>::clone() const { return std::make_shared<BackwardEuler<Vector, Matrix, Function, dim>>(*this); } diff --git a/src/timestepping/backward_euler.hh b/src/rate/backward_euler.hh similarity index 66% rename from src/timestepping/backward_euler.hh rename to src/rate/backward_euler.hh index 09ec584d1307d2a5f4d98271616b44060e20a313..0955f89e19db0300cedcbd5c09895bffce835ff6 100644 --- a/src/timestepping/backward_euler.hh +++ b/src/rate/backward_euler.hh @@ -1,8 +1,8 @@ -#ifndef SRC_TIMESTEPPING_BACKWARD_EULER_HH -#define SRC_TIMESTEPPING_BACKWARD_EULER_HH +#ifndef SRC_RATE_BACKWARD_EULER_HH +#define SRC_RATE_BACKWARD_EULER_HH template <class Vector, class Matrix, class Function, size_t dim> -class BackwardEuler : public TimeSteppingScheme<Vector, Matrix, Function, dim> { +class BackwardEuler : public RateUpdater<Vector, Matrix, Function, dim> { public: BackwardEuler(Matrices<Matrix> const &_matrices, Vector const &_u_initial, Vector const &_v_initial, Vector const &_a_initial, @@ -13,8 +13,7 @@ class BackwardEuler : public TimeSteppingScheme<Vector, Matrix, Function, dim> { Matrix &) override; void postProcess(Vector const &) override; - std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, dim>> clone() - const; + std::shared_ptr<RateUpdater<Vector, Matrix, Function, dim>> clone() const; private: }; diff --git a/src/timestepping/newmark.cc b/src/rate/newmark.cc similarity index 96% rename from src/timestepping/newmark.cc rename to src/rate/newmark.cc index 227f8ba1e3eeb0dcec3be7ea810a9871b601ba9e..990768585c4f7162c87977704c9f0a5f59ecda55 100644 --- a/src/timestepping/newmark.cc +++ b/src/rate/newmark.cc @@ -1,12 +1,14 @@ #include <dune/solvers/common/arithmetic.hh> +#include "newmark.hh" + template <class Vector, class Matrix, class Function, size_t dim> Newmark<Vector, Matrix, Function, dim>::Newmark( Matrices<Matrix> const &_matrices, Vector const &_u_initial, Vector const &_v_initial, Vector const &_a_initial, Dune::BitSetVector<dim> const &_dirichletNodes, Function const &_dirichletFunction) - : TimeSteppingScheme<Vector, Matrix, Function, dim>( + : RateUpdater<Vector, Matrix, Function, dim>( _matrices, _u_initial, _v_initial, _a_initial, _dirichletNodes, _dirichletFunction) {} @@ -94,7 +96,7 @@ void Newmark<Vector, Matrix, Function, dim>::postProcess( } template <class Vector, class Matrix, class Function, size_t dim> -std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, dim>> +std::shared_ptr<RateUpdater<Vector, Matrix, Function, dim>> Newmark<Vector, Matrix, Function, dim>::clone() const { return std::make_shared<Newmark<Vector, Matrix, Function, dim>>(*this); } diff --git a/src/timestepping/newmark.hh b/src/rate/newmark.hh similarity index 66% rename from src/timestepping/newmark.hh rename to src/rate/newmark.hh index f2a5d566bc96b49f1fa7f45d4bfd4244affcf3b7..8c8658c434afa297e4dc9940d1b722f7ab1c714a 100644 --- a/src/timestepping/newmark.hh +++ b/src/rate/newmark.hh @@ -1,8 +1,8 @@ -#ifndef SRC_TIMESTEPPING_NEWMARK_HH -#define SRC_TIMESTEPPING_NEWMARK_HH +#ifndef SRC_RATE_NEWMARK_HH +#define SRC_RATE_NEWMARK_HH template <class Vector, class Matrix, class Function, size_t dim> -class Newmark : public TimeSteppingScheme<Vector, Matrix, Function, dim> { +class Newmark : public RateUpdater<Vector, Matrix, Function, dim> { public: Newmark(Matrices<Matrix> const &_matrices, Vector const &_u_initial, Vector const &_v_initial, Vector const &_a_initial, @@ -13,7 +13,6 @@ class Newmark : public TimeSteppingScheme<Vector, Matrix, Function, dim> { Matrix &) override; void postProcess(Vector const &) override; - std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, dim>> clone() - const; + std::shared_ptr<RateUpdater<Vector, Matrix, Function, dim>> clone() const; }; #endif diff --git a/src/timestepping.cc b/src/rate/rateupdater.cc similarity index 70% rename from src/timestepping.cc rename to src/rate/rateupdater.cc index f5cd258d006398119ae94954f8c3e75cc71f79de..2de879b3744708d05425f3400b9a192633c03053 100644 --- a/src/timestepping.cc +++ b/src/rate/rateupdater.cc @@ -2,10 +2,10 @@ #include "config.h" #endif -#include "timestepping.hh" +#include "rateupdater.hh" template <class Vector, class Matrix, class Function, size_t dim> -TimeSteppingScheme<Vector, Matrix, Function, dim>::TimeSteppingScheme( +RateUpdater<Vector, Matrix, Function, dim>::RateUpdater( Matrices<Matrix> const &_matrices, Vector const &_u_initial, Vector const &_v_initial, Vector const &_a_initial, Dune::BitSetVector<dim> const &_dirichletNodes, @@ -18,7 +18,7 @@ TimeSteppingScheme<Vector, Matrix, Function, dim>::TimeSteppingScheme( dirichletFunction(_dirichletFunction) {} template <class Vector, class Matrix, class Function, size_t dim> -void TimeSteppingScheme<Vector, Matrix, Function, dim>::nextTimeStep() { +void RateUpdater<Vector, Matrix, Function, dim>::nextTimeStep() { u_o = u; v_o = v; a_o = a; @@ -26,7 +26,7 @@ void TimeSteppingScheme<Vector, Matrix, Function, dim>::nextTimeStep() { } template <class Vector, class Matrix, class Function, size_t dim> -void TimeSteppingScheme<Vector, Matrix, Function, dim>::extractDisplacement( +void RateUpdater<Vector, Matrix, Function, dim>::extractDisplacement( Vector &displacement) const { if (!postProcessCalled) DUNE_THROW(Dune::Exception, "It seems you forgot to call postProcess!"); @@ -35,7 +35,7 @@ void TimeSteppingScheme<Vector, Matrix, Function, dim>::extractDisplacement( } template <class Vector, class Matrix, class Function, size_t dim> -void TimeSteppingScheme<Vector, Matrix, Function, dim>::extractVelocity( +void RateUpdater<Vector, Matrix, Function, dim>::extractVelocity( Vector &velocity) const { if (!postProcessCalled) DUNE_THROW(Dune::Exception, "It seems you forgot to call postProcess!"); @@ -44,12 +44,11 @@ void TimeSteppingScheme<Vector, Matrix, Function, dim>::extractVelocity( } template <class Vector, class Matrix, class Function, size_t dim> -void TimeSteppingScheme<Vector, Matrix, Function, dim>::extractOldVelocity( +void RateUpdater<Vector, Matrix, Function, dim>::extractOldVelocity( Vector &oldVelocity) const { oldVelocity = v_o; } -#include "timestepping/backward_euler.cc" -#include "timestepping/newmark.cc" - -#include "timestepping_tmpl.cc" +#include "backward_euler.cc" +#include "newmark.cc" +#include "rateupdater_tmpl.cc" diff --git a/src/rate/rateupdater.hh b/src/rate/rateupdater.hh new file mode 100644 index 0000000000000000000000000000000000000000..7b382e2e533e26341fe8d257b7771f1df90310c7 --- /dev/null +++ b/src/rate/rateupdater.hh @@ -0,0 +1,43 @@ +#ifndef SRC_RATE_RATEUPDATER_HH +#define SRC_RATE_RATEUPDATER_HH + +#include <memory> + +#include <dune/common/bitsetvector.hh> + +#include "../matrices.hh" + +template <class Vector, class Matrix, class Function, size_t dim> +class RateUpdater { +protected: + RateUpdater(Matrices<Matrix> const &_matrices, Vector const &_u_initial, + Vector const &_v_initial, Vector const &_a_initial, + Dune::BitSetVector<dim> const &_dirichletNodes, + Function const &_dirichletFunction); + +public: + void nextTimeStep(); + void virtual setup(Vector const &ell, double _tau, double relativeTime, + Vector &rhs, Vector &iterate, Matrix &AB) = 0; + + void virtual postProcess(Vector const &iterate) = 0; + void extractDisplacement(Vector &displacement) const; + void extractVelocity(Vector &velocity) const; + void extractOldVelocity(Vector &velocity) const; + + std::shared_ptr<RateUpdater<Vector, Matrix, Function, dim>> virtual clone() + const = 0; + +protected: + Matrices<Matrix> const &matrices; + Vector u, v, a; + Dune::BitSetVector<dim> const &dirichletNodes; + Function const &dirichletFunction; + double dirichletValue; + + Vector u_o, v_o, a_o; + double tau; + + bool postProcessCalled = true; +}; +#endif diff --git a/src/timestepping_tmpl.cc b/src/rate/rateupdater_tmpl.cc similarity index 72% rename from src/timestepping_tmpl.cc rename to src/rate/rateupdater_tmpl.cc index b9e86274e99137a41e9593f87dacdcbb0ae7484d..0537ce57bdf1f3e7cfd9d2590652cfc919a854fd 100644 --- a/src/timestepping_tmpl.cc +++ b/src/rate/rateupdater_tmpl.cc @@ -4,10 +4,10 @@ #include <dune/common/function.hh> -#include "explicitvectors.hh" +#include "../explicitvectors.hh" using Function = Dune::VirtualFunction<double, double>; -template class TimeSteppingScheme<Vector, Matrix, Function, MY_DIM>; +template class RateUpdater<Vector, Matrix, Function, MY_DIM>; template class Newmark<Vector, Matrix, Function, MY_DIM>; template class BackwardEuler<Vector, Matrix, Function, MY_DIM>; diff --git a/src/rate_tmpl.cc b/src/rate_tmpl.cc new file mode 100644 index 0000000000000000000000000000000000000000..51788ed329971dcbf56e745f46fdee252be42db9 --- /dev/null +++ b/src/rate_tmpl.cc @@ -0,0 +1,12 @@ +#include <dune/common/function.hh> + +#include "explicitvectors.hh" + +using Function = Dune::VirtualFunction<double, double>; + +template std::shared_ptr<RateUpdater<Vector, Matrix, Function, MY_DIM>> +initRateUpdater<Vector, Matrix, Function, MY_DIM>( + Config::scheme scheme, Function const &velocityDirichletFunction, + Dune::BitSetVector<MY_DIM> const &velocityDirichletNodes, + Matrices<Matrix> const &matrices, Vector const &u_initial, + Vector const &v_initial, Vector const &a_initial); diff --git a/src/sand-wedge.cc b/src/sand-wedge.cc index af0fe30b561556be77a833600d57787f28068c14..dab96e4fa0ba0208fffdaac61046e97307671121 100644 --- a/src/sand-wedge.cc +++ b/src/sand-wedge.cc @@ -60,6 +60,7 @@ #include "friction_writer.hh" #include "gridselector.hh" #include "matrices.hh" +#include "rate.hh" #include "sand-wedge-data/mybody.hh" #include "sand-wedge-data/mygeometry.hh" #include "sand-wedge-data/myglobalfrictiondata.hh" @@ -68,7 +69,6 @@ #include "sand-wedge-data/weakpatch.hh" #include "solverfactory.hh" #include "state.hh" -#include "timestepping.hh" #include "vtk.hh" size_t const dims = MY_DIM; @@ -346,16 +346,16 @@ int main(int argc, char *argv[]) { Grid>; NonlinearFactory factory(parset.sub("solver.tnnmg"), *grid, dirichletNodes); - using UpdaterPair = std::pair< - std::shared_ptr<StateUpdater<ScalarVector, Vector>>, - std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, dims>>>; + using UpdaterPair = + std::pair<std::shared_ptr<StateUpdater<ScalarVector, Vector>>, + std::shared_ptr<RateUpdater<Vector, Matrix, Function, dims>>>; UpdaterPair current( initStateUpdater<ScalarVector, Vector>( parset.get<Config::stateModel>("boundary.friction.stateModel"), alpha_initial, frictionalNodes, parset.get<double>("boundary.friction.L"), parset.get<double>("boundary.friction.V0")), - initTimeStepper(parset.get<Config::scheme>("timeSteps.scheme"), + initRateUpdater(parset.get<Config::scheme>("timeSteps.scheme"), velocityDirichletFunction, dirichletNodes, matrices, u_initial, v_initial, a_initial)); diff --git a/src/timestepping.hh b/src/timestepping.hh deleted file mode 100644 index cd6fec8554d1940da3b38a6a83d1e94c601f0d6b..0000000000000000000000000000000000000000 --- a/src/timestepping.hh +++ /dev/null @@ -1,70 +0,0 @@ -#ifndef SRC_TIMESTEPPING_HH -#define SRC_TIMESTEPPING_HH - -#include <memory> - -#include <dune/common/bitsetvector.hh> - -#include "enums.hh" -#include "matrices.hh" - -template <class Vector, class Matrix, class Function, size_t dim> -class TimeSteppingScheme { -protected: - TimeSteppingScheme(Matrices<Matrix> const &_matrices, - Vector const &_u_initial, Vector const &_v_initial, - Vector const &_a_initial, - Dune::BitSetVector<dim> const &_dirichletNodes, - Function const &_dirichletFunction); - -public: - void nextTimeStep(); - void virtual setup(Vector const &ell, double _tau, double relativeTime, - Vector &rhs, Vector &iterate, Matrix &AB) = 0; - - void virtual postProcess(Vector const &iterate) = 0; - void extractDisplacement(Vector &displacement) const; - void extractVelocity(Vector &velocity) const; - void extractOldVelocity(Vector &velocity) const; - - std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, - dim>> virtual clone() const = 0; - -protected: - Matrices<Matrix> const &matrices; - Vector u, v, a; - Dune::BitSetVector<dim> const &dirichletNodes; - Function const &dirichletFunction; - double dirichletValue; - - Vector u_o, v_o, a_o; - double tau; - - bool postProcessCalled = true; -}; - -#include "timestepping/newmark.hh" -#include "timestepping/backward_euler.hh" - -template <class Vector, class Matrix, class Function, int dimension> -std::shared_ptr<TimeSteppingScheme<Vector, Matrix, Function, dimension>> -initTimeStepper(Config::scheme scheme, - Function const &velocityDirichletFunction, - Dune::BitSetVector<dimension> const &velocityDirichletNodes, - Matrices<Matrix> const &matrices, Vector const &u_initial, - Vector const &v_initial, Vector const &a_initial) { - switch (scheme) { - case Config::Newmark: - return std::make_shared<Newmark<Vector, Matrix, Function, dimension>>( - matrices, u_initial, v_initial, a_initial, velocityDirichletNodes, - velocityDirichletFunction); - case Config::BackwardEuler: - return std::make_shared< - BackwardEuler<Vector, Matrix, Function, dimension>>( - matrices, u_initial, v_initial, a_initial, velocityDirichletNodes, - velocityDirichletFunction); - default: - assert(false); - } -} -#endif