From ffb85c98bfb1fdeec6ebb184e0e3e8439c4873f7 Mon Sep 17 00:00:00 2001 From: Sveinung Rundhovde Date: Thu, 14 Dec 2017 10:16:03 +0100 Subject: [PATCH] Add support for GVPR keyword --- opm/output/data/Wells.hpp | 25 +++++++++++++++++-------- src/opm/output/eclipse/Summary.cpp | 15 +++++++++++++++ tests/test_Summary.cpp | 20 ++++++++++++++++++++ 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/opm/output/data/Wells.hpp b/opm/output/data/Wells.hpp index ed086287e..f5822d8b0 100644 --- a/opm/output/data/Wells.hpp +++ b/opm/output/data/Wells.hpp @@ -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( diff --git a/src/opm/output/eclipse/Summary.cpp b/src/opm/output/eclipse/Summary.cpp index c5a4c50f3..1c4984da2 100644 --- a/src/opm/output/eclipse/Summary.cpp +++ b/src/opm/output/eclipse/Summary.cpp @@ -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 ) }, diff --git a/tests/test_Summary.cpp b/tests/test_Summary.cpp index ac506c9fb..6f4e174d0 100644 --- a/tests/test_Summary.cpp +++ b/tests/test_Summary.cpp @@ -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 );