From c7f9d2d35784168efc18dd9ee0882377f3d0df96 Mon Sep 17 00:00:00 2001 From: Arne Morten Kvarving Date: Mon, 3 Jul 2023 10:32:20 +0200 Subject: [PATCH] put initial linearization in separate method to share code between newton and nldd --- opm/simulators/flow/BlackoilModelEbos.hpp | 118 +++++++++------------- 1 file changed, 47 insertions(+), 71 deletions(-) diff --git a/opm/simulators/flow/BlackoilModelEbos.hpp b/opm/simulators/flow/BlackoilModelEbos.hpp index ecb570d6c..b978f0a1e 100644 --- a/opm/simulators/flow/BlackoilModelEbos.hpp +++ b/opm/simulators/flow/BlackoilModelEbos.hpp @@ -434,44 +434,9 @@ namespace Opm { // ----------- Set up reports and timer ----------- SimulatorReportSingle report; - failureReport_ = SimulatorReportSingle(); Dune::Timer perfTimer; - perfTimer.start(); - report.total_linearizations = 1; - - // ----------- Assemble ----------- - try { - report += assembleReservoir(timer, iteration); - report.assemble_time += perfTimer.stop(); - } - catch (...) { - report.assemble_time += perfTimer.stop(); - failureReport_ += report; - throw; // continue throwing the stick - } - - - // ----------- Check if converged ----------- - std::vector residual_norms; - perfTimer.reset(); - perfTimer.start(); - // the step is not considered converged until at least minIter iterations is done - { - auto convrep = getConvergence(timer, iteration, residual_norms); - report.converged = convrep.converged() && iteration > nonlinear_solver.minIter();; - ConvergenceReport::Severity severity = convrep.severityOfWorstFailure(); - convergence_reports_.back().report.push_back(std::move(convrep)); - - // Throw if any NaN or too large residual found. - if (severity == ConvergenceReport::Severity::NotANumber) { - OPM_THROW(NumericalProblem, "NaN residual found!"); - } else if (severity == ConvergenceReport::Severity::TooLarge) { - OPM_THROW_NOLOG(NumericalProblem, "Too large residual found!"); - } - } - report.update_time += perfTimer.stop(); - residual_norms_history_.push_back(residual_norms); + this->initialLinearization(report, iteration, nonlinear_solver.minIter(), timer); // ----------- If not converged, solve linear system and do Newton update ----------- if (!report.converged) { @@ -554,43 +519,9 @@ namespace Opm { { // ----------- Set up reports and timer ----------- SimulatorReportSingle report; - failureReport_ = SimulatorReportSingle(); Dune::Timer perfTimer; - perfTimer.start(); - report.total_linearizations = 1; - - // ----------- Assemble ----------- - try { - report += assembleReservoir(timer, iteration); - report.assemble_time += perfTimer.stop(); - } - catch (...) { - report.assemble_time += perfTimer.stop(); - failureReport_ += report; - throw; // continue throwing the stick - } - - // ----------- Check if converged ----------- - std::vector residual_norms; - perfTimer.reset(); - perfTimer.start(); - // the step is not considered converged until at least minIter iterations is done - { - auto convrep = getConvergence(timer, iteration, residual_norms); - report.converged = convrep.converged() && iteration > nonlinear_solver.minIter();; - ConvergenceReport::Severity severity = convrep.severityOfWorstFailure(); - convergence_reports_.back().report.push_back(std::move(convrep)); - - // Throw if any NaN or too large residual found. - if (severity == ConvergenceReport::Severity::NotANumber) { - OPM_THROW(NumericalProblem, "NaN residual found!"); - } else if (severity == ConvergenceReport::Severity::TooLarge) { - OPM_THROW_NOLOG(NumericalProblem, "Too large residual found!"); - } - } - report.update_time += perfTimer.stop(); - residual_norms_history_.push_back(residual_norms); + this->initialLinearization(report, iteration, nonlinear_solver.minIter(), timer); if (report.converged) { return report; @@ -1851,6 +1782,51 @@ namespace Opm { } } + void initialLinearization(SimulatorReportSingle& report, + const int iteration, + const int minIter, + const SimulatorTimerInterface& timer) + { + // ----------- Set up reports and timer ----------- + failureReport_ = SimulatorReportSingle(); + Dune::Timer perfTimer; + + perfTimer.start(); + report.total_linearizations = 1; + + // ----------- Assemble ----------- + try { + report += assembleReservoir(timer, iteration); + report.assemble_time += perfTimer.stop(); + } + catch (...) { + report.assemble_time += perfTimer.stop(); + failureReport_ += report; + throw; // continue throwing the stick + } + + // ----------- Check if converged ----------- + std::vector residual_norms; + perfTimer.reset(); + perfTimer.start(); + // the step is not considered converged until at least minIter iterations is done + { + auto convrep = getConvergence(timer, iteration, residual_norms); + report.converged = convrep.converged() && iteration > minIter; + ConvergenceReport::Severity severity = convrep.severityOfWorstFailure(); + convergence_reports_.back().report.push_back(std::move(convrep)); + + // Throw if any NaN or too large residual found. + if (severity == ConvergenceReport::Severity::NotANumber) { + OPM_THROW(NumericalProblem, "NaN residual found!"); + } else if (severity == ConvergenceReport::Severity::TooLarge) { + OPM_THROW_NOLOG(NumericalProblem, "Too large residual found!"); + } + } + report.update_time += perfTimer.stop(); + residual_norms_history_.push_back(residual_norms); + } + double dpMaxRel() const { return param_.dp_max_rel_; } double dsMax() const { return param_.ds_max_; } double drMaxRel() const { return param_.dr_max_rel_; }