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_);
236 #endif // OPENRS_SIMULATORBASE_HEADER Definition: SimulatorBase.hpp:85
void setupBoundaryConditions(const Opm::ParameterGroup ¶m, const GridInterface &g, BCs &bcs)
Setup boundary conditions for a simulation.
Definition: setupBoundaryConditions.hpp:51
Inverting small matrices.
Definition: ImplicitAssembly.hpp:43
void setupGridAndProps(const Opm::ParameterGroup ¶m, Dune::CpGrid &grid, ResProp< 3 > &res_prop)
Definition: setupGridAndProps.hpp:71
SimulatorBase()
Definition: SimulatorBase.hpp:91
void init(const Opm::ParameterGroup ¶m)
Initialization from parameters.
Definition: SimulatorBase.hpp:103