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.
This commit is contained in:
parent
7b31522fdd
commit
0a287ca914
@ -1577,6 +1577,73 @@ quantity well_guiderate(const fn_args& args)
|
||||
return guiderate_value<i>(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 = {
|
||||
|
@ -74,6 +74,10 @@ WOIR
|
||||
/
|
||||
WOIT
|
||||
/
|
||||
WEFF
|
||||
/
|
||||
WEFFG
|
||||
/
|
||||
|
||||
GOPR
|
||||
/
|
||||
@ -98,6 +102,8 @@ GGPI
|
||||
/
|
||||
GWPI
|
||||
/
|
||||
GEFF
|
||||
/
|
||||
|
||||
FOPR
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user