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 <opm/common/utility/parameters/ParameterGroup.hpp>
41
42#include <opm/common/utility/numeric/SparseVector.hpp>
43#include <opm/grid/utility/SparseTable.hpp>
44#include <opm/input/eclipse/Units/Units.hpp>
45
46#include <opm/grid/common/Volumes.hpp>
47#include <opm/grid/CpGrid.hpp>
48
55
58
61
62
63#include <opm/common/utility/platform_dependent/disable_warnings.h>
64
65#include <dune/grid/yaspgrid.hh>
66
67#include <opm/common/utility/platform_dependent/reenable_warnings.h>
68
69
70#include <fstream>
71#include <iterator>
72#include <iostream>
73
74
75namespace Opm
76{
77
78
79
80
84 template <class SimTraits>
86 {
87 public:
88
93 stepsize_(1.0), // init() expects units of days! Yes, but now the meaning of stepsize_ changes
94 // from days (here) to seconds (after init()). Solution to that?
98 {
99 }
100
103 void init(const Opm::ParameterGroup& param)
104 {
105 initControl(param);
106 initGridAndProps(param);
109 initSources(param);
110 initSolvers(param);
111
112 // Write any unused parameters.
113 std::cout << "==================== Unused parameters: ====================\n";
114 param.displayUsage();
115 std::cout << "================================================================\n";
116 }
117
118 protected:
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;
127 typedef typename SimTraits::template FlowSolver<GridInterface, BCs>::Type FlowSolver;
128 typedef typename SimTraits::template TransportSolver<GridInterface, BCs>::Type TransportSolver;
129
131 double stepsize_;
132 std::vector<double> init_saturation_;
137
142 Opm::SparseVector<double> injection_rates_;
143 std::vector<double> injection_rates_psolver_; // Should modify psolver to take SparseVector
146
147
148 virtual void initControl(const Opm::ParameterGroup& param)
149 {
150 simulation_steps_ = param.getDefault("simulation_steps", simulation_steps_);
151 stepsize_ = Opm::unit::convert::from(param.getDefault("stepsize", stepsize_),
152 Opm::unit::day);
153 }
154
155 virtual void initGridAndProps(const Opm::ParameterGroup& param)
156 {
159
160 gravity_[0] = param.getDefault("gx", 0.0);
161 gravity_[1] = param.getDefault("gy", 0.0);
162 gravity_[2] = param.getDefault("gz", 0.0); //Dune::unit::gravity);
163 }
164
165 virtual void initInitialConditions(const Opm::ParameterGroup& param)
166 {
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());
170 if (!satfile) {
171 OPM_THROW(std::runtime_error, "Could not open initial saturation file: " + filename);
172 }
173 int num_sats;
174 satfile >> num_sats;
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()));
181 }
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()));
191 }
192 } else {
193 double init_s = param.getDefault("init_saturation", 0.0);
194 init_saturation_.clear();
195 init_saturation_.resize(ginterf_.numberOfCells(), init_s);
196 }
197 }
198
199 virtual void initBoundaryConditions(const Opm::ParameterGroup& param)
200 {
202 }
203
204 virtual void initSources(const Opm::ParameterGroup& /* param */)
205 {
206 int nc = ginterf_.numberOfCells();
207 injection_rates_ = Opm::SparseVector<double>(nc);
208 injection_rates_psolver_.resize(nc, 0.0);
209// injection_rates_.addElement(1.0, 0);
210// injection_rates_.addElement(-1.0, nc - 1);
211// injection_rates_psolver_[0] = 1.0;
212// injection_rates_psolver_[nc - 1] = -1.0;
213 }
214
215 virtual void initSolvers(const Opm::ParameterGroup& param)
216 {
217 // Initialize flow solver.
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_);
222 //flow_solver_.assembleStatic(ginterf_, res_prop_);
223 // Initialize transport solver.
225 }
226
227
228 };
229
230
231
232} // namespace Opm
233
234
235
236#endif // OPENRS_SIMULATORBASE_HEADER
Definition: GridInterfaceEuler.hpp:368
Intersection (face) iterator for solver-near grid interface.
Definition: GridInterfaceEuler.hpp:241
void init(const DuneGrid &grid, bool build_facemap=true)
Definition: GridInterfaceEuler.hpp:428
int numberOfCells() const
Definition: GridInterfaceEuler.hpp:444
Definition: SimulatorBase.hpp:86
Opm::SparseVector< double > injection_rates_
Definition: SimulatorBase.hpp:142
Vector gravity_
Definition: SimulatorBase.hpp:133
double stepsize_
Definition: SimulatorBase.hpp:131
ResProp res_prop_
Definition: SimulatorBase.hpp:140
std::vector< double > injection_rates_psolver_
Definition: SimulatorBase.hpp:143
TransportSolver transport_solver_
Definition: SimulatorBase.hpp:145
virtual void initBoundaryConditions(const Opm::ParameterGroup &param)
Definition: SimulatorBase.hpp:199
GridType grid_
Definition: SimulatorBase.hpp:138
virtual void initSolvers(const Opm::ParameterGroup &param)
Definition: SimulatorBase.hpp:215
int linsolver_verbosity_
Definition: SimulatorBase.hpp:135
virtual void initControl(const Opm::ParameterGroup &param)
Definition: SimulatorBase.hpp:148
@ Dimension
Definition: SimulatorBase.hpp:120
void init(const Opm::ParameterGroup &param)
Initialization from parameters.
Definition: SimulatorBase.hpp:103
SimTraits::template FlowSolver< GridInterface, BCs >::Type FlowSolver
Definition: SimulatorBase.hpp:127
Dune::CpGrid GridType
Definition: SimulatorBase.hpp:119
FlowSolver flow_solver_
Definition: SimulatorBase.hpp:144
int linsolver_type_
Definition: SimulatorBase.hpp:136
BasicBoundaryConditions< true, true > BCs
Definition: SimulatorBase.hpp:126
GridInterface ginterf_
Definition: SimulatorBase.hpp:139
SimTraits::template ResProp< Dimension >::Type ResProp
Definition: SimulatorBase.hpp:122
SimTraits::template TransportSolver< GridInterface, BCs >::Type TransportSolver
Definition: SimulatorBase.hpp:128
virtual void initSources(const Opm::ParameterGroup &)
Definition: SimulatorBase.hpp:204
BCs bcond_
Definition: SimulatorBase.hpp:141
double residual_tolerance_
Definition: SimulatorBase.hpp:134
virtual void initGridAndProps(const Opm::ParameterGroup &param)
Definition: SimulatorBase.hpp:155
std::vector< double > init_saturation_
Definition: SimulatorBase.hpp:132
int simulation_steps_
Definition: SimulatorBase.hpp:130
Dune::FieldVector< double, Dimension > Vector
Definition: SimulatorBase.hpp:121
virtual void initInitialConditions(const Opm::ParameterGroup &param)
Definition: SimulatorBase.hpp:165
GridInterfaceEuler< GridType > GridInterface
Definition: SimulatorBase.hpp:123
GridInterface::CellIterator CellIter
Definition: SimulatorBase.hpp:124
CellIter::FaceIterator FaceIter
Definition: SimulatorBase.hpp:125
SimulatorBase()
Definition: SimulatorBase.hpp:91
Definition: ImplicitAssembly.hpp:43
void setupBoundaryConditions(const Opm::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
void setupGridAndProps(const Opm::ParameterGroup &param, Dune::CpGrid &grid, ResProp< 3 > &res_prop)
Definition: setupGridAndProps.hpp:71