Skip to content
Snippets Groups Projects
Commit 0efe192d authored by Elias Pipping's avatar Elias Pipping
Browse files

[Cleanup] Introduce CoupledTimeStepper class

parent 7b8d9318
No related branches found
No related tags found
No related merge requests found
...@@ -178,6 +178,62 @@ class FixedPointIterator { ...@@ -178,6 +178,62 @@ class FixedPointIterator {
Solver::VerbosityMode verbosity_; Solver::VerbosityMode verbosity_;
}; };
template <class Factory, class StateUpdater, class VelocityUpdater>
class CoupledTimeStepper {
using Vector = typename Factory::Vector;
using Matrix = typename Factory::Matrix;
using ConvexProblem = typename Factory::ConvexProblem;
using Nonlinearity = typename ConvexProblem::NonlinearityType;
public:
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::function<void(double, Vector &)> externalForces)
: finalTime_(finalTime),
factory_(factory),
parset_(parset),
globalFriction_(globalFriction),
stateUpdater_(stateUpdater),
velocityUpdater_(velocityUpdater),
externalForces_(externalForces) {}
void step(double relativeTime, double relativeTau) {
stateUpdater_->nextTimeStep();
velocityUpdater_->nextTimeStep();
auto const newRelativeTime = relativeTime + relativeTau;
Vector ell;
externalForces_(newRelativeTime, ell);
Matrix velocityMatrix;
Vector velocityRHS;
Vector velocityIterate;
auto const tau = relativeTau * finalTime_;
stateUpdater_->setup(tau);
velocityUpdater_->setup(ell, tau, newRelativeTime, velocityRHS,
velocityIterate, velocityMatrix);
EnergyNorm<Matrix, Vector> const velocityMatrixNorm(velocityMatrix);
FixedPointIterator<Factory, StateUpdater, VelocityUpdater>
fixedPointIterator(factory_, parset_, globalFriction_);
fixedPointIterator.run(stateUpdater_, velocityUpdater_, velocityMatrix,
velocityMatrixNorm, velocityRHS, velocityIterate);
}
private:
double finalTime_;
Factory &factory_;
Dune::ParameterTree const &parset_;
std::shared_ptr<Nonlinearity> globalFriction_;
std::shared_ptr<StateUpdater> stateUpdater_;
std::shared_ptr<VelocityUpdater> velocityUpdater_;
std::function<void(double, Vector &)> externalForces_;
};
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
try { try {
Dune::ParameterTree parset; Dune::ParameterTree parset;
...@@ -276,7 +332,8 @@ int main(int argc, char *argv[]) { ...@@ -276,7 +332,8 @@ int main(int argc, char *argv[]) {
myAssembler.assembleBodyForce(body.getGravityField(), gravityFunctional); myAssembler.assembleBodyForce(body.getGravityField(), gravityFunctional);
// Problem formulation: right-hand side // Problem formulation: right-hand side
auto const computeExternalForces = [&](double _relativeTime, Vector &_ell) { std::function<void(double, Vector &)> computeExternalForces = [&](
double _relativeTime, Vector &_ell) {
myAssembler.assembleNeumann(neumannBoundary, _ell, neumannFunction, myAssembler.assembleNeumann(neumannBoundary, _ell, neumannFunction,
_relativeTime); _relativeTime);
_ell += gravityFunctional; _ell += gravityFunctional;
...@@ -430,30 +487,16 @@ int main(int argc, char *argv[]) { ...@@ -430,30 +487,16 @@ int main(int argc, char *argv[]) {
parset.get<double>("boundary.friction.L"), parset.get<double>("boundary.friction.L"),
parset.get<double>("boundary.friction.V0")); parset.get<double>("boundary.friction.V0"));
auto const finalTime = parset.get<double>("problem.finalTime");
auto const timeSteps = parset.get<size_t>("timeSteps.number"); auto const timeSteps = parset.get<size_t>("timeSteps.number");
auto const tau = parset.get<double>("problem.finalTime") / timeSteps; auto const relativeTau = 1.0 / timeSteps;
for (size_t timeStep = 1; timeStep <= timeSteps; ++timeStep) { for (size_t timeStep = 1; timeStep <= timeSteps; ++timeStep) {
stateUpdater->nextTimeStep();
velocityUpdater->nextTimeStep();
auto const relativeTime = double(timeStep) / double(timeSteps); auto const relativeTime = double(timeStep) / double(timeSteps);
Vector ell; CoupledTimeStepper<NonlinearFactory, StateUpdater<ScalarVector, Vector>,
computeExternalForces(relativeTime, ell);
Matrix velocityMatrix;
Vector velocityRHS;
Vector velocityIterate;
stateUpdater->setup(tau);
velocityUpdater->setup(ell, tau, relativeTime, velocityRHS,
velocityIterate, velocityMatrix);
EnergyNorm<Matrix, Vector> const velocityMatrixNorm(velocityMatrix);
FixedPointIterator<NonlinearFactory, StateUpdater<ScalarVector, Vector>,
TimeSteppingScheme<Vector, Matrix, Function, dims>> TimeSteppingScheme<Vector, Matrix, Function, dims>>
fixedPointIterator(factory, parset, myGlobalFriction); coupledTimeStepper(finalTime, factory, parset, myGlobalFriction,
fixedPointIterator.run(stateUpdater, velocityUpdater, velocityMatrix, stateUpdater, velocityUpdater, computeExternalForces);
velocityMatrixNorm, velocityRHS, velocityIterate); coupledTimeStepper.step(relativeTime, relativeTau);
Vector u, ur, vr; Vector u, ur, vr;
ScalarVector alpha; ScalarVector alpha;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment