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/ParseMode.hpp>
46 #include <opm/parser/eclipse/Deck/Deck.hpp>
47 #include <boost/filesystem.hpp>
48 
49 namespace 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::ParseMode parseMode;
82  Opm::ParserPtr parser(new Opm::Parser());
83  Opm::DeckConstPtr deck(parser->parseFile(ecl_file , parseMode));
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
bool useJ()
Helper for determining whether we should.
Definition: setupGridAndProps.hpp:54
Definition: BlackoilFluid.hpp:31
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
void setupGridAndProps(const Opm::parameter::ParameterGroup &param, Dune::CpGrid &grid, ResProp< 3 > &res_prop)
Definition: setupGridAndProps.hpp:66