MiscibilityWater.hpp
Go to the documentation of this file.
1 //===========================================================================
2 //
3 // File: MiscibilityWater.hpp
4 //
5 // Created: Tue May 18 10:26:13 2010
6 //
7 // Author(s): Atgeirr F Rasmussen <atgeirr@sintef.no>
8 // Bjørn Spjelkavik <bsp@sintef.no>
9 //
10 // $Date$
11 //
12 // $Revision$
13 //
14 //===========================================================================
15 /*
16  Copyright 2010 SINTEF ICT, Applied Mathematics.
17 
18  This file is part of the Open Porous Media project (OPM).
19 
20  OPM is free software: you can redistribute it and/or modify
21  it under the terms of the GNU General Public License as published by
22  the Free Software Foundation, either version 3 of the License, or
23  (at your option) any later version.
24 
25  OPM is distributed in the hope that it will be useful,
26  but WITHOUT ANY WARRANTY; without even the implied warranty of
27  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28  GNU General Public License for more details.
29 
30  You should have received a copy of the GNU General Public License
31  along with OPM. If not, see <http://www.gnu.org/licenses/>.
32 */
33 
34 #ifndef OPENRS_MISCIBILITYWATER_HEADER
35 #define OPENRS_MISCIBILITYWATER_HEADER
36 
37 #include "MiscibilityProps.hpp"
38 #include <opm/common/ErrorMacros.hpp>
39 
40 // Forward declaration.
41 class PVTW;
42 
43 namespace Opm
44 {
46  {
47  public:
48  typedef std::vector<std::vector<double> > table_t;
49 
50  MiscibilityWater(DeckKeywordConstPtr pvtwKeyword)
51  {
52  auto pvtwRecord = pvtwKeyword->getRecord(0);
53  ref_press_ = pvtwRecord->getItem("P_REF")->getSIDouble(0);
54  ref_B_ = pvtwRecord->getItem("WATER_VOL_FACTOR")->getSIDouble(0);
55  comp_ = pvtwRecord->getItem("WATER_COMPRESSIBILITY")->getSIDouble(0);
56  viscosity_ = pvtwRecord->getItem("WATER_VISCOSITY")->getSIDouble(0);
57 
58  if (pvtwRecord->getItem("WATER_VISCOSIBILITY")->getSIDouble(0) != 0.0) {
59  OPM_THROW(std::runtime_error, "MiscibilityWater does not support 'viscosibility'.");
60  }
61  }
62 
63 
64  MiscibilityWater(double visc)
65  : ref_press_(0.0),
66  ref_B_(1.0),
67  comp_(0.0),
68  viscosity_(visc)
69  {
70  }
71 
72  // WTF?? we initialize a class for water from a keyword for oil?
73  void initFromPvcdo(DeckKeywordConstPtr pvcdoKeyword)
74  {
75  auto pvcdoRecord = pvcdoKeyword->getRecord(0);
76  ref_press_ = pvcdoRecord->getItem("P_REF")->getSIDouble(0);
77  ref_B_ = pvcdoRecord->getItem("OIL_VOL_FACTOR")->getSIDouble(0);
78  comp_ = pvcdoRecord->getItem("OIL_COMPRESSIBILITY")->getSIDouble(0);
79  viscosity_ = pvcdoRecord->getItem("OIL_VISCOSITY")->getSIDouble(0);
80  if (pvcdoRecord->getItem("OIL_VISCOSIBILITY")->getSIDouble(0) != 0.0) {
81  OPM_THROW(std::runtime_error, "MiscibilityWater does not support 'viscosibility'.");
82  }
83  }
84 
86  {
87  }
88 
89  virtual double getViscosity(int /*region*/, double /*press*/, const surfvol_t& /*surfvol*/) const
90  {
91  return viscosity_;
92  }
93 
94  virtual void getViscosity(const std::vector<PhaseVec>& pressures,
95  const std::vector<CompVec>&,
96  int,
97  std::vector<double>& output) const
98  {
99  int num = pressures.size();
100  output.clear();
101  output.resize(num, viscosity_);
102  }
103 
104  virtual double B(int /*region*/, double press, const surfvol_t& /*surfvol*/) const
105  {
106  if (comp_) {
107  // Computing a polynomial approximation to the exponential.
108  double x = comp_*(press - ref_press_);
109  return ref_B_/(1.0 + x + 0.5*x*x);
110  } else {
111  return ref_B_;
112  }
113  }
114 
115  virtual void B(const std::vector<PhaseVec>& pressures,
116  const std::vector<CompVec>&,
117  int phase,
118  std::vector<double>& output) const
119  {
120  int num = pressures.size();
121  if (comp_) {
122  output.resize(num);
123 #pragma omp parallel for
124  for (int i = 0; i < num; ++i) {
125  // Computing a polynomial approximation to the exponential.
126  double x = comp_*(pressures[i][phase] - ref_press_);
127  output[i] = ref_B_/(1.0 + x + 0.5*x*x);
128  }
129  } else {
130  output.clear();
131  output.resize(num, ref_B_);
132  }
133  }
134 
135  virtual double dBdp(int region, double press, const surfvol_t& surfvol) const
136  {
137  if (comp_) {
138  return -comp_*B(region, press, surfvol);
139  } else {
140  return 0.0;
141  }
142  }
143 
144  virtual void dBdp(const std::vector<PhaseVec>& pressures,
145  const std::vector<CompVec>& surfvols,
146  int phase,
147  std::vector<double>& output_B,
148  std::vector<double>& output_dBdp) const
149  {
150  B(pressures, surfvols, phase, output_B);
151  int num = pressures.size();
152  if (comp_) {
153  output_dBdp.resize(num);
154 #pragma omp parallel for
155  for (int i = 0; i < num; ++i) {
156  output_dBdp[i] = -comp_*output_B[i];
157  }
158  } else {
159  output_dBdp.clear();
160  output_dBdp.resize(num, 0.0);
161  }
162  }
163 
164  virtual double R(int /*region*/, double /*press*/, const surfvol_t& /*surfvol*/) const
165  {
166  return 0.0;
167  }
168 
169  virtual void R(const std::vector<PhaseVec>& pressures,
170  const std::vector<CompVec>&,
171  int,
172  std::vector<double>& output) const
173  {
174  int num = pressures.size();
175  output.clear();
176  output.resize(num, 0.0);
177  }
178 
179  virtual double dRdp(int /*region*/, double /*press*/, const surfvol_t& /*surfvol*/) const
180  {
181  return 0.0;
182  }
183 
184  virtual void dRdp(const std::vector<PhaseVec>& pressures,
185  const std::vector<CompVec>&,
186  int,
187  std::vector<double>& output_R,
188  std::vector<double>& output_dRdp) const
189  {
190  int num = pressures.size();
191  output_R.clear();
192  output_R.resize(num, 0.0);
193  output_dRdp.clear();
194  output_dRdp.resize(num, 0.0);
195  }
196 
197  private:
198  double ref_press_;
199  double ref_B_;
200  double comp_;
201  double viscosity_;
202  };
203 
204 }
205 
206 #endif // OPENRS_MISCIBILITYWATER_HEADER
void initFromPvcdo(DeckKeywordConstPtr pvcdoKeyword)
Definition: MiscibilityWater.hpp:73
Definition: MiscibilityWater.hpp:45
virtual double dBdp(int region, double press, const surfvol_t &surfvol) const
Definition: MiscibilityWater.hpp:135
virtual double dRdp(int, double, const surfvol_t &) const
Definition: MiscibilityWater.hpp:179
Definition: BlackoilFluid.hpp:31
virtual ~MiscibilityWater()
Definition: MiscibilityWater.hpp:85
std::vector< std::vector< double > > table_t
Definition: MiscibilityWater.hpp:48
virtual void getViscosity(const std::vector< PhaseVec > &pressures, const std::vector< CompVec > &, int, std::vector< double > &output) const
Definition: MiscibilityWater.hpp:94
MiscibilityWater(double visc)
Definition: MiscibilityWater.hpp:64
CompVec surfvol_t
Definition: MiscibilityProps.hpp:49
virtual double R(int, double, const surfvol_t &) const
Definition: MiscibilityWater.hpp:164
virtual void B(const std::vector< PhaseVec > &pressures, const std::vector< CompVec > &, int phase, std::vector< double > &output) const
Definition: MiscibilityWater.hpp:115
virtual void dRdp(const std::vector< PhaseVec > &pressures, const std::vector< CompVec > &, int, std::vector< double > &output_R, std::vector< double > &output_dRdp) const
Definition: MiscibilityWater.hpp:184
MiscibilityWater(DeckKeywordConstPtr pvtwKeyword)
Definition: MiscibilityWater.hpp:50
virtual void R(const std::vector< PhaseVec > &pressures, const std::vector< CompVec > &, int, std::vector< double > &output) const
Definition: MiscibilityWater.hpp:169
Definition: MiscibilityProps.hpp:46
virtual double B(int, double press, const surfvol_t &) const
Definition: MiscibilityWater.hpp:104
virtual double getViscosity(int, double, const surfvol_t &) const
Definition: MiscibilityWater.hpp:89
virtual void dBdp(const std::vector< PhaseVec > &pressures, const std::vector< CompVec > &surfvols, int phase, std::vector< double > &output_B, std::vector< double > &output_dBdp) const
Definition: MiscibilityWater.hpp:144