diff --git a/src/elasticity/solvers/IterativePressureSolver.cpp b/src/elasticity/solvers/IterativePressureSolver.cpp index d3299f74e99b72b31a9ada6c92f4b4d95705f1b6..f346bc597cb53137d69d5fbb42063cfb2fb81ed4 100644 --- a/src/elasticity/solvers/IterativePressureSolver.cpp +++ b/src/elasticity/solvers/IterativePressureSolver.cpp @@ -21,10 +21,21 @@ bool IterativePressureSolver::Method(IElasticity &assemble, Vector &u) { << endl; Vector uNew(u); + Vector uOld(u); + Vector deltaU(u); + + bool useExtrapolation = false; + Config::Get("UseExtrapolation", useExtrapolation); Initialize(assemble, uNew); while (!iteration.IsFinished()) { - bool converged = Step(assemble, uNew); + int n = iteration.Step(); + + if (n > 1) { + uOld = uNew; // u^{n-1} + } + + bool converged = Step(assemble, uNew); // uNew = u^n if(converged) { //mapping von corse to finer @@ -42,6 +53,11 @@ bool IterativePressureSolver::Method(IElasticity &assemble, Vector &u) { return Method(assemble, u); return false; } + // Extrapolation ab n = 2 + if (useExtrapolation && n >= 2) { + deltaU = uNew - uOld; // Δu = u^n - u^{n-1} + uNew += deltaU; // Extrapolation: u^n = 2 u^n - u^{n-1} + } } mout.EndBlock(); return true;