From 0a287ca914aa9e086d948bd5dd108dcd2e203f87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A5rd=20Skaflestad?= Date: Tue, 21 Jun 2022 00:06:52 +0200 Subject: [PATCH] Add Well and Group Level Efficiency Factor Summary Vectors This commit adds support for the GEFF, WEFF, and WEFFG summary vectors that report the efficiency factors at the well (WEFAC) and group (GEFAC) levels. WEFFG additionally accounts for efficiency factors in a well's superior groups in the group tree. --- src/opm/output/eclipse/Summary.cpp | 72 ++++++++++++++++++++++++++++++ tests/SUMMARY_EFF_FAC.DATA | 6 +++ tests/test_Summary.cpp | 32 +++++++++++++ 3 files changed, 110 insertions(+) diff --git a/src/opm/output/eclipse/Summary.cpp b/src/opm/output/eclipse/Summary.cpp index 89d899b28..5eab20b0f 100644 --- a/src/opm/output/eclipse/Summary.cpp +++ b/src/opm/output/eclipse/Summary.cpp @@ -1577,6 +1577,73 @@ quantity well_guiderate(const fn_args& args) return guiderate_value(xwPos->second.guide_rates); } +quantity well_efficiency_factor(const fn_args& args) +{ + const auto zero = quantity { 0.0, measure::identity }; + + if (args.schedule_wells.empty()) { + return zero; + } + + const auto* well = args.schedule_wells.front(); + + auto xwPos = args.wells.find(well->name()); + if ((xwPos == args.wells.end()) || + (xwPos->second.dynamicStatus == Opm::Well::Status::SHUT)) + { + // Non-flowing wells have a zero efficiency factor + return zero; + } + + return { well->getEfficiencyFactor(), measure::identity }; +} + +quantity well_efficiency_factor_grouptree(const fn_args& args) +{ + const auto zero = quantity { 0.0, measure::identity }; + + if (args.schedule_wells.empty()) { + return zero; + } + + const auto* well = args.schedule_wells.front(); + + auto xwPos = args.wells.find(well->name()); + if ((xwPos == args.wells.end()) || + (xwPos->second.dynamicStatus == Opm::Well::Status::SHUT)) + { + // Non-flowing wells have a zero efficiency factor + return zero; + } + + auto factor = well->getEfficiencyFactor(); + auto parent = well->groupName(); + while (parent != "FIELD") { + const auto& grp = args.schedule[args.sim_step].groups(parent); + factor *= grp.getGroupEfficiencyFactor(); + + const auto prnt = grp.control_group(); + parent = prnt.has_value() ? prnt.value() : "FIELD"; + } + + return { factor, measure::identity }; +} + +quantity group_efficiency_factor(const fn_args& args) +{ + const auto zero = quantity { 0.0, measure::identity }; + + if (args.schedule_wells.empty()) { + return zero; + } + + const auto gefac = + args.schedule[args.sim_step].groups(args.group_name) + .getGroupEfficiencyFactor(); + + return { gefac, measure::identity }; +} + /* * A small DSL, really poor man's function composition, to avoid massive * repetition when declaring the handlers for each individual keyword. bin_op @@ -2117,6 +2184,11 @@ static const std::unordered_map< std::string, ofun > funs = { { "WGPI", potential_rate< rt::well_potential_gas , false, true>}, { "WGIP", potential_rate< rt::well_potential_gas , false, true>}, // Alias for 'WGPI' { "ROEW", roew }, + + // Efficiency factors + {"GEFF" , group_efficiency_factor}, + {"WEFF" , well_efficiency_factor}, + {"WEFFG", well_efficiency_factor_grouptree}, }; static const std::unordered_map< std::string, Opm::UnitSystem::measure> single_values_units = { diff --git a/tests/SUMMARY_EFF_FAC.DATA b/tests/SUMMARY_EFF_FAC.DATA index 8bb49df1b..7e03363cb 100644 --- a/tests/SUMMARY_EFF_FAC.DATA +++ b/tests/SUMMARY_EFF_FAC.DATA @@ -74,6 +74,10 @@ WOIR / WOIT / +WEFF +/ +WEFFG +/ GOPR / @@ -98,6 +102,8 @@ GGPI / GWPI / +GEFF +/ FOPR diff --git a/tests/test_Summary.cpp b/tests/test_Summary.cpp index e95c1413f..ead12b68e 100644 --- a/tests/test_Summary.cpp +++ b/tests/test_Summary.cpp @@ -2293,6 +2293,12 @@ BOOST_AUTO_TEST_CASE(efficiency_factor) { BOOST_CHECK_CLOSE( 10.1, ecl_sum_get_well_var( resp, 1, "W_1", "WOPT" ), 1e-5 ); BOOST_CHECK_CLOSE( 2 * 10.1, ecl_sum_get_well_var( resp, 2, "W_1", "WOPT" ), 1e-5 ); + BOOST_CHECK_CLOSE( 1.0, ecl_sum_get_well_var( resp, 1, "W_1", "WEFF" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 1.0, ecl_sum_get_well_var( resp, 2, "W_1", "WEFF" ), 1.0e-5 ); + + BOOST_CHECK_CLOSE( 1.0, ecl_sum_get_well_var( resp, 1, "W_1", "WEFFG" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 1.0, ecl_sum_get_well_var( resp, 2, "W_1", "WEFFG" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 10.1, ecl_sum_get_well_var( resp, 1, "W_1", "WOPR" ), 1e-5 ); BOOST_CHECK_CLOSE( 10.1, ecl_sum_get_well_var( resp, 1, "W_1", "WOPT" ), 1e-5 ); BOOST_CHECK_CLOSE( 2 * 10.1, ecl_sum_get_well_var( resp, 2, "W_1", "WOPT" ), 1e-5 ); @@ -2309,6 +2315,9 @@ BOOST_AUTO_TEST_CASE(efficiency_factor) { BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G_1", "GWPI" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G_1", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 1.0, ecl_sum_get_group_var( resp, 1, "G_1", "GEFF" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 1.0, ecl_sum_get_group_var( resp, 2, "G_1", "GEFF" ), 1.0e-5 ); + /* WEFAC 0.2 assigned to W_2. * W_2 assigned to group G2. GEFAC G2 = 0.01 */ BOOST_CHECK_CLOSE( 20.1, ecl_sum_get_well_var( resp, 1, "W_2", "WOPR" ), 1e-5 ); @@ -2317,6 +2326,12 @@ BOOST_AUTO_TEST_CASE(efficiency_factor) { BOOST_CHECK_CLOSE( 23.4, ecl_sum_get_well_connection_var( resp, 1, "W_2", "CVPR", 2, 1, 1 ), 1e-5 ); BOOST_CHECK_CLOSE( 234.5, ecl_sum_get_well_connection_var( resp, 2, "W_2", "CVPR", 2, 1, 2 ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.2, ecl_sum_get_well_var( resp, 1, "W_2", "WEFF" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 0.2, ecl_sum_get_well_var( resp, 2, "W_2", "WEFF" ), 1.0e-5 ); + + BOOST_CHECK_CLOSE( 0.2 * 0.01, ecl_sum_get_well_var( resp, 1, "W_2", "WEFFG" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 0.2 * 0.01, ecl_sum_get_well_var( resp, 2, "W_2", "WEFFG" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 23.4 * 0.2 * 0.01, ecl_sum_get_well_connection_var( resp, 1, "W_2", "CVPT", 2, 1, 1 ), 1e-5 ); BOOST_CHECK_CLOSE( 2 * 234.5 * 0.2 * 0.01, ecl_sum_get_well_connection_var( resp, 2, "W_2", "CVPT", 2, 1, 2 ), 1e-5 ); @@ -2326,23 +2341,30 @@ BOOST_AUTO_TEST_CASE(efficiency_factor) { BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G_2", "GWPI" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G_2", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G_2", "GWPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G_2", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.01 , ecl_sum_get_group_var( resp, 1, "G_2", "GEFF" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( -10.13 - (20.13 * 0.2 * 0.01), ecl_sum_get_group_var( resp, 1, "G", "GWPP" ), 1e-5 ); BOOST_CHECK_CLOSE( -10.14 - (20.14 * 0.2 * 0.01), ecl_sum_get_group_var( resp, 1, "G", "GOPP" ), 1e-5 ); BOOST_CHECK_CLOSE( -10.15 - (20.15 * 0.2 * 0.01), ecl_sum_get_group_var( resp, 1, "G", "GGPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G", "GWPI" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 1.0 , ecl_sum_get_group_var( resp, 1, "G", "GEFF" ), 1.0e-5 ); BOOST_CHECK_CLOSE( -20.13 * 0.2, ecl_sum_get_group_var( resp, 2, "G_2", "GWPP" ), 1e-5 ); BOOST_CHECK_CLOSE( -20.14 * 0.2, ecl_sum_get_group_var( resp, 2, "G_2", "GOPP" ), 1e-5 ); BOOST_CHECK_CLOSE( -20.15 * 0.2, ecl_sum_get_group_var( resp, 2, "G_2", "GGPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G_2", "GWPI" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G_2", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.01 , ecl_sum_get_group_var( resp, 2, "G_2", "GEFF" ), 1.0e-5 ); BOOST_CHECK_CLOSE( -10.13 - (20.13 * 0.2 * 0.01), ecl_sum_get_group_var( resp, 2, "G", "GWPP" ), 1e-5 ); BOOST_CHECK_CLOSE( -10.14 - (20.14 * 0.2 * 0.01), ecl_sum_get_group_var( resp, 2, "G", "GOPP" ), 1e-5 ); BOOST_CHECK_CLOSE( -10.15 - (20.15 * 0.2 * 0.01), ecl_sum_get_group_var( resp, 2, "G", "GGPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G", "GWPI" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 1.0 , ecl_sum_get_group_var( resp, 2, "G", "GEFF" ), 1.0e-5 ); /* WEFAC 0.3 assigned to W_3. * W_3 assigned to group G3. GEFAC G_3 = 0.02 @@ -2351,6 +2373,12 @@ BOOST_AUTO_TEST_CASE(efficiency_factor) { BOOST_CHECK_CLOSE( 300.2 / 300.1, ecl_sum_get_well_connection_var( resp, 2, "W_3", "CGOR", 3, 1, 1 ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.3, ecl_sum_get_well_var( resp, 1, "W_3", "WEFF" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 0.3, ecl_sum_get_well_var( resp, 2, "W_3", "WEFF" ), 1.0e-5 ); + + BOOST_CHECK_CLOSE( 0.3 * 0.02 * 0.03, ecl_sum_get_well_var( resp, 1, "W_3", "WEFFG" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 0.3 * 0.02 * 0.04, ecl_sum_get_well_var( resp, 2, "W_3", "WEFFG" ), 1.0e-5 ); + BOOST_CHECK_CLOSE( 432.1 * 0.3 * 0.02 * 0.03, ecl_sum_get_well_connection_var( resp, 1, "W_3", "CVPT", 3, 1, 1 ), 1e-5 ); BOOST_CHECK_CLOSE( 432.1 * 0.3 * 0.02 * 0.03 + @@ -2366,24 +2394,28 @@ BOOST_AUTO_TEST_CASE(efficiency_factor) { BOOST_CHECK_CLOSE( 30.15 * 0.3, ecl_sum_get_group_var( resp, 1, "G_3", "GGPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G_3", "GWPI" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G_3", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.02 , ecl_sum_get_group_var( resp, 1, "G_3", "GEFF" ), 1.0e-5 ); BOOST_CHECK_CLOSE( 30.13 * 0.3 * 0.02, ecl_sum_get_group_var( resp, 1, "G_4", "GWPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 30.14 * 0.3 * 0.02, ecl_sum_get_group_var( resp, 1, "G_4", "GOPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 30.15 * 0.3 * 0.02, ecl_sum_get_group_var( resp, 1, "G_4", "GGPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G_4", "GWPI" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 1, "G_4", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.03 , ecl_sum_get_group_var( resp, 1, "G_4", "GEFF" ), 1.0e-5 ); BOOST_CHECK_CLOSE( 30.13 * 0.3, ecl_sum_get_group_var( resp, 2, "G_3", "GWPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 30.14 * 0.3, ecl_sum_get_group_var( resp, 2, "G_3", "GOPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 30.15 * 0.3, ecl_sum_get_group_var( resp, 2, "G_3", "GGPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G_3", "GWPI" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G_3", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.02 , ecl_sum_get_group_var( resp, 2, "G_3", "GEFF" ), 1.0e-5 ); BOOST_CHECK_CLOSE( 30.13 * 0.3 * 0.02, ecl_sum_get_group_var( resp, 2, "G_4", "GWPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 30.14 * 0.3 * 0.02, ecl_sum_get_group_var( resp, 2, "G_4", "GOPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 30.15 * 0.3 * 0.02, ecl_sum_get_group_var( resp, 2, "G_4", "GGPP" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G_4", "GWPI" ), 1e-5 ); BOOST_CHECK_CLOSE( 0.0 , ecl_sum_get_group_var( resp, 2, "G_4", "GGPI" ), 1e-5 ); + BOOST_CHECK_CLOSE( 0.04 , ecl_sum_get_group_var( resp, 2, "G_4", "GEFF" ), 1.0e-5 ); BOOST_CHECK_CLOSE( - 10.13 - (20.13 * 0.2 * 0.01)