From 2f30897c70b3be3f25223e55015596c86a8baac2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Wed, 3 May 2017 14:33:20 +0200 Subject: [PATCH] Make proper convergence check for iterated sequentical implicit. --- opm/autodiff/BlackoilSequentialModel.hpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/opm/autodiff/BlackoilSequentialModel.hpp b/opm/autodiff/BlackoilSequentialModel.hpp index 01717f379..4547a7a3e 100644 --- a/opm/autodiff/BlackoilSequentialModel.hpp +++ b/opm/autodiff/BlackoilSequentialModel.hpp @@ -184,7 +184,8 @@ namespace Opm { if (terminalOutputEnabled()) { OpmLog::info("Solving the pressure equation."); } - const SimulatorReport& pressure_report = pressure_solver_.step(timer, initial_reservoir_state_, initial_well_state_, reservoir_state, well_state); + + const SimulatorReport pressure_report = pressure_solver_.step(timer, initial_reservoir_state_, initial_well_state_, reservoir_state, well_state); const int pressure_liniter = pressure_report.total_linear_iterations; if (pressure_liniter == -1) { OPM_THROW(std::runtime_error, "Pressure solver failed to converge."); @@ -194,14 +195,26 @@ namespace Opm { if (terminalOutputEnabled()) { OpmLog::info("Solving the transport equations."); } - const SimulatorReport& transport_report = transport_solver_.step(timer, initial_reservoir_state_, initial_well_state_, reservoir_state, well_state); + const SimulatorReport transport_report = transport_solver_.step(timer, initial_reservoir_state_, initial_well_state_, reservoir_state, well_state); const int transport_liniter = transport_report.total_linear_iterations; if (transport_liniter == -1) { OPM_THROW(std::runtime_error, "Transport solver failed to converge."); } + // Revisit pressure equation to check if it is still converged. + bool done = false; + { + auto rstate = reservoir_state; + auto wstate = well_state; + pressure_solver_.model().prepareStep(timer, initial_reservoir_state_, initial_well_state_); + SimulatorReport rep = pressure_solver_.model().nonlinearIteration(0, timer, pressure_solver_, rstate, wstate); + if (rep.converged && rep.total_newton_iterations == 0) { + done = true; + } + } + SimulatorReport report; - report.converged = iteration >= 3; // TODO: replace this with a proper convergence check + report.converged = done; report.total_linear_iterations = pressure_liniter + transport_liniter; return report; }