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
70namespace Opm
71{
72
73
74
75
79 template <class SimTraits>
81 {
82 public:
83
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?
93 {
94 }
95
98 void init(const Opm::parameter::ParameterGroup& param)
99 {
100 initControl(param);
101 initGridAndProps(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_;
132
137 Opm::SparseVector<double> injection_rates_;
138 std::vector<double> injection_rates_psolver_; // Should modify psolver to take SparseVector
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 {
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 {
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.
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.
214 }
215
216
217 };
218
219
220
221} // namespace Opm
222
223
224
225#endif // OPENRS_SIMULATORBASE_HEADER
Definition: GridInterfaceEuler.hpp:377
Intersection (face) iterator for solver-near grid interface.
Definition: GridInterfaceEuler.hpp:250
void init(const DuneGrid &grid, bool build_facemap=true)
Definition: GridInterfaceEuler.hpp:437
int numberOfCells() const
Definition: GridInterfaceEuler.hpp:453
Definition: SimulatorBase.hpp:81
Opm::SparseVector< double > injection_rates_
Definition: SimulatorBase.hpp:137
Vector gravity_
Definition: SimulatorBase.hpp:128
double stepsize_
Definition: SimulatorBase.hpp:126
virtual void initSources(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:193
ResProp res_prop_
Definition: SimulatorBase.hpp:135
std::vector< double > injection_rates_psolver_
Definition: SimulatorBase.hpp:138
TransportSolver transport_solver_
Definition: SimulatorBase.hpp:140
GridType grid_
Definition: SimulatorBase.hpp:133
int linsolver_verbosity_
Definition: SimulatorBase.hpp:130
SimTraits::template FlowSolver< GridInterface, BCs >::Type FlowSolver
Definition: SimulatorBase.hpp:122
Dune::CpGrid GridType
Definition: SimulatorBase.hpp:114
FlowSolver flow_solver_
Definition: SimulatorBase.hpp:139
int linsolver_type_
Definition: SimulatorBase.hpp:131
virtual void initBoundaryConditions(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:188
BasicBoundaryConditions< true, true > BCs
Definition: SimulatorBase.hpp:121
virtual void initInitialConditions(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:160
GridInterface ginterf_
Definition: SimulatorBase.hpp:134
SimTraits::template ResProp< Dimension >::Type ResProp
Definition: SimulatorBase.hpp:117
SimTraits::template TransportSolver< GridInterface, BCs >::Type TransportSolver
Definition: SimulatorBase.hpp:123
@ Dimension
Definition: SimulatorBase.hpp:115
virtual void initGridAndProps(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:150
BCs bcond_
Definition: SimulatorBase.hpp:136
virtual void initSolvers(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:204
double residual_tolerance_
Definition: SimulatorBase.hpp:129
std::vector< double > init_saturation_
Definition: SimulatorBase.hpp:127
void init(const Opm::parameter::ParameterGroup &param)
Initialization from parameters.
Definition: SimulatorBase.hpp:98
int simulation_steps_
Definition: SimulatorBase.hpp:125
virtual void initControl(const Opm::parameter::ParameterGroup &param)
Definition: SimulatorBase.hpp:143
Dune::FieldVector< double, Dimension > Vector
Definition: SimulatorBase.hpp:116
GridInterfaceEuler< GridType > GridInterface
Definition: SimulatorBase.hpp:118
GridInterface::CellIterator CellIter
Definition: SimulatorBase.hpp:119
CellIter::FaceIterator FaceIter
Definition: SimulatorBase.hpp:120
SimulatorBase()
Definition: SimulatorBase.hpp:86
Definition: BlackoilFluid.hpp:32
void setupGridAndProps(const Opm::parameter::ParameterGroup &param, Dune::CpGrid &grid, ResProp< 3 > &res_prop)
Definition: setupGridAndProps.hpp:66
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