From dd124f026831bf92251bfbe237112481656381e2 Mon Sep 17 00:00:00 2001 From: Christoph Lehmann <christoph.lehmann@ufz.de> Date: Fri, 19 Aug 2016 10:52:36 +0200 Subject: [PATCH] [AppL] pass conv crit to nonlinear solvers --- .../ApplicationsLib/UncoupledProcessesTimeLoop.cpp | 6 ++++-- .../ApplicationsLib/UncoupledProcessesTimeLoop.h | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.cpp b/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.cpp index 8ee784babcb..4eae2e6234e 100644 --- a/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.cpp +++ b/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.cpp @@ -98,8 +98,9 @@ void UncoupledProcessesTimeLoop::setInitialConditions( { auto& nonlinear_solver = ppd.nonlinear_solver; auto& mat_strg = ppd.mat_strg; + auto& conv_crit = pcs.getConvergenceCriterion(); - setEquationSystem(nonlinear_solver, ode_sys, nl_tag); + setEquationSystem(nonlinear_solver, ode_sys, conv_crit, nl_tag); nonlinear_solver.assemble(x0); time_disc.pushState( t0, x0, mat_strg); // TODO: that might do duplicate work @@ -117,11 +118,12 @@ solveOneTimeStepOneProcess( ProcessLib::Output const& output_control) { auto& time_disc = process.getTimeDiscretization(); + auto& conv_crit = process.getConvergenceCriterion(); auto& ode_sys = *process_data.tdisc_ode_sys; auto& nonlinear_solver = process_data.nonlinear_solver; auto const nl_tag = process_data.nonlinear_solver_tag; - setEquationSystem(nonlinear_solver, ode_sys, nl_tag); + setEquationSystem(nonlinear_solver, ode_sys, conv_crit, nl_tag); // Note: Order matters! // First advance to the next timestep, then set known solutions at that diff --git a/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.h b/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.h index 8d61e3dc01c..7cdce87b19e 100644 --- a/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.h +++ b/Applications/ApplicationsLib/UncoupledProcessesTimeLoop.h @@ -162,7 +162,8 @@ private: //! which is Picard or Newton depending on the NLTag. template <NumLib::NonlinearSolverTag NLTag> static void setEquationSystem(AbstractNLSolver& nonlinear_solver, - EquationSystem& eq_sys) + EquationSystem& eq_sys, + NumLib::ConvergenceCriterion& conv_crit) { using Solver = NumLib::NonlinearSolver<NLTag>; using EqSys = NumLib::NonlinearSystem<NLTag>; @@ -173,23 +174,26 @@ private: auto& nl_solver_ = static_cast<Solver&>(nonlinear_solver); auto& eq_sys_ = static_cast<EqSys&>(eq_sys); - nl_solver_.setEquationSystem(eq_sys_); + nl_solver_.setEquationSystem(eq_sys_, conv_crit); } //! Sets the EquationSystem for the given nonlinear solver, //! transparently both for Picard and Newton solvers. static void setEquationSystem(AbstractNLSolver& nonlinear_solver, EquationSystem& eq_sys, + NumLib::ConvergenceCriterion& conv_crit, NumLib::NonlinearSolverTag nl_tag) { using Tag = NumLib::NonlinearSolverTag; switch (nl_tag) { case Tag::Picard: - setEquationSystem<Tag::Picard>(nonlinear_solver, eq_sys); + setEquationSystem<Tag::Picard>(nonlinear_solver, eq_sys, + conv_crit); break; case Tag::Newton: - setEquationSystem<Tag::Newton>(nonlinear_solver, eq_sys); + setEquationSystem<Tag::Newton>(nonlinear_solver, eq_sys, + conv_crit); break; } } -- GitLab