Add support for GVPR keyword

This commit is contained in:
Sveinung Rundhovde 2017-12-14 10:16:03 +01:00
parent a55f8497b6
commit ffb85c98bf
3 changed files with 52 additions and 8 deletions

View File

@ -45,14 +45,17 @@ namespace Opm {
public:
Rates() = default;
enum class opt : uint32_t {
wat = (1 << 0),
oil = (1 << 1),
gas = (1 << 2),
polymer = (1 << 3),
solvent = (1 << 4),
energy = (1 << 5),
dissolved_gas = (1 << 6),
vaporized_oil = (1 << 7),
wat = (1 << 0),
oil = (1 << 1),
gas = (1 << 2),
polymer = (1 << 3),
solvent = (1 << 4),
energy = (1 << 5),
dissolved_gas = (1 << 6),
vaporized_oil = (1 << 7),
reservoir_water = (1 << 8),
reservoir_oil = (1 << 9),
reservoir_gas = (1 << 10),
};
using enum_size = std::underlying_type< opt >::type;
@ -88,6 +91,9 @@ namespace Opm {
double energy = 0.0;
double dissolved_gas = 0.0;
double vaporized_oil = 0.0;
double reservoir_water = 0.0;
double reservoir_oil = 0.0;
double reservoir_gas = 0.0;
};
struct Completion {
@ -196,6 +202,9 @@ namespace Opm {
case opt::energy: return this->energy;
case opt::dissolved_gas: return this->dissolved_gas;
case opt::vaporized_oil: return this->vaporized_oil;
case opt::reservoir_water: return this->reservoir_water;
case opt::reservoir_oil: return this->reservoir_oil;
case opt::reservoir_gas: return this->reservoir_gas;
}
throw std::invalid_argument(

View File

@ -94,6 +94,10 @@ measure mul_unit( measure lhs, measure rhs ) {
( rhs == measure::gas_surface_rate && lhs == measure::time ) )
return measure::gas_surface_volume;
if( ( lhs == measure::rate && rhs == measure::time ) ||
( rhs == measure::rate && lhs == measure::time ) )
return measure::volume;
return lhs;
}
@ -179,6 +183,15 @@ measure rate_unit< Phase::GAS >() { return measure::gas_surface_rate; }
template<> constexpr
measure rate_unit< rt::solvent >() { return measure::gas_surface_rate; }
template<> constexpr
measure rate_unit< rt::reservoir_water >() { return measure::rate; }
template<> constexpr
measure rate_unit< rt::reservoir_oil >() { return measure::rate; }
template<> constexpr
measure rate_unit< rt::reservoir_gas >() { return measure::rate; }
template< rt phase, bool injection = true >
inline quantity rate( const fn_args& args ) {
double sum = 0.0;
@ -615,6 +628,8 @@ static const std::unordered_map< std::string, ofun > funs = {
{ "GOPRS", rate< rt::vaporized_oil, producer > },
{ "GOPRF", sub (rate < rt::oil, producer >, rate< rt::vaporized_oil, producer > ) },
{ "GLPR", sum( rate< rt::wat, producer >, rate< rt::oil, producer > ) },
{ "GVPR", sum( sum( rate< rt::reservoir_water, producer >, rate< rt::reservoir_oil, producer > ),
rate< rt::reservoir_gas, producer > ) },
{ "GWPT", mul( rate< rt::wat, producer >, duration ) },
{ "GOPT", mul( rate< rt::oil, producer >, duration ) },

View File

@ -138,6 +138,9 @@ static data::Wells result_wells() {
rates1.set( rt::solvent, -10.3 / day );
rates1.set( rt::dissolved_gas, -10.4 / day );
rates1.set( rt::vaporized_oil, -10.5 / day );
rates1.set( rt::reservoir_water, -10.6 / day );
rates1.set( rt::reservoir_oil, -10.7 / day );
rates1.set( rt::reservoir_gas, -10.8 / day );
data::Rates rates2;
rates2.set( rt::wat, -20.0 / day );
@ -146,6 +149,9 @@ static data::Wells result_wells() {
rates2.set( rt::solvent, -20.3 / day );
rates2.set( rt::dissolved_gas, -20.4 / day );
rates2.set( rt::vaporized_oil, -20.5 / day );
rates2.set( rt::reservoir_water, -20.6 / day );
rates2.set( rt::reservoir_oil, -20.7 / day );
rates2.set( rt::reservoir_gas, -20.8 / day );
data::Rates rates3;
rates3.set( rt::wat, 30.0 / day );
@ -154,6 +160,9 @@ static data::Wells result_wells() {
rates3.set( rt::solvent, 30.3 / day );
rates3.set( rt::dissolved_gas, 30.4 / day );
rates3.set( rt::vaporized_oil, 30.5 / day );
rates3.set( rt::reservoir_water, 30.6 / day );
rates3.set( rt::reservoir_oil, 30.7 / day );
rates3.set( rt::reservoir_gas, 30.8 / day );
/* completion rates */
@ -164,6 +173,9 @@ static data::Wells result_wells() {
crates1.set( rt::solvent, -100.3 / day );
crates1.set( rt::dissolved_gas, -100.4 / day );
crates1.set( rt::vaporized_oil, -100.5 / day );
crates1.set( rt::reservoir_water, -100.6 / day );
crates1.set( rt::reservoir_oil, -100.7 / day );
crates1.set( rt::reservoir_gas, -100.8 / day );
data::Rates crates2;
crates2.set( rt::wat, -200.0 / day );
@ -172,6 +184,9 @@ static data::Wells result_wells() {
crates2.set( rt::solvent, -200.3 / day );
crates2.set( rt::dissolved_gas, -200.4 / day );
crates2.set( rt::vaporized_oil, -200.5 / day );
crates2.set( rt::reservoir_water, -200.6 / day );
crates2.set( rt::reservoir_oil, -200.7 / day );
crates2.set( rt::reservoir_gas, -200.8 / day );
data::Rates crates3;
crates3.set( rt::wat, 300.0 / day );
@ -180,6 +195,9 @@ static data::Wells result_wells() {
crates3.set( rt::solvent, 300.3 / day );
crates3.set( rt::dissolved_gas, 300.4 / day );
crates3.set( rt::vaporized_oil, 300.5 / day );
crates2.set( rt::reservoir_water, 300.6 / day );
crates2.set( rt::reservoir_oil, 300.7 / day );
crates2.set( rt::reservoir_gas, 300.8 / day );
/*
The active index assigned to the completion must be manually
@ -437,6 +455,8 @@ BOOST_AUTO_TEST_CASE(group_keywords) {
BOOST_CHECK_CLOSE( 10.5 + 20.5, ecl_sum_get_group_var( resp, 1, "G_1", "GOPRS" ), 1e-5 );
BOOST_CHECK_CLOSE((10.1 - 10.5) + (20.1 - 20.5),
ecl_sum_get_group_var( resp, 1, "G_1", "GOPRF" ), 1e-5 );
BOOST_CHECK_CLOSE( 10.6 + 10.7 + 10.8 + 20.6 + 20.7 + 20.8,
ecl_sum_get_group_var( resp, 1, "G_1", "GVPR" ), 1e-5 );
/* Production totals */
BOOST_CHECK_CLOSE( 10.0 + 20.0, ecl_sum_get_group_var( resp, 1, "G_1", "GWPT" ), 1e-5 );