SimulatorBase.hpp
Go to the documentation of this file.
1 //===========================================================================
2 //
3 // File: SimulatorBase.hpp
4 //
5 // Created: Tue Aug 11 15:01:48 2009
6 //
7 // Author(s): Atgeirr F Rasmussen <atgeirr@sintef.no>
8 // Bård Skaflestad <bard.skaflestad@sintef.no>
9 //
10 // $Date$
11 //
12 // $Revision$
13 //
14 //===========================================================================
15 
16 /*
17  Copyright 2009, 2010 SINTEF ICT, Applied Mathematics.
18  Copyright 2009, 2010 Statoil ASA.
19 
20  This file is part of The Open Reservoir Simulator Project (OpenRS).
21 
22  OpenRS is free software: you can redistribute it and/or modify
23  it under the terms of the GNU General Public License as published by
24  the Free Software Foundation, either version 3 of the License, or
25  (at your option) any later version.
26 
27  OpenRS is distributed in the hope that it will be useful,
28  but WITHOUT ANY WARRANTY; without even the implied warranty of
29  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30  GNU General Public License for more details.
31 
32  You should have received a copy of the GNU General Public License
33  along with OpenRS. If not, see <http://www.gnu.org/licenses/>.
34 */
35 
36 #ifndef OPENRS_SIMULATORBASE_HEADER
37 #define OPENRS_SIMULATORBASE_HEADER
38 
39 
40 #include <boost/lexical_cast.hpp>
41 
42 #include <opm/core/utility/parameters/ParameterGroup.hpp>
43 
44 #include <opm/core/utility/SparseVector.hpp>
45 #include <opm/core/utility/SparseTable.hpp>
46 #include <opm/core/utility/Units.hpp>
47 
48 #include <dune/grid/common/Volumes.hpp>
49 #include <dune/grid/CpGrid.hpp>
50 #include <dune/grid/yaspgrid.hh>
51 
58 
61 
64 
65 #include <fstream>
66 #include <iterator>
67 #include <iostream>
68 
69 
70 namespace Opm
71 {
72 
73 
74 
75 
79  template <class SimTraits>
81  {
82  public:
83 
87  : simulation_steps_(1),
88  stepsize_(1.0), // init() expects units of days! Yes, but now the meaning of stepsize_ changes
89  // from days (here) to seconds (after init()). Solution to that?
90  residual_tolerance_(1e-8),
93  {
94  }
95 
98  void init(const Opm::parameter::ParameterGroup& param)
99  {
100  initControl(param);
101  initGridAndProps(param);
102  initInitialConditions(param);
103  initBoundaryConditions(param);
104  initSources(param);
105  initSolvers(param);
106 
107  // Write any unused parameters.
108  std::cout << "==================== Unused parameters: ====================\n";
109  param.displayUsage();
110  std::cout << "================================================================\n";
111  }
112 
113  protected:
114  typedef Dune::CpGrid GridType;
115  enum { Dimension = GridType::dimension };
116  typedef Dune::FieldVector<double, Dimension> Vector;
117  typedef typename SimTraits::template ResProp<Dimension>::Type ResProp;
122  typedef typename SimTraits::template FlowSolver<GridInterface, BCs>::Type FlowSolver;
123  typedef typename SimTraits::template TransportSolver<GridInterface, BCs>::Type TransportSolver;
124 
126  double stepsize_;
127  std::vector<double> init_saturation_;
128  Vector gravity_;
132 
133  GridType grid_;
134  GridInterface ginterf_;
135  ResProp res_prop_;
136  BCs bcond_;
137  Opm::SparseVector<double> injection_rates_;
138  std::vector<double> injection_rates_psolver_; // Should modify psolver to take SparseVector
139  FlowSolver flow_solver_;
140  TransportSolver transport_solver_;
141 
142 
143  virtual void initControl(const Opm::parameter::ParameterGroup& param)
144  {
145  simulation_steps_ = param.getDefault("simulation_steps", simulation_steps_);
146  stepsize_ = Opm::unit::convert::from(param.getDefault("stepsize", stepsize_),
147  Opm::unit::day);
148  }
149 
150  virtual void initGridAndProps(const Opm::parameter::ParameterGroup& param)
151  {
152  setupGridAndProps(param, grid_, res_prop_);
153  ginterf_.init(grid_);
154 
155  gravity_[0] = param.getDefault("gx", 0.0);
156  gravity_[1] = param.getDefault("gy", 0.0);
157  gravity_[2] = param.getDefault("gz", 0.0); //Dune::unit::gravity);
158  }
159 
160  virtual void initInitialConditions(const Opm::parameter::ParameterGroup& param)
161  {
162  if (param.getDefault("init_saturation_from_file", false)) {
163  std::string filename = param.get<std::string>("init_saturation_filename");
164  std::ifstream satfile(filename.c_str());
165  if (!satfile) {
166  OPM_THROW(std::runtime_error, "Could not open initial saturation file: " << filename);
167  }
168  int num_sats;
169  satfile >> num_sats;
170  if (num_sats != ginterf_.numberOfCells()) {
171  OPM_THROW(std::runtime_error, "Number of saturation values claimed different from number of grid cells: "
172  << num_sats << " vs. " << ginterf_.numberOfCells());
173  }
174  std::istream_iterator<double> beg(satfile);
175  std::istream_iterator<double> end;
176  init_saturation_.assign(beg, end);
177  if (int(init_saturation_.size()) != num_sats) {
178  OPM_THROW(std::runtime_error, "Number of saturation values claimed different from actual file content: "
179  << num_sats << " vs. " << init_saturation_.size());
180  }
181  } else {
182  double init_s = param.getDefault("init_saturation", 0.0);
183  init_saturation_.clear();
184  init_saturation_.resize(ginterf_.numberOfCells(), init_s);
185  }
186  }
187 
188  virtual void initBoundaryConditions(const Opm::parameter::ParameterGroup& param)
189  {
190  setupBoundaryConditions(param, ginterf_, bcond_);
191  }
192 
193  virtual void initSources(const Opm::parameter::ParameterGroup& param)
194  {
195  int nc = ginterf_.numberOfCells();
196  injection_rates_ = Opm::SparseVector<double>(nc);
197  injection_rates_psolver_.resize(nc, 0.0);
198 // injection_rates_.addElement(1.0, 0);
199 // injection_rates_.addElement(-1.0, nc - 1);
200 // injection_rates_psolver_[0] = 1.0;
201 // injection_rates_psolver_[nc - 1] = -1.0;
202  }
203 
204  virtual void initSolvers(const Opm::parameter::ParameterGroup& param)
205  {
206  // Initialize flow solver.
207  flow_solver_.init(ginterf_, res_prop_, gravity_, bcond_);
208  residual_tolerance_ = param.getDefault("residual_tolerance", residual_tolerance_);
209  linsolver_verbosity_ = param.getDefault("linsolver_verbosity", linsolver_verbosity_);
210  linsolver_type_ = param.getDefault("linsolver_type", linsolver_type_);
211  //flow_solver_.assembleStatic(ginterf_, res_prop_);
212  // Initialize transport solver.
213  transport_solver_.init(param, ginterf_, res_prop_, bcond_);
214  }
215 
216 
217  };
218 
219 
220 
221 } // namespace Opm
222 
223 
224 
225 #endif // OPENRS_SIMULATORBASE_HEADER
TransportSolver transport_solver_
Definition: SimulatorBase.hpp:140
std::vector< double > init_saturation_
Definition: SimulatorBase.hpp:127
Vector gravity_
Definition: SimulatorBase.hpp:128
Definition: BlackoilFluid.hpp:31
FlowSolver flow_solver_
Definition: SimulatorBase.hpp:139
SimTraits::template FlowSolver< GridInterface, BCs >::Type FlowSolver
Definition: SimulatorBase.hpp:122
void init(const DuneGrid &grid, bool build_facemap=true)
Definition: GridInterfaceEuler.hpp:437
int numberOfCells() const
Definition: GridInterfaceEuler.hpp:453
GridType grid_
Definition: SimulatorBase.hpp:133
int linsolver_verbosity_
Definition: SimulatorBase.hpp:130
GridInterface ginterf_
Definition: SimulatorBase.hpp:134
BCs bcond_
Definition: SimulatorBase.hpp:136
virtual void initControl(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:143
void setupBoundaryConditions(const Opm::parameter::ParameterGroup &param, const GridInterface &g, BCs &bcs)
Setup boundary conditions for a simulation. It is assumed that the boundary ids are 1-6...
Definition: setupBoundaryConditions.hpp:51
GridInterface::CellIterator CellIter
Definition: SimulatorBase.hpp:119
void setupGridAndProps(const Opm::parameter::ParameterGroup &param, Dune::CpGrid &grid, ResProp< 3 > &res_prop)
Definition: setupGridAndProps.hpp:66
ResProp res_prop_
Definition: SimulatorBase.hpp:135
Definition: SimulatorBase.hpp:80
double residual_tolerance_
Definition: SimulatorBase.hpp:129
Intersection (face) iterator for solver-near grid interface.
Definition: GridInterfaceEuler.hpp:245
virtual void initInitialConditions(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:160
SimTraits::template TransportSolver< GridInterface, BCs >::Type TransportSolver
Definition: SimulatorBase.hpp:123
CellIter::FaceIterator FaceIter
Definition: SimulatorBase.hpp:120
int linsolver_type_
Definition: SimulatorBase.hpp:131
BasicBoundaryConditions< true, true > BCs
Definition: SimulatorBase.hpp:121
Dune::CpGrid GridType
Definition: SimulatorBase.hpp:114
virtual void initGridAndProps(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:150
virtual void initSources(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:193
GridInterfaceEuler< GridType > GridInterface
Definition: SimulatorBase.hpp:118
std::vector< double > injection_rates_psolver_
Definition: SimulatorBase.hpp:138
int simulation_steps_
Definition: SimulatorBase.hpp:125
void init(const Opm::parameter::ParameterGroup &param)
Initialization from parameters.
Definition: SimulatorBase.hpp:98
double stepsize_
Definition: SimulatorBase.hpp:126
virtual void initBoundaryConditions(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:188
SimTraits::template ResProp< Dimension >::Type ResProp
Definition: SimulatorBase.hpp:117
virtual void initSolvers(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:204
Definition: GridInterfaceEuler.hpp:371
Opm::SparseVector< double > injection_rates_
Definition: SimulatorBase.hpp:137
SimulatorBase()
Definition: SimulatorBase.hpp:86
Definition: SimulatorBase.hpp:115
Dune::FieldVector< double, Dimension > Vector
Definition: SimulatorBase.hpp:116