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/parser/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,
"Number of saturation values claimed different from number of grid cells: "
177 << num_sats <<
" vs. " << ginterf_.numberOfCells());
179 std::istream_iterator<double> beg(satfile);
180 std::istream_iterator<double> end;
181 init_saturation_.assign(beg, end);
182 if (
int(init_saturation_.size()) != num_sats) {
183 OPM_THROW(std::runtime_error,
"Number of saturation values claimed different from actual file content: "
184 << num_sats <<
" vs. " << init_saturation_.size());
187 double init_s = param.getDefault(
"init_saturation", 0.0);
188 init_saturation_.clear();
189 init_saturation_.resize(ginterf_.numberOfCells(), init_s);
193 virtual void initBoundaryConditions(
const Opm::ParameterGroup& param)
198 virtual void initSources(
const Opm::ParameterGroup& )
200 int nc = ginterf_.numberOfCells();
201 injection_rates_ = Opm::SparseVector<double>(nc);
202 injection_rates_psolver_.resize(nc, 0.0);
209 virtual void initSolvers(
const Opm::ParameterGroup& param)
212 flow_solver_.init(ginterf_, res_prop_, gravity_, bcond_);
213 residual_tolerance_ = param.getDefault(
"residual_tolerance", residual_tolerance_);
214 linsolver_verbosity_ = param.getDefault(
"linsolver_verbosity", linsolver_verbosity_);
215 linsolver_type_ = param.getDefault(
"linsolver_type", linsolver_type_);
218 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:69