21 #ifndef OPM_BLACKOILSEQUENTIALMODEL_HEADER_INCLUDED 22 #define OPM_BLACKOILSEQUENTIALMODEL_HEADER_INCLUDED 25 #include <opm/autodiff/BlackoilModelBase.hpp> 26 #include <opm/core/simulator/BlackoilState.hpp> 27 #include <opm/autodiff/WellStateFullyImplicitBlackoil.hpp> 28 #include <opm/autodiff/BlackoilModelParameters.hpp> 29 #include <opm/simulators/timestepping/SimulatorTimerInterface.hpp> 35 bool iterate_to_fully_implicit;
38 iterate_to_fully_implicit(param.getDefault(
"iterate_to_fully_implicit",
false))
45 template<
class Grid,
class WellModel,
46 template <
class G,
class W>
class PressureModelT,
47 template <
class G,
class W>
class TransportModelT>
51 typedef BlackoilState ReservoirState;
56 typedef PressureModelT<Grid, WellModel> PressureModel;
57 typedef TransportModelT<Grid, WellModel> TransportModel;
61 typedef typename TransportModel::SimulatorData SimulatorData;
62 typedef typename TransportModel::FIPDataType FIPDataType;
83 const RockCompressibility* rock_comp_props,
84 const WellModel well_model,
86 std::shared_ptr< const EclipseState > eclState,
87 const bool has_disgas,
88 const bool has_vapoil,
89 const bool terminal_output)
90 : pressure_model_(new PressureModel(param, grid, fluid, geo, rock_comp_props, well_model,
91 linsolver, eclState, has_disgas, has_vapoil, terminal_output)),
92 transport_model_(new TransportModel(param, grid, fluid, geo, rock_comp_props, well_model,
93 linsolver, eclState, has_disgas, has_vapoil, terminal_output)),
95 pressure_solver_(typename
PressureSolver::SolverParameters(),
std::move(pressure_model_)),
96 transport_solver_(typename
TransportSolver::SolverParameters(),
std::move(transport_model_)),
97 initial_reservoir_state_(0, 0, 0),
98 iterate_to_fully_implicit_(param.iterate_to_fully_implicit)
100 typename PressureSolver::SolverParameters pp;
103 typename TransportSolver::SolverParameters tp;
117 const ReservoirState& reservoir_state,
120 initial_reservoir_state_ = reservoir_state;
121 initial_well_state_ = well_state;
136 template <
class NonlinearSolverType>
139 NonlinearSolverType& ,
140 ReservoirState& reservoir_state,
143 if (!iterate_to_fully_implicit_) {
146 OpmLog::info(
"Using sequential model.");
151 OpmLog::info(
"Solving the pressure equation.");
153 ReservoirState initial_state = reservoir_state;
154 const SimulatorReport pressure_report = pressure_solver_.
step(timer, reservoir_state, well_state);
155 const int pressure_liniter = pressure_report.total_linear_iterations;
156 if (pressure_liniter == -1) {
157 OPM_THROW(std::runtime_error,
"Pressure solver failed to converge.");
162 OpmLog::info(
"Solving the transport equations.");
164 const SimulatorReport transport_report = transport_solver_.
step(timer, initial_state, well_state, reservoir_state, well_state);
165 const int transport_liniter = transport_report.total_linear_iterations;
166 if (transport_liniter == -1) {
167 OPM_THROW(std::runtime_error,
"Transport solver failed to converge.");
171 SimulatorReport report;
172 report.converged =
true;
173 report.total_linear_iterations = pressure_liniter + transport_liniter;
180 OpmLog::info(
"Using sequential model in iterative mode, outer iteration " + std::to_string(iteration));
185 OpmLog::info(
"Solving the pressure equation.");
188 const SimulatorReport pressure_report = pressure_solver_.
step(timer, initial_reservoir_state_, initial_well_state_, reservoir_state, well_state);
189 const int pressure_liniter = pressure_report.total_linear_iterations;
190 if (pressure_liniter == -1) {
191 OPM_THROW(std::runtime_error,
"Pressure solver failed to converge.");
196 OpmLog::info(
"Solving the transport equations.");
198 const SimulatorReport transport_report = transport_solver_.
step(timer, initial_reservoir_state_, initial_well_state_, reservoir_state, well_state);
199 const int transport_liniter = transport_report.total_linear_iterations;
200 if (transport_liniter == -1) {
201 OPM_THROW(std::runtime_error,
"Transport solver failed to converge.");
207 auto rstate = reservoir_state;
208 auto wstate = well_state;
209 pressure_solver_.
model().prepareStep(timer, initial_reservoir_state_, initial_well_state_);
210 SimulatorReport rep = pressure_solver_.
model().nonlinearIteration(0, timer, pressure_solver_, rstate, wstate);
211 if (rep.converged && rep.total_newton_iterations == 0) {
216 SimulatorReport report;
217 report.converged = done;
218 report.total_linear_iterations = pressure_liniter + transport_liniter;
252 pressure_solver_.
model().setThresholdPressures(threshold_pressures_by_face);
253 transport_solver_.
model().setThresholdPressures(threshold_pressures_by_face);
263 return pressure_solver_.
model().terminalOutputEnabled();
272 const SimulationDataContainer& current )
const 275 return std::max(pressure_solver_.
model().relativeChange(previous, current),
276 transport_solver_.
model().relativeChange(previous, current));
282 return pressure_solver_.
model().wellModel();
290 std::vector<std::vector<double> >
292 const std::vector<int>& fipnum)
const 300 return transport_solver_.
model().getSimulatorData(localState);
305 return transport_solver_.
model().getFIPData();
313 {
return failureReport_; }
316 SimulatorReport failureReport_;
318 std::unique_ptr<PressureModel> pressure_model_;
319 std::unique_ptr<TransportModel> transport_model_;
320 PressureSolver pressure_solver_;
321 TransportSolver transport_solver_;
323 ReservoirState initial_reservoir_state_;
324 WellState initial_well_state_;
326 bool iterate_to_fully_implicit_;
333 #endif // OPM_BLACKOILSEQUENTIALMODEL_HEADER_INCLUDED
void prepareStep(const SimulatorTimerInterface &, const ReservoirState &reservoir_state, const WellState &well_state)
Called once before each time step.
Definition: BlackoilSequentialModel.hpp:116
const SimulatorReport & failureReport() const
return the statistics if the nonlinearIteration() method failed.
Definition: BlackoilSequentialModel.hpp:312
std::vector< std::vector< double > > computeFluidInPlace(const ReservoirState &x, const std::vector< int > &fipnum) const
Compute fluid in place.
Definition: NonlinearSolver.hpp:132
Definition: AutoDiff.hpp:297
FIPDataType getFIPData() const
Return fluid-in-place data (for output functionality)
Definition: BlackoilSequentialModel.hpp:304
This file contains a set of helper functions used by VFPProd / VFPInj.
Definition: AdditionalObjectDeleter.hpp:22
Solver parameters for the BlackoilModel.
Definition: BlackoilModelParameters.hpp:31
Definition: BlackoilSequentialModel.hpp:33
std::vector< std::vector< double > > computeFluidInPlace(const ReservoirState &x, const std::vector< int > &fipnum) const
Compute fluid in place.
Definition: BlackoilSequentialModel.hpp:291
void setThresholdPressures(const std::vector< double > &threshold_pressures_by_face)
Set threshold pressures that prevent or reduce flow.
Definition: BlackoilSequentialModel.hpp:250
BlackoilModelParameters()
Construct with default parameters.
Definition: BlackoilModelParameters.cpp:28
SimulatorReport step(const SimulatorTimerInterface &timer, ReservoirState &reservoir_state, WellState &well_state)
Take a single forward step, after which the states will be modified according to the physical model...
Definition: NonlinearSolver_impl.hpp:107
BlackoilSequentialModel(const ModelParameters ¶m, const Grid &grid, const BlackoilPropsAdFromDeck &fluid, const DerivedGeology &geo, const RockCompressibility *rock_comp_props, const WellModel well_model, const NewtonIterationBlackoilInterface &linsolver, std::shared_ptr< const EclipseState > eclState, const bool has_disgas, const bool has_vapoil, const bool terminal_output)
Construct the model.
Definition: BlackoilSequentialModel.hpp:79
Interface class for SimulatorTimer objects, to be improved.
Definition: SimulatorTimerInterface.hpp:35
The state of a set of wells, tailored for use by the fully implicit blackoil simulator.
Definition: WellStateFullyImplicitBlackoil.hpp:44
Struct for containing iteration variables.
Definition: DefaultBlackoilSolutionState.hpp:29
void setParameters(const SolverParameters ¶m)
Set parameters to override those given at construction time.
Definition: NonlinearSolver.hpp:178
void afterStep(const SimulatorTimerInterface &, ReservoirState &, WellState &)
Called once after each time step.
Definition: BlackoilSequentialModel.hpp:232
const PhysicalModel & model() const
Reference to physical model.
Definition: NonlinearSolver_impl.hpp:75
Class containing static geological properties that are derived from grid and petrophysical properties...
Definition: GeoProps.hpp:59
Interface class for (linear) solvers for the fully implicit black-oil system.
Definition: NewtonIterationBlackoilInterface.hpp:31
bool terminalOutputEnabled() const
Return true if output to cout is wanted.
Definition: BlackoilSequentialModel.hpp:261
This class implements the AD-adapted fluid interface for three-phase black-oil.
Definition: BlackoilPropsAdFromDeck.hpp:61
SimulatorReport nonlinearIteration(const int iteration, const SimulatorTimerInterface &timer, NonlinearSolverType &, ReservoirState &reservoir_state, WellState &well_state)
Called once per nonlinear iteration.
Definition: BlackoilSequentialModel.hpp:137
const WellModel & wellModel() const
Return the well model.
Definition: BlackoilSequentialModel.hpp:280
const SimulatorData & getSimulatorData(const SimulationDataContainer &localState) const
Return reservoir simulation data (for output functionality)
Definition: BlackoilSequentialModel.hpp:299
A sequential splitting model implementation for three-phase black oil.
Definition: BlackoilSequentialModel.hpp:48
double relativeChange(const SimulationDataContainer &previous, const SimulationDataContainer ¤t) const
Return the relative change in variables relevant to this model.
Definition: BlackoilSequentialModel.hpp:271