34 #ifndef OPENRS_MISCIBILITYWATER_HEADER
35 #define OPENRS_MISCIBILITYWATER_HEADER
37 #include "MiscibilityProps.hpp"
38 #include <opm/common/ErrorMacros.hpp>
40 #include <opm/parser/eclipse/Deck/DeckKeyword.hpp>
41 #include <opm/parser/eclipse/Deck/DeckRecord.hpp>
42 #include <opm/parser/eclipse/Deck/DeckItem.hpp>
52 typedef std::vector<std::vector<double> > table_t;
56 const auto& pvtwRecord = pvtwKeyword.getRecord(0);
57 ref_press_ = pvtwRecord.getItem(
"P_REF").getSIDouble(0);
58 ref_B_ = pvtwRecord.getItem(
"WATER_VOL_FACTOR").getSIDouble(0);
59 comp_ = pvtwRecord.getItem(
"WATER_COMPRESSIBILITY").getSIDouble(0);
60 viscosity_ = pvtwRecord.getItem(
"WATER_VISCOSITY").getSIDouble(0);
62 if (pvtwRecord.getItem(
"WATER_VISCOSIBILITY").getSIDouble(0) != 0.0) {
63 OPM_THROW(std::runtime_error,
"MiscibilityWater does not support 'viscosibility'.");
77 void initFromPvcdo(
const DeckKeyword& pvcdoKeyword)
79 const auto& pvcdoRecord = pvcdoKeyword.getRecord(0);
80 ref_press_ = pvcdoRecord.getItem(
"P_REF").getSIDouble(0);
81 ref_B_ = pvcdoRecord.getItem(
"OIL_VOL_FACTOR").getSIDouble(0);
82 comp_ = pvcdoRecord.getItem(
"OIL_COMPRESSIBILITY").getSIDouble(0);
83 viscosity_ = pvcdoRecord.getItem(
"OIL_VISCOSITY").getSIDouble(0);
84 if (pvcdoRecord.getItem(
"OIL_VISCOSIBILITY").getSIDouble(0) != 0.0) {
85 OPM_THROW(std::runtime_error,
"MiscibilityWater does not support 'viscosibility'.");
93 virtual double getViscosity(
int ,
double ,
const surfvol_t& )
const
98 virtual void getViscosity(
const std::vector<PhaseVec>& pressures,
99 const std::vector<CompVec>&,
101 std::vector<double>& output)
const
103 int num = pressures.size();
105 output.resize(num, viscosity_);
108 virtual double B(
int ,
double press,
const surfvol_t& )
const
112 double x = comp_*(press - ref_press_);
113 return ref_B_/(1.0 + x + 0.5*x*x);
119 virtual void B(
const std::vector<PhaseVec>& pressures,
120 const std::vector<CompVec>&,
122 std::vector<double>& output)
const
124 int num = pressures.size();
127 #pragma omp parallel for
128 for (
int i = 0; i < num; ++i) {
130 double x = comp_*(pressures[i][phase] - ref_press_);
131 output[i] = ref_B_/(1.0 + x + 0.5*x*x);
135 output.resize(num, ref_B_);
139 virtual double dBdp(
int region,
double press,
const surfvol_t& surfvol)
const
142 return -comp_*B(region, press, surfvol);
148 virtual void dBdp(
const std::vector<PhaseVec>& pressures,
149 const std::vector<CompVec>& surfvols,
151 std::vector<double>& output_B,
152 std::vector<double>& output_dBdp)
const
154 B(pressures, surfvols, phase, output_B);
155 int num = pressures.size();
157 output_dBdp.resize(num);
158 #pragma omp parallel for
159 for (
int i = 0; i < num; ++i) {
160 output_dBdp[i] = -comp_*output_B[i];
164 output_dBdp.resize(num, 0.0);
168 virtual double R(
int ,
double ,
const surfvol_t& )
const
173 virtual void R(
const std::vector<PhaseVec>& pressures,
174 const std::vector<CompVec>&,
176 std::vector<double>& output)
const
178 int num = pressures.size();
180 output.resize(num, 0.0);
183 virtual double dRdp(
int ,
double ,
const surfvol_t& )
const
188 virtual void dRdp(
const std::vector<PhaseVec>& pressures,
189 const std::vector<CompVec>&,
191 std::vector<double>& output_R,
192 std::vector<double>& output_dRdp)
const
194 int num = pressures.size();
196 output_R.resize(num, 0.0);
198 output_dRdp.resize(num, 0.0);
210 #endif // OPENRS_MISCIBILITYWATER_HEADER
Definition: MiscibilityWater.hpp:49
Definition: MiscibilityProps.hpp:46