Use class based enums for VFP flow types

This commit is contained in:
Joakim Hove 2021-02-15 18:53:20 +01:00
parent 27b4dabd6a
commit 6383f3c1ac
2 changed files with 56 additions and 63 deletions

View File

@ -74,21 +74,19 @@ inline EvalWell zeroIfNanInf(const EvalWell& value) {
* @return Production rate of oil, gas or liquid. * @return Production rate of oil, gas or liquid.
*/ */
template <typename T> template <typename T>
static T getFlo(const T& aqua, const T& liquid, const T& vapour, static T getFlo(const T& aqua, const T& liquid, const T& vapour, VFPProdTable::FLO_TYPE type) {
const VFPProdTable::FLO_TYPE& type) {
switch (type) { switch (type) {
case VFPProdTable::FLO_OIL: case VFPProdTable::FLO_TYPE::FLO_OIL:
//Oil = liquid phase //Oil = liquid phase
return liquid; return liquid;
case VFPProdTable::FLO_LIQ: case VFPProdTable::FLO_TYPE::FLO_LIQ:
//Liquid = aqua + liquid phases //Liquid = aqua + liquid phases
return aqua + liquid; return aqua + liquid;
case VFPProdTable::FLO_GAS: case VFPProdTable::FLO_TYPE::FLO_GAS:
//Gas = vapor phase //Gas = vapor phase
return vapour; return vapour;
case VFPProdTable::FLO_INVALID: //Intentional fall-through default:
default: throw std::logic_error("Invalid FLO_TYPE");
OPM_THROW(std::logic_error, "Invalid FLO_TYPE: '" << type << "'");
} }
} }
@ -100,21 +98,19 @@ static T getFlo(const T& aqua, const T& liquid, const T& vapour,
* @return Production rate of oil, gas or liquid. * @return Production rate of oil, gas or liquid.
*/ */
template <typename T> template <typename T>
static T getFlo(const T& aqua, const T& liquid, const T& vapour, static T getFlo(const T& aqua, const T& liquid, const T& vapour, VFPInjTable::FLO_TYPE type) {
const VFPInjTable::FLO_TYPE& type) {
switch (type) { switch (type) {
case VFPInjTable::FLO_OIL: case VFPInjTable::FLO_TYPE::FLO_OIL:
//Oil = liquid phase //Oil = liquid phase
return liquid; return liquid;
case VFPInjTable::FLO_WAT: case VFPInjTable::FLO_TYPE::FLO_WAT:
//Liquid = aqua phase //Liquid = aqua phase
return aqua; return aqua;
case VFPInjTable::FLO_GAS: case VFPInjTable::FLO_TYPE::FLO_GAS:
//Gas = vapor phase //Gas = vapor phase
return vapour; return vapour;
case VFPInjTable::FLO_INVALID: //Intentional fall-through default:
default: throw std::logic_error("Invalid FLO_TYPE");
OPM_THROW(std::logic_error, "Invalid FLO_TYPE: '" << type << "'");
} }
} }
@ -129,23 +125,22 @@ static T getFlo(const T& aqua, const T& liquid, const T& vapour,
* @return Production rate of oil, gas or liquid. * @return Production rate of oil, gas or liquid.
*/ */
template <typename T> template <typename T>
static T getWFR(const T& aqua, const T& liquid, const T& vapour, static T getWFR(const T& aqua, const T& liquid, const T& vapour, VFPProdTable::WFR_TYPE type) {
const VFPProdTable::WFR_TYPE& type) {
switch(type) { switch(type) {
case VFPProdTable::WFR_WOR: { case VFPProdTable::WFR_TYPE::WFR_WOR:
//Water-oil ratio = water / oil //Water-oil ratio = water / oil
T wor = aqua / liquid; return zeroIfNanInf(aqua/liquid);
return zeroIfNanInf(wor);
} case VFPProdTable::WFR_TYPE::WFR_WCT:
case VFPProdTable::WFR_WCT: //Water cut = water / (water + oil)
//Water cut = water / (water + oil) return zeroIfNanInf(aqua / (aqua + liquid));
return zeroIfNanInf(aqua / (aqua + liquid));
case VFPProdTable::WFR_WGR: case VFPProdTable::WFR_TYPE::WFR_WGR:
//Water-gas ratio = water / gas //Water-gas ratio = water / gas
return zeroIfNanInf(aqua / vapour); return zeroIfNanInf(aqua / vapour);
case VFPProdTable::WFR_INVALID: //Intentional fall-through
default: default:
OPM_THROW(std::logic_error, "Invalid WFR_TYPE: '" << type << "'"); throw std::logic_error("Invalid WFR_TYPE");
} }
} }
@ -159,21 +154,19 @@ static T getWFR(const T& aqua, const T& liquid, const T& vapour,
* @return Production rate of oil, gas or liquid. * @return Production rate of oil, gas or liquid.
*/ */
template <typename T> template <typename T>
static T getGFR(const T& aqua, const T& liquid, const T& vapour, static T getGFR(const T& aqua, const T& liquid, const T& vapour, VFPProdTable::GFR_TYPE type) {
const VFPProdTable::GFR_TYPE& type) {
switch(type) { switch(type) {
case VFPProdTable::GFR_GOR: case VFPProdTable::GFR_TYPE::GFR_GOR:
// Gas-oil ratio = gas / oil // Gas-oil ratio = gas / oil
return zeroIfNanInf(vapour / liquid); return zeroIfNanInf(vapour / liquid);
case VFPProdTable::GFR_GLR: case VFPProdTable::GFR_TYPE::GFR_GLR:
// Gas-liquid ratio = gas / (oil + water) // Gas-liquid ratio = gas / (oil + water)
return zeroIfNanInf(vapour / (liquid + aqua)); return zeroIfNanInf(vapour / (liquid + aqua));
case VFPProdTable::GFR_OGR: case VFPProdTable::GFR_TYPE::GFR_OGR:
// Oil-gas ratio = oil / gas // Oil-gas ratio = oil / gas
return zeroIfNanInf(liquid / vapour); return zeroIfNanInf(liquid / vapour);
case VFPProdTable::GFR_INVALID: //Intentional fall-through default:
default: throw std::logic_error("Invalid GFR_TYPE");
OPM_THROW(std::logic_error, "Invalid GFR_TYPE: '" << type << "'");
} }
} }

View File

@ -194,10 +194,10 @@ struct TrivialFixture {
inline void initProperties() { inline void initProperties() {
table.reset(new Opm::VFPProdTable(1, table.reset(new Opm::VFPProdTable(1,
1000.0, 1000.0,
Opm::VFPProdTable::FLO_OIL, Opm::VFPProdTable::FLO_TYPE::FLO_OIL,
Opm::VFPProdTable::WFR_WOR, Opm::VFPProdTable::WFR_TYPE::WFR_WOR,
Opm::VFPProdTable::GFR_GOR, Opm::VFPProdTable::GFR_TYPE::GFR_GOR,
Opm::VFPProdTable::ALQ_UNDEF, Opm::VFPProdTable::ALQ_TYPE::ALQ_UNDEF,
flo_axis, flo_axis,
thp_axis, thp_axis,
wfr_axis, wfr_axis,
@ -231,7 +231,7 @@ private:
int nz; int nz;
int nu; int nu;
int nv; int nv;
Opm::VFPProdTable::array_type data; std::vector<double> data;
}; };