SimulatorFullyImplicit.hpp
Go to the documentation of this file.
1/*
2 Copyright 2013, 2015, 2020 SINTEF Digital, Mathematics and Cybernetics.
3 Copyright 2015 Andreas Lauser
4 Copyright 2017 IRIS
5
6 This file is part of the Open Porous Media project (OPM).
7
8 OPM is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
12
13 OPM is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with OPM. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#ifndef OPM_SIMULATOR_FULLY_IMPLICIT_HEADER_INCLUDED
23#define OPM_SIMULATOR_FULLY_IMPLICIT_HEADER_INCLUDED
24
25#include <opm/common/ErrorMacros.hpp>
27
28#ifdef RESERVOIR_COUPLING_ENABLED
29#include <opm/input/eclipse/Schedule/ResCoup/ReservoirCouplingInfo.hpp>
30#include <opm/input/eclipse/Schedule/ResCoup/MasterGroup.hpp>
31#include <opm/input/eclipse/Schedule/ResCoup/Slaves.hpp>
34#include <opm/common/Exceptions.hpp>
35#endif
36
37#include <opm/grid/utility/StopWatch.hpp>
38
51
52#if HAVE_HDF5
54#endif
55
56#include <array>
57#include <functional>
58#include <memory>
59#include <string>
60#include <vector>
61
62namespace Opm::Parameters {
63
64struct EnableAdaptiveTimeStepping { static constexpr bool value = true; };
65struct OutputExtraConvergenceInfo { static constexpr auto* value = "none"; };
66struct SaveStep { static constexpr auto* value = ""; };
67struct SaveFile { static constexpr auto* value = ""; };
68struct LoadFile { static constexpr auto* value = ""; };
69struct LoadStep { static constexpr int value = -1; };
70struct Slave { static constexpr bool value = false; };
71
72} // namespace Opm::Parameters
73
74namespace Opm::detail {
75
77
81void logTuning(const Tuning& tuning);
82
83}
84
85namespace Opm {
86
113template<class TypeTag>
115{
116protected:
117 struct MPI_Comm_Deleter;
118public:
131
133 static constexpr bool enablePolymer = getPropValue<TypeTag, Properties::EnablePolymer>();
134 using PolymerModule = BlackOilPolymerModule<TypeTag, enablePolymer>;
135 static constexpr bool enableBioeffects = getPropValue<TypeTag, Properties::EnableBioeffects>();
136 using BioeffectsModule = BlackOilBioeffectsModule<TypeTag, enableBioeffects>;
137
139 using ModelParameters = typename Model::ModelParameters;
142
152 explicit SimulatorFullyImplicit(Simulator& simulator);
153
155 ~SimulatorFullyImplicit() override;
156
167 static void registerParameters();
168
169#ifdef RESERVOIR_COUPLING_ENABLED
182 SimulatorReport run(SimulatorTimer& timer, int argc, char** argv);
183
195 bool checkRunningAsReservoirCouplingMaster();
196
210 void init(const SimulatorTimer& timer, int argc, char** argv);
211#else
221
230 void init(const SimulatorTimer& timer);
231#endif
232
246 void updateTUNING(const Tuning& tuning);
247
255 void updateTUNINGDP(const TuningDp& tuning_dp);
256
274 bool runStep(SimulatorTimer& timer);
275
290 void setRestoreStateHook(std::function<void(int)> hook)
291 { restoreStateHook_ = std::move(hook); }
292
301
302 const Grid& grid() const { return simulator_.vanguard().grid(); }
303
307 template<class Serializer>
308 void serializeOp(Serializer& serializer);
309
310 const Model& model() const { return solver_->model(); }
311
312protected:
314 void loadState(HDF5Serializer& serializer, const std::string& groupName) override;
315
317 void saveState(HDF5Serializer& serializer, const std::string& groupName) const override;
318
321 std::array<std::string,5> getHeader() const override;
322
324 const std::vector<int>& getCellMapping() const override {
325 return simulator_.vanguard().globalCell();
326 }
327
336 std::unique_ptr<Solver> createSolver(WellModel& wellModel);
337
338 const EclipseState& eclState() const { return simulator_.vanguard().eclState(); }
339
340 const Schedule& schedule() const { return simulator_.vanguard().schedule(); }
341
342 bool isRestart() const { return eclState().getInitConfig().restartRequested(); }
343
344 WellModel& wellModel_() { return simulator_.problem().wellModel(); }
345
346 const WellModel& wellModel_() const { return simulator_.problem().wellModel(); }
347
348#ifdef RESERVOIR_COUPLING_ENABLED
360 void handleSlaveTerminated_();
361#endif
362
365
368
371
373 std::unique_ptr<Solver> solver_;
374
377
380
382 std::unique_ptr<time::StopWatch> solverTimer_;
383
385 std::unique_ptr<time::StopWatch> totalTimer_;
386
388 std::unique_ptr<TimeStepper> adaptiveTimeStepping_;
389
392
393#ifdef RESERVOIR_COUPLING_ENABLED
395 bool slaveMode_{false};
396
398 std::unique_ptr<ReservoirCouplingMaster<Scalar>> reservoirCouplingMaster_{nullptr};
399
401 std::unique_ptr<ReservoirCouplingSlave<Scalar>> reservoirCouplingSlave_{nullptr};
402#endif
403
406
409 std::function<void(int)> restoreStateHook_{};
410};
411
412} // namespace Opm
413
415
416#endif // OPM_SIMULATOR_FULLY_IMPLICIT_HEADER_INCLUDED
Adaptive time-stepping coordinator for the black-oil simulator.
Definition: AdaptiveTimeStepping.hpp:93
Class for (de-)serializing using HDF5.
Definition: HDF5Serializer.hpp:37
Definition: NonlinearSolver.hpp:97
NonlinearSolverParameters< Scalar > SolverParameters
Definition: NonlinearSolver.hpp:101
Class handling convergence history output for a simulator.
Definition: SimulatorConvergenceOutput.hpp:44
Top-level driver for a fully implicit flow simulation.
Definition: SimulatorFullyImplicit.hpp:115
const EclipseState & eclState() const
Definition: SimulatorFullyImplicit.hpp:338
typename Model::ModelParameters ModelParameters
Definition: SimulatorFullyImplicit.hpp:139
SimulatorReport finalize()
Stop the timers and emit the final OPMRST output.
Definition: SimulatorFullyImplicit_impl.hpp:539
GetPropType< TypeTag, Properties::FluidSystem > FluidSystem
Definition: SimulatorFullyImplicit.hpp:121
std::unique_ptr< TimeStepper > adaptiveTimeStepping_
Set iff adaptive time stepping is enabled.
Definition: SimulatorFullyImplicit.hpp:388
GetPropType< TypeTag, Properties::ElementContext > ElementContext
Definition: SimulatorFullyImplicit.hpp:122
GetPropType< TypeTag, Properties::MaterialLaw > MaterialLaw
Definition: SimulatorFullyImplicit.hpp:125
void init(const SimulatorTimer &timer)
One-shot setup performed before the first runStep.
Definition: SimulatorFullyImplicit_impl.hpp:204
void serializeOp(Serializer &serializer)
Definition: SimulatorFullyImplicit_impl.hpp:562
GetPropType< TypeTag, Properties::Simulator > Simulator
Definition: SimulatorFullyImplicit.hpp:119
void saveState(HDF5Serializer &serializer, const std::string &groupName) const override
Save this simulator's data block to an OPMRST file via HDF5.
Definition: SimulatorFullyImplicit_impl.hpp:583
const std::vector< int > & getCellMapping() const override
Local-to-global cell index mapping.
Definition: SimulatorFullyImplicit.hpp:324
std::unique_ptr< Solver > solver_
Built lazily on the first runStep call; reused thereafter.
Definition: SimulatorFullyImplicit.hpp:373
SimulatorReport run(SimulatorTimer &timer)
Run the entire simulation to completion.
Definition: SimulatorFullyImplicit_impl.hpp:109
std::function< void(int)> restoreStateHook_
Definition: SimulatorFullyImplicit.hpp:409
BlackOilPolymerModule< TypeTag, enablePolymer > PolymerModule
Definition: SimulatorFullyImplicit.hpp:134
GetPropType< TypeTag, Properties::NonlinearSystem > Model
Definition: SimulatorFullyImplicit.hpp:129
GetPropType< TypeTag, Properties::Grid > Grid
Definition: SimulatorFullyImplicit.hpp:120
SimulatorFullyImplicit(Simulator &simulator)
Construct from the surrounding eWoms Simulator.
Definition: SimulatorFullyImplicit_impl.hpp:46
std::unique_ptr< Solver > createSolver(WellModel &wellModel)
Build the Solver used during the current report step.
Definition: SimulatorFullyImplicit_impl.hpp:608
BlackOilBioeffectsModule< TypeTag, enableBioeffects > BioeffectsModule
Definition: SimulatorFullyImplicit.hpp:136
bool terminalOutput_
Emit high-level progress to std::cout (rank 0 only).
Definition: SimulatorFullyImplicit.hpp:376
ModelParameters modelParam_
Cached model parameters; mutated by TUNING / TUNINGDP application.
Definition: SimulatorFullyImplicit.hpp:367
GetPropType< TypeTag, Properties::PrimaryVariables > PrimaryVariables
Definition: SimulatorFullyImplicit.hpp:124
void updateTUNINGDP(const TuningDp &tuning_dp)
Apply a TUNINGDP keyword to the cached model parameters.
Definition: SimulatorFullyImplicit_impl.hpp:256
SolverParameters solverParam_
Cached nonlinear-solver parameters.
Definition: SimulatorFullyImplicit.hpp:370
GetPropType< TypeTag, Properties::Scalar > Scalar
Definition: SimulatorFullyImplicit.hpp:130
void setRestoreStateHook(std::function< void(int)> hook)
Install a callback that restores simulation state at the start of each report step,...
Definition: SimulatorFullyImplicit.hpp:290
GetPropType< TypeTag, Properties::AquiferModel > AquiferModel
Definition: SimulatorFullyImplicit.hpp:128
GetPropType< TypeTag, Properties::SolutionVector > SolutionVector
Definition: SimulatorFullyImplicit.hpp:126
const Model & model() const
Definition: SimulatorFullyImplicit.hpp:310
const WellModel & wellModel_() const
Definition: SimulatorFullyImplicit.hpp:346
SimulatorSerializer serializer_
OPMRST save / load.
Definition: SimulatorFullyImplicit.hpp:405
void loadState(HDF5Serializer &serializer, const std::string &groupName) override
Load this simulator's data block from an OPMRST file via HDF5.
Definition: SimulatorFullyImplicit_impl.hpp:572
static constexpr bool enableBioeffects
Definition: SimulatorFullyImplicit.hpp:135
typename Solver::SolverParameters SolverParameters
Definition: SimulatorFullyImplicit.hpp:140
GetPropType< TypeTag, Properties::MaterialLawParams > MaterialLawParams
Definition: SimulatorFullyImplicit.hpp:127
std::array< std::string, 5 > getHeader() const override
Definition: SimulatorFullyImplicit_impl.hpp:594
static void registerParameters()
Register all parameters consumed by this class and its major collaborators.
Definition: SimulatorFullyImplicit_impl.hpp:87
std::unique_ptr< time::StopWatch > totalTimer_
Wall-clock for the entire simulation.
Definition: SimulatorFullyImplicit.hpp:385
GetPropType< TypeTag, Properties::Indices > BlackoilIndices
Definition: SimulatorFullyImplicit.hpp:123
static constexpr bool enablePolymer
Definition: SimulatorFullyImplicit.hpp:133
const Schedule & schedule() const
Definition: SimulatorFullyImplicit.hpp:340
std::unique_ptr< time::StopWatch > solverTimer_
Wall-clock for the current report step's solve.
Definition: SimulatorFullyImplicit.hpp:382
WellModel & wellModel_()
Definition: SimulatorFullyImplicit.hpp:344
SimulatorConvergenceOutput convergence_output_
Background thread for INFOSTEP / INFOITER files.
Definition: SimulatorFullyImplicit.hpp:391
Simulator & simulator_
Surrounding eWoms simulator; observed, not owned.
Definition: SimulatorFullyImplicit.hpp:364
bool isRestart() const
Definition: SimulatorFullyImplicit.hpp:342
~SimulatorFullyImplicit() override
Ends the convergence-output thread cleanly on all ranks.
Definition: SimulatorFullyImplicit_impl.hpp:78
const Grid & grid() const
Definition: SimulatorFullyImplicit.hpp:302
void updateTUNING(const Tuning &tuning)
Apply a TUNING keyword to the cached model parameters.
Definition: SimulatorFullyImplicit_impl.hpp:240
SimulatorReport report_
Aggregated report across the entire simulation.
Definition: SimulatorFullyImplicit.hpp:379
GetPropType< TypeTag, Properties::WellModel > WellModel
Definition: SimulatorFullyImplicit.hpp:141
bool runStep(SimulatorTimer &timer)
Advance the simulation by one report step.
Definition: SimulatorFullyImplicit_impl.hpp:279
Class handling simulator serialization.
Definition: SimulatorSerializer.hpp:55
Definition: SimulatorTimer.hpp:38
Definition: blackoilnewtonmethodparams.hpp:31
Definition: alignedallocator.hh:32
void logTuning(const Tuning &tuning)
Log tuning parameters.
void registerSimulatorParameters()
Definition: blackoilbioeffectsmodules.hh:45
typename Properties::Detail::GetPropImpl< TypeTag, Property >::type::type GetPropType
get the type alias defined in the property (equivalent to old macro GET_PROP_TYPE(....
Definition: propertysystem.hh:233
Definition: SimulatorFullyImplicit.hpp:64
static constexpr bool value
Definition: SimulatorFullyImplicit.hpp:64
Definition: SimulatorFullyImplicit.hpp:68
static constexpr auto * value
Definition: SimulatorFullyImplicit.hpp:68
Definition: SimulatorFullyImplicit.hpp:69
static constexpr int value
Definition: SimulatorFullyImplicit.hpp:69
Definition: SimulatorFullyImplicit.hpp:65
static constexpr auto * value
Definition: SimulatorFullyImplicit.hpp:65
Definition: SimulatorFullyImplicit.hpp:67
static constexpr auto * value
Definition: SimulatorFullyImplicit.hpp:67
Definition: SimulatorFullyImplicit.hpp:66
static constexpr auto * value
Definition: SimulatorFullyImplicit.hpp:66
Definition: SimulatorFullyImplicit.hpp:70
static constexpr bool value
Definition: SimulatorFullyImplicit.hpp:70
Abstract interface for simulator serialization ops.
Definition: SimulatorSerializer.hpp:36
Definition: SimulatorReport.hpp:122