From 5290b000ef252cedafd5924bf151307d99de5b37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Fri, 1 Jul 2016 20:03:05 +0200 Subject: [PATCH 1/6] Add setParameters(), return int from minIter(), maxIter(). --- opm/autodiff/NonlinearSolver.hpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/opm/autodiff/NonlinearSolver.hpp b/opm/autodiff/NonlinearSolver.hpp index ff8a5f7e2..9c12990b8 100644 --- a/opm/autodiff/NonlinearSolver.hpp +++ b/opm/autodiff/NonlinearSolver.hpp @@ -169,10 +169,13 @@ namespace Opm { double relaxRelTol() const { return param_.relax_rel_tol_; } /// The maximum number of nonlinear iterations allowed. - int maxIter() const { return param_.max_iter_; } + int maxIter() const { return param_.max_iter_; } /// The minimum number of nonlinear iterations allowed. - double minIter() const { return param_.min_iter_; } + int minIter() const { return param_.min_iter_; } + + /// Set parameters to override those given at construction time. + void setParameters(SolverParameters param) { param_ = param; } private: // --------- Data members --------- From 6e66d885fb024ab9198ab836330ad6011da79622 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Fri, 1 Jul 2016 20:04:24 +0200 Subject: [PATCH 2/6] Pass 0 min_iter for pressure and transport solve. --- opm/autodiff/BlackoilSequentialModel.hpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/opm/autodiff/BlackoilSequentialModel.hpp b/opm/autodiff/BlackoilSequentialModel.hpp index 895b38196..a9a479040 100644 --- a/opm/autodiff/BlackoilSequentialModel.hpp +++ b/opm/autodiff/BlackoilSequentialModel.hpp @@ -88,11 +88,18 @@ namespace Opm { linsolver, eclState, has_disgas, has_vapoil, terminal_output)), transport_model_(new TransportModel(param, grid, fluid, geo, rock_comp_props, well_model, linsolver, eclState, has_disgas, has_vapoil, terminal_output)), + // TODO: fix solver parameters for pressure and transport solver. pressure_solver_(typename PressureSolver::SolverParameters(), std::move(pressure_model_)), transport_solver_(typename TransportSolver::SolverParameters(), std::move(transport_model_)), initial_reservoir_state_(0, 0, 0), // will be overwritten iterate_to_fully_implicit_(param.iterate_to_fully_implicit) { + typename PressureSolver::SolverParameters pp; + pp.min_iter_ = 0; + pressure_solver_.setParameters(pp); + typename TransportSolver::SolverParameters tp; + tp.min_iter_ = 0; + transport_solver_.setParameters(tp); } From 1a3c1d30587cc3485c3ea78c2e27487c843d551f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Sun, 3 Jul 2016 08:00:59 +0200 Subject: [PATCH 3/6] Further templatized sequential model and simulator classes. Now the actual pressure and transport model classes are not specified, but taken as template template parameters, also grid and well model are templates for both the sequential model and the simulator class, although at this point only StandardWells is expected to work with the sequential model. --- examples/flow_sequential.cpp | 6 ++++- opm/autodiff/BlackoilSequentialModel.hpp | 8 ++++--- opm/autodiff/SimulatorSequentialBlackoil.hpp | 24 ++++++++++++-------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/examples/flow_sequential.cpp b/examples/flow_sequential.cpp index 0d4a89847..5eef64dad 100644 --- a/examples/flow_sequential.cpp +++ b/examples/flow_sequential.cpp @@ -25,6 +25,9 @@ #include #include #include +#include +#include +#include // ----------------- Main program ----------------- @@ -32,7 +35,8 @@ int main(int argc, char** argv) { typedef UnstructuredGrid Grid; - typedef Opm::SimulatorSequentialBlackoil Simulator; + typedef Opm::StandardWells WellModel; + typedef Opm::SimulatorSequentialBlackoil Simulator; Opm::FlowMainSequential mainfunc; return mainfunc.execute(argc, argv); diff --git a/opm/autodiff/BlackoilSequentialModel.hpp b/opm/autodiff/BlackoilSequentialModel.hpp index a9a479040..0c4820c05 100644 --- a/opm/autodiff/BlackoilSequentialModel.hpp +++ b/opm/autodiff/BlackoilSequentialModel.hpp @@ -23,8 +23,6 @@ #include -#include -#include #include #include #include @@ -44,7 +42,9 @@ namespace Opm { /// A sequential splitting model implementation for three-phase black oil. - template + template class PressureModelT, + template class TransportModelT> class BlackoilSequentialModel { public: @@ -297,6 +297,8 @@ namespace Opm { { return failureReport_; } protected: + typedef PressureModelT PressureModel; + typedef TransportModelT TransportModel; typedef NonlinearSolver PressureSolver; typedef NonlinearSolver TransportSolver; diff --git a/opm/autodiff/SimulatorSequentialBlackoil.hpp b/opm/autodiff/SimulatorSequentialBlackoil.hpp index 249d8b703..aed5c8383 100644 --- a/opm/autodiff/SimulatorSequentialBlackoil.hpp +++ b/opm/autodiff/SimulatorSequentialBlackoil.hpp @@ -24,32 +24,36 @@ #include #include #include -#include namespace Opm { -template +template class PressureModel, + template class TransportModel> class SimulatorSequentialBlackoil; -class StandardWells; -template -struct SimulatorTraits > +template class PressureModel, + template class TransportModel> +struct SimulatorTraits > { typedef WellStateFullyImplicitBlackoil WellState; typedef BlackoilState ReservoirState; typedef BlackoilOutputWriter OutputWriter; typedef GridT Grid; - typedef BlackoilSequentialModel Model; + typedef BlackoilSequentialModel Model; typedef NonlinearSolver Solver; - typedef StandardWells WellModel; + typedef WellModelT WellModel; }; /// a simulator for the blackoil model -template +template class PressureModel, + template class TransportModel> class SimulatorSequentialBlackoil - : public SimulatorBase > + : public SimulatorBase > { - typedef SimulatorBase > Base; + typedef SimulatorBase > Base; public: // forward the constructor to the base class SimulatorSequentialBlackoil(const ParameterGroup& param, From fd36a122c616d05252219bb683d4aaa6971e441b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Sun, 23 Apr 2017 20:43:12 +0200 Subject: [PATCH 4/6] Modifications to catch up with master branch. --- opm/autodiff/BlackoilSequentialModel.hpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/opm/autodiff/BlackoilSequentialModel.hpp b/opm/autodiff/BlackoilSequentialModel.hpp index 0c4820c05..01717f379 100644 --- a/opm/autodiff/BlackoilSequentialModel.hpp +++ b/opm/autodiff/BlackoilSequentialModel.hpp @@ -53,8 +53,11 @@ namespace Opm { typedef BlackoilSequentialModelParameters ModelParameters; typedef DefaultBlackoilSolutionState SolutionState; - typedef BlackoilPressureModel PressureModel; - typedef BlackoilTransportModel TransportModel; + typedef PressureModelT PressureModel; + typedef TransportModelT TransportModel; + typedef NonlinearSolver PressureSolver; + typedef NonlinearSolver TransportSolver; + typedef typename TransportModel::SimulatorData SimulatorData; typedef typename TransportModel::FIPDataType FIPDataType; @@ -297,11 +300,6 @@ namespace Opm { { return failureReport_; } protected: - typedef PressureModelT PressureModel; - typedef TransportModelT TransportModel; - typedef NonlinearSolver PressureSolver; - typedef NonlinearSolver TransportSolver; - SimulatorReport failureReport_; std::unique_ptr pressure_model_; 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 5/6] 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; } From fa4d4fb0fbef53c830e6466a5cde9f8a79b10459 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Fri, 2 Jun 2017 15:17:22 +0200 Subject: [PATCH 6/6] Make argument of setParameters() a const reference. --- opm/autodiff/NonlinearSolver.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opm/autodiff/NonlinearSolver.hpp b/opm/autodiff/NonlinearSolver.hpp index 9c12990b8..632cbd02e 100644 --- a/opm/autodiff/NonlinearSolver.hpp +++ b/opm/autodiff/NonlinearSolver.hpp @@ -175,7 +175,7 @@ namespace Opm { int minIter() const { return param_.min_iter_; } /// Set parameters to override those given at construction time. - void setParameters(SolverParameters param) { param_ = param; } + void setParameters(const SolverParameters& param) { param_ = param; } private: // --------- Data members ---------