setupGridAndProps.hpp
Go to the documentation of this file.
1//===========================================================================
2//
3// File: setupGridAndProps.hpp
4//
5// Created: Tue Aug 11 14:47:35 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 OPM_SETUPGRIDANDPROPS_HEADER
37#define OPM_SETUPGRIDANDPROPS_HEADER
38
39#include <opm/core/utility/parameters/ParameterGroup.hpp>
40#include <opm/core/utility/Units.hpp>
41#include <dune/grid/CpGrid.hpp>
42#include <dune/grid/sgrid.hh>
44#include <opm/parser/eclipse/Parser/Parser.hpp>
45#include <opm/parser/eclipse/Parser/ParseContext.hpp>
46#include <opm/parser/eclipse/Deck/Deck.hpp>
47#include <boost/filesystem.hpp>
48
49namespace Opm
50{
51
53 template <class RP>
54 bool useJ()
55 {
56 return false;
57 }
58
59 template<>
60 bool useJ< ReservoirPropertyCapillary<3> >();
61
65 template <template <int> class ResProp>
66 inline void setupGridAndProps(const Opm::parameter::ParameterGroup& param,
67 Dune::CpGrid& grid,
68 ResProp<3>& res_prop)
69 {
70 // Initialize grid and reservoir properties.
71 // Parts copied from Dune::CpGrid::init().
72 std::string fileformat = param.getDefault<std::string>("fileformat", "cartesian");
73 if (fileformat == "sintef_legacy") {
74 std::string grid_prefix = param.get<std::string>("grid_prefix");
75 grid.readSintefLegacyFormat(grid_prefix);
76 OPM_MESSAGE("Warning: We do not yet read legacy reservoir properties. Using defaults.");
77 res_prop.init(grid.size(0));
78 } else if (fileformat == "eclipse") {
79 std::string ecl_file = param.get<std::string>("filename");
80
81 Opm::ParseContext parseContext;
82 Opm::ParserPtr parser(new Opm::Parser());
83 Opm::DeckConstPtr deck(parser->parseFile(ecl_file , parseContext));
84 if (param.has("z_tolerance")) {
85 std::cerr << "****** Warning: z_tolerance parameter is obsolete, use PINCH in deck input instead\n";
86 }
87 bool periodic_extension = param.getDefault<bool>("periodic_extension", false);
88 bool turn_normals = param.getDefault<bool>("turn_normals", false);
89 grid.processEclipseFormat(deck, periodic_extension, turn_normals);
90 // Save EGRID file in case we are writing ECL output.
91 if (param.getDefault("output_ecl", false)) {
92 OPM_THROW(std::runtime_error, "Saving to EGRID files is not yet implemented");
93 /*
94 boost::filesystem::path ecl_path(ecl_file);
95 const std::vector<int>& globalCell = grid.globalCell();
96 ecl_path.replace_extension(".EGRID");
97 parser.saveEGRID(ecl_path.string() , (int) globalCell.size() , &globalCell[0]);
98 */
99 }
100 double perm_threshold_md = param.getDefault("perm_threshold_md", 0.0);
101 double perm_threshold = Opm::unit::convert::from(perm_threshold_md, Opm::prefix::milli*Opm::unit::darcy);
102 std::string rock_list = param.getDefault<std::string>("rock_list", "no_list");
103 std::string* rl_ptr = (rock_list == "no_list") ? 0 : &rock_list;
104 bool use_j = param.getDefault("use_jfunction_scaling", useJ<ResProp<3> >());
105 double sigma = 1.0;
106 double theta = 0.0;
107 if (use_j) {
108 sigma = param.getDefault("sigma", sigma);
109 theta = param.getDefault("theta", theta);
110 }
111 if (param.has("viscosity1") || param.has("viscosity2")) {
112 double v1 = param.getDefault("viscosity1", 0.001);
113 double v2 = param.getDefault("viscosity2", 0.003);
114 res_prop.setViscosities(v1, v2);
115 }
116 res_prop.init(deck, grid.globalCell(), perm_threshold, rl_ptr,
117 use_j, sigma, theta);
118 } else if (fileformat == "cartesian") {
119 std::array<int, 3> dims = {{ param.getDefault<int>("nx", 1),
120 param.getDefault<int>("ny", 1),
121 param.getDefault<int>("nz", 1) }};
122 std::array<double, 3> cellsz = {{ param.getDefault<double>("dx", 1.0),
123 param.getDefault<double>("dy", 1.0),
124 param.getDefault<double>("dz", 1.0) }};
125 grid.createCartesian(dims, cellsz);
126 double default_poro = param.getDefault("default_poro", 0.2);
127 double default_perm_md = param.getDefault("default_perm_md", 100.0);
128 double default_perm = Opm::unit::convert::from(default_perm_md, Opm::prefix::milli*Opm::unit::darcy);
129 OPM_MESSAGE("Warning: For generated cartesian grids, we use uniform reservoir properties.");
130 res_prop.init(grid.size(0), default_poro, default_perm);
131 } else {
132 OPM_THROW(std::runtime_error, "Unknown file format string: " << fileformat);
133 }
134 if (param.getDefault("use_unique_boundary_ids", false)) {
135 grid.setUniqueBoundaryIds(true);
136 }
137 }
138
142 template <template <int> class ResProp>
143 inline void setupGridAndPropsEclipse(Opm::DeckConstPtr deck,
144 bool periodic_extension,
145 bool turn_normals,
146 bool clip_z,
147 bool unique_bids,
148 double perm_threshold,
149 const std::string& rock_list,
150 bool use_jfunction_scaling,
151 double sigma,
152 double theta,
153 Dune::CpGrid& grid,
154 ResProp<3>& res_prop)
155 {
156 grid.processEclipseFormat(deck, periodic_extension, turn_normals, clip_z);
157 const std::string* rl_ptr = (rock_list == "no_list") ? 0 : &rock_list;
158 res_prop.init(deck, grid.globalCell(), perm_threshold, rl_ptr, use_jfunction_scaling, sigma, theta);
159 if (unique_bids) {
160 grid.setUniqueBoundaryIds(true);
161 }
162 }
163
167 template <template <int> class ResProp>
168 inline void setupGridAndProps(const Opm::parameter::ParameterGroup& param,
169 Dune::SGrid<3, 3>& grid,
170 ResProp<3>& res_prop)
171 {
172 // Initialize grid and reservoir properties.
173 // Parts copied from Dune::CpGrid::init().
174 std::string fileformat = param.getDefault<std::string>("fileformat", "cartesian");
175 if (fileformat == "cartesian") {
176 std::array<int, 3> dims = {{ param.getDefault<int>("nx", 1),
177 param.getDefault<int>("ny", 1),
178 param.getDefault<int>("nz", 1) }};
179 std::array<double, 3> cellsz = {{ param.getDefault<double>("dx", 1.0),
180 param.getDefault<double>("dy", 1.0),
181 param.getDefault<double>("dz", 1.0) }};
182 grid.~SGrid<3,3>();
183 new (&grid) Dune::SGrid<3, 3>(&dims[0], &cellsz[0]);
184 double default_poro = param.getDefault("default_poro", 0.2);
185 double default_perm = param.getDefault("default_perm", 100.0*Opm::prefix::milli*Opm::unit::darcy);
186 OPM_MESSAGE("Warning: For generated cartesian grids, we use uniform reservoir properties.");
187 res_prop.init(grid.size(0), default_poro, default_perm);
188 } else {
189 OPM_THROW(std::runtime_error, "Dune::SGrid can only handle cartesian grids, unsupported file format string: " << fileformat);
190 }
191 }
192
193} // namespace Opm
194
195
196#endif // OPENRS_SETUPGRIDANDPROPS_HEADER
Definition: BlackoilFluid.hpp:32
void setupGridAndProps(const Opm::parameter::ParameterGroup &param, Dune::CpGrid &grid, ResProp< 3 > &res_prop)
Definition: setupGridAndProps.hpp:66
bool useJ()
Helper for determining whether we should.
Definition: setupGridAndProps.hpp:54
void setupGridAndPropsEclipse(Opm::DeckConstPtr deck, bool periodic_extension, bool turn_normals, bool clip_z, bool unique_bids, double perm_threshold, const std::string &rock_list, bool use_jfunction_scaling, double sigma, double theta, Dune::CpGrid &grid, ResProp< 3 > &res_prop)
Definition: setupGridAndProps.hpp:143