36#ifndef OPENRS_SIMULATORBASE_HEADER
37#define OPENRS_SIMULATORBASE_HEADER
40#include <opm/common/utility/parameters/ParameterGroup.hpp>
42#include <opm/common/utility/numeric/SparseVector.hpp>
43#include <opm/grid/utility/SparseTable.hpp>
44#include <opm/input/eclipse/Units/Units.hpp>
46#include <opm/grid/common/Volumes.hpp>
47#include <opm/grid/CpGrid.hpp>
49#include <opm/porsol/common/GridInterfaceEuler.hpp>
50#include <opm/porsol/common/ReservoirPropertyCapillary.hpp>
51#include <opm/porsol/common/BoundaryConditions.hpp>
52#include <opm/porsol/common/setupGridAndProps.hpp>
53#include <opm/porsol/common/setupBoundaryConditions.hpp>
54#include <opm/porsol/common/SimulatorUtilities.hpp>
56#include <opm/porsol/euler/EulerUpstream.hpp>
57#include <opm/porsol/euler/ImplicitCapillarity.hpp>
59#include <opm/porsol/mimetic/MimeticIPEvaluator.hpp>
60#include <opm/porsol/mimetic/IncompFlowSolverHybrid.hpp>
63#include <opm/common/utility/platform_dependent/disable_warnings.h>
65#include <dune/grid/yaspgrid.hh>
67#include <opm/common/utility/platform_dependent/reenable_warnings.h>
84 template <
class SimTraits>
92 : simulation_steps_(1),
95 residual_tolerance_(1e-8),
96 linsolver_verbosity_(1),
103 void init(
const Opm::ParameterGroup& param)
106 initGridAndProps(param);
107 initInitialConditions(param);
108 initBoundaryConditions(param);
113 std::cout <<
"==================== Unused parameters: ====================\n";
114 param.displayUsage();
115 std::cout <<
"================================================================\n";
119 typedef Dune::CpGrid GridType;
120 enum { Dimension = GridType::dimension };
121 typedef Dune::FieldVector<double, Dimension> Vector;
122 typedef typename SimTraits::template ResProp<Dimension>::Type ResProp;
123 typedef GridInterfaceEuler<GridType> GridInterface;
124 typedef GridInterface::CellIterator CellIter;
125 typedef CellIter::FaceIterator FaceIter;
126 typedef BasicBoundaryConditions<true, true> BCs;
127 typedef typename SimTraits::template FlowSolver<GridInterface, BCs>::Type FlowSolver;
128 typedef typename SimTraits::template TransportSolver<GridInterface, BCs>::Type TransportSolver;
130 int simulation_steps_;
132 std::vector<double> init_saturation_;
134 double residual_tolerance_;
135 int linsolver_verbosity_;
139 GridInterface ginterf_;
142 Opm::SparseVector<double> injection_rates_;
143 std::vector<double> injection_rates_psolver_;
144 FlowSolver flow_solver_;
145 TransportSolver transport_solver_;
148 virtual void initControl(
const Opm::ParameterGroup& param)
150 simulation_steps_ = param.getDefault(
"simulation_steps", simulation_steps_);
151 stepsize_ = Opm::unit::convert::from(param.getDefault(
"stepsize", stepsize_),
155 virtual void initGridAndProps(
const Opm::ParameterGroup& param)
158 ginterf_.init(grid_);
160 gravity_[0] = param.getDefault(
"gx", 0.0);
161 gravity_[1] = param.getDefault(
"gy", 0.0);
162 gravity_[2] = param.getDefault(
"gz", 0.0);
165 virtual void initInitialConditions(
const Opm::ParameterGroup& param)
167 if (param.getDefault(
"init_saturation_from_file",
false)) {
168 std::string filename = param.get<std::string>(
"init_saturation_filename");
169 std::ifstream satfile(filename.c_str());
171 OPM_THROW(std::runtime_error,
"Could not open initial saturation file: " + filename);
175 if (num_sats != ginterf_.numberOfCells()) {
176 OPM_THROW(std::runtime_error,
177 "Number of saturation values claimed different "
178 "from number of grid cells: " +
179 std::to_string(num_sats) +
180 " vs. " + std::to_string(ginterf_.numberOfCells()));
182 std::istream_iterator<double> beg(satfile);
183 std::istream_iterator<double> end;
184 init_saturation_.assign(beg, end);
185 if (
int(init_saturation_.size()) != num_sats) {
186 OPM_THROW(std::runtime_error,
187 "Number of saturation values claimed different "
188 "from actual file content: " +
189 std::to_string(num_sats) +
190 " vs. " + std::to_string(init_saturation_.size()));
193 double init_s = param.getDefault(
"init_saturation", 0.0);
194 init_saturation_.clear();
195 init_saturation_.resize(ginterf_.numberOfCells(), init_s);
199 virtual void initBoundaryConditions(
const Opm::ParameterGroup& param)
204 virtual void initSources(
const Opm::ParameterGroup& )
206 int nc = ginterf_.numberOfCells();
207 injection_rates_ = Opm::SparseVector<double>(nc);
208 injection_rates_psolver_.resize(nc, 0.0);
215 virtual void initSolvers(
const Opm::ParameterGroup& param)
218 flow_solver_.init(ginterf_, res_prop_, gravity_, bcond_);
219 residual_tolerance_ = param.getDefault(
"residual_tolerance", residual_tolerance_);
220 linsolver_verbosity_ = param.getDefault(
"linsolver_verbosity", linsolver_verbosity_);
221 linsolver_type_ = param.getDefault(
"linsolver_type", linsolver_type_);
224 transport_solver_.init(param, ginterf_, res_prop_, bcond_);
Definition: SimulatorBase.hpp:86
void init(const Opm::ParameterGroup ¶m)
Initialization from parameters.
Definition: SimulatorBase.hpp:103
SimulatorBase()
Definition: SimulatorBase.hpp:91
Inverting small matrices.
Definition: ImplicitAssembly.hpp:43
void setupBoundaryConditions(const Opm::ParameterGroup ¶m, const GridInterface &g, BCs &bcs)
Setup boundary conditions for a simulation.
Definition: setupBoundaryConditions.hpp:51
void setupGridAndProps(const Opm::ParameterGroup ¶m, Dune::CpGrid &grid, ResProp< 3 > &res_prop)
Definition: setupGridAndProps.hpp:71