36 #ifndef OPENRS_SIMULATORBASE_HEADER 37 #define OPENRS_SIMULATORBASE_HEADER 40 #include <opm/core/utility/parameters/ParameterGroup.hpp> 42 #include <opm/core/utility/SparseVector.hpp> 43 #include <opm/core/utility/SparseTable.hpp> 44 #include <opm/parser/eclipse/Units/Units.hpp> 46 #include <dune/grid/common/Volumes.hpp> 47 #include <dune/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 <boost/lexical_cast.hpp> 66 #include <dune/grid/yaspgrid.hh> 68 #include <opm/common/utility/platform_dependent/reenable_warnings.h> 85 template <
class SimTraits>
93 : simulation_steps_(1),
96 residual_tolerance_(1e-8),
97 linsolver_verbosity_(1),
104 void init(
const Opm::ParameterGroup& param)
107 initGridAndProps(param);
108 initInitialConditions(param);
109 initBoundaryConditions(param);
114 std::cout <<
"==================== Unused parameters: ====================\n";
115 param.displayUsage();
116 std::cout <<
"================================================================\n";
120 typedef Dune::CpGrid GridType;
121 enum { Dimension = GridType::dimension };
122 typedef Dune::FieldVector<double, Dimension> Vector;
123 typedef typename SimTraits::template ResProp<Dimension>::Type ResProp;
124 typedef GridInterfaceEuler<GridType> GridInterface;
125 typedef GridInterface::CellIterator CellIter;
126 typedef CellIter::FaceIterator FaceIter;
127 typedef BasicBoundaryConditions<true, true> BCs;
128 typedef typename SimTraits::template FlowSolver<GridInterface, BCs>::Type FlowSolver;
129 typedef typename SimTraits::template TransportSolver<GridInterface, BCs>::Type TransportSolver;
131 int simulation_steps_;
133 std::vector<double> init_saturation_;
135 double residual_tolerance_;
136 int linsolver_verbosity_;
140 GridInterface ginterf_;
143 Opm::SparseVector<double> injection_rates_;
144 std::vector<double> injection_rates_psolver_;
145 FlowSolver flow_solver_;
146 TransportSolver transport_solver_;
149 virtual void initControl(
const Opm::ParameterGroup& param)
151 simulation_steps_ = param.getDefault(
"simulation_steps", simulation_steps_);
152 stepsize_ = Opm::unit::convert::from(param.getDefault(
"stepsize", stepsize_),
156 virtual void initGridAndProps(
const Opm::ParameterGroup& param)
159 ginterf_.init(grid_);
161 gravity_[0] = param.getDefault(
"gx", 0.0);
162 gravity_[1] = param.getDefault(
"gy", 0.0);
163 gravity_[2] = param.getDefault(
"gz", 0.0);
166 virtual void initInitialConditions(
const Opm::ParameterGroup& param)
168 if (param.getDefault(
"init_saturation_from_file",
false)) {
169 std::string filename = param.get<std::string>(
"init_saturation_filename");
170 std::ifstream satfile(filename.c_str());
172 OPM_THROW(std::runtime_error,
"Could not open initial saturation file: " << filename);
176 if (num_sats != ginterf_.numberOfCells()) {
177 OPM_THROW(std::runtime_error,
"Number of saturation values claimed different from number of grid cells: " 178 << num_sats <<
" vs. " << ginterf_.numberOfCells());
180 std::istream_iterator<double> beg(satfile);
181 std::istream_iterator<double> end;
182 init_saturation_.assign(beg, end);
183 if (
int(init_saturation_.size()) != num_sats) {
184 OPM_THROW(std::runtime_error,
"Number of saturation values claimed different from actual file content: " 185 << num_sats <<
" vs. " << init_saturation_.size());
188 double init_s = param.getDefault(
"init_saturation", 0.0);
189 init_saturation_.clear();
190 init_saturation_.resize(ginterf_.numberOfCells(), init_s);
194 virtual void initBoundaryConditions(
const Opm::ParameterGroup& param)
199 virtual void initSources(
const Opm::ParameterGroup& )
201 int nc = ginterf_.numberOfCells();
202 injection_rates_ = Opm::SparseVector<double>(nc);
203 injection_rates_psolver_.resize(nc, 0.0);
210 virtual void initSolvers(
const Opm::ParameterGroup& param)
213 flow_solver_.init(ginterf_, res_prop_, gravity_, bcond_);
214 residual_tolerance_ = param.getDefault(
"residual_tolerance", residual_tolerance_);
215 linsolver_verbosity_ = param.getDefault(
"linsolver_verbosity", linsolver_verbosity_);
216 linsolver_type_ = param.getDefault(
"linsolver_type", linsolver_type_);
219 transport_solver_.init(param, ginterf_, res_prop_, bcond_);
231 #endif // OPENRS_SIMULATORBASE_HEADER Definition: SimulatorBase.hpp:86
void setupBoundaryConditions(const Opm::ParameterGroup ¶m, const GridInterface &g, BCs &bcs)
Setup boundary conditions for a simulation.
Definition: setupBoundaryConditions.hpp:51
Class for immiscible dead oil and dry gas.
Definition: applier.hpp:18
void setupGridAndProps(const Opm::ParameterGroup ¶m, Dune::CpGrid &grid, ResProp< 3 > &res_prop)
Definition: setupGridAndProps.hpp:70
SimulatorBase()
Definition: SimulatorBase.hpp:92
void init(const Opm::ParameterGroup ¶m)
Initialization from parameters.
Definition: SimulatorBase.hpp:104