From 218349a453e23660edfbb217bc1e8da398dae28b Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Tue, 9 Mar 2021 19:02:30 +0100 Subject: [PATCH 1/3] Rename GCONINJE guiderate items --- .../parser/eclipse/share/keywords/000_Eclipse100/G/GCONINJE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opm/parser/eclipse/share/keywords/000_Eclipse100/G/GCONINJE b/src/opm/parser/eclipse/share/keywords/000_Eclipse100/G/GCONINJE index 618124f22..86c1f04ae 100644 --- a/src/opm/parser/eclipse/share/keywords/000_Eclipse100/G/GCONINJE +++ b/src/opm/parser/eclipse/share/keywords/000_Eclipse100/G/GCONINJE @@ -46,13 +46,13 @@ "default": "YES" }, { - "name": "GUIDE_FRACTION", + "name": "GUIDE_RATE", "value_type": "DOUBLE", "default": 0, "dimension": "1" }, { - "name": "GUIDE_DEF", + "name": "GUIDE_RATE_DEF", "value_type": "STRING" }, { From 6e7d9102c7d36a8b75c6855196674417354717e5 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Tue, 9 Mar 2021 20:01:49 +0100 Subject: [PATCH 2/3] Rename enum Group::GuideRateTarget -> Group::GuideRateProdTarget --- .../EclipseState/Schedule/Group/Group.hpp | 10 ++-- .../EclipseState/Schedule/Group/GuideRate.hpp | 4 +- .../Schedule/Group/GuideRateConfig.hpp | 2 +- .../Schedule/Group/GuideRateModel.hpp | 2 +- src/opm/output/eclipse/AggregateGroupData.cpp | 6 +-- .../EclipseState/Schedule/Group/Group.cpp | 50 +++++++++---------- .../EclipseState/Schedule/Group/GuideRate.cpp | 12 ++--- .../Schedule/Group/GuideRateConfig.cpp | 4 +- .../Schedule/Group/GuideRateModel.cpp | 10 ++-- .../EclipseState/Schedule/KeywordHandlers.cpp | 12 ++--- tests/parser/ScheduleTests.cpp | 2 +- 11 files changed, 57 insertions(+), 57 deletions(-) diff --git a/opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp b/opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp index 05df39913..e562d5678 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp @@ -97,7 +97,7 @@ static const std::string ProductionCMode2String( ProductionCMode enumValue ); static ProductionCMode ProductionCModeFromString( const std::string& stringValue ); static ProductionCMode ProductionCModeFromInt(int ecl_int); -enum class GuideRateTarget { +enum class GuideRateProdTarget { OIL = 0, WAT = 1, GAS = 2, @@ -111,8 +111,8 @@ enum class GuideRateTarget { FORM = 10, NO_GUIDE_RATE = 11 }; -static GuideRateTarget GuideRateTargetFromString( const std::string& stringValue ); -static GuideRateTarget GuideRateTargetFromInt(int ecl_id); +static GuideRateProdTarget GuideRateProdTargetFromString( const std::string& stringValue ); +static GuideRateProdTarget GuideRateProdTargetFromInt(int ecl_id); struct GroupInjectionProperties { @@ -177,7 +177,7 @@ struct GroupProductionProperties { UDAValue gas_target; UDAValue liquid_target; double guide_rate = 0; - GuideRateTarget guide_rate_def = GuideRateTarget::NO_GUIDE_RATE; + GuideRateProdTarget guide_rate_def = GuideRateProdTarget::NO_GUIDE_RATE; double resv_target = 0; bool available_group_control = true; static GroupProductionProperties serializeObject(); @@ -215,7 +215,7 @@ struct ProductionControls { double gas_target; double liquid_target; double guide_rate; - GuideRateTarget guide_rate_def = GuideRateTarget::NO_GUIDE_RATE; + GuideRateProdTarget guide_rate_def = GuideRateProdTarget::NO_GUIDE_RATE; double resv_target = 0; int production_controls = 0; bool has_control(ProductionCMode control) const; diff --git a/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRate.hpp b/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRate.hpp index 73f160e6d..fd04298c8 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRate.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRate.hpp @@ -49,8 +49,8 @@ struct RateVector { {} - double eval(Group::GuideRateTarget target) const; double eval(Well::GuideRateTarget target) const; + double eval(Group::GuideRateProdTarget target) const; double eval(GuideRateModel::Target target) const; @@ -93,7 +93,7 @@ public: GuideRate(const Schedule& schedule); void compute(const std::string& wgname, size_t report_step, double sim_time, double oil_pot, double gas_pot, double wat_pot); double get(const std::string& well, Well::GuideRateTarget target, const RateVector& rates) const; - double get(const std::string& group, Group::GuideRateTarget target, const RateVector& rates) const; + double get(const std::string& group, Group::GuideRateProdTarget target, const RateVector& rates) const; double get(const std::string& name, GuideRateModel::Target model_target, const RateVector& rates) const; bool has(const std::string& name) const; diff --git a/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateConfig.hpp b/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateConfig.hpp index 02dbaddfa..5bdaf890c 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateConfig.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateConfig.hpp @@ -56,7 +56,7 @@ public: struct GroupTarget { double guide_rate; - Group::GuideRateTarget target; + Group::GuideRateProdTarget target; bool operator==(const GroupTarget& data) const { return guide_rate == data.guide_rate && diff --git a/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.hpp b/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.hpp index 1ed9c8f50..13883bf18 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.hpp @@ -81,8 +81,8 @@ public: double getE() const; double getF() const; - static Target convert_target(Group::GuideRateTarget group_target); static Target convert_target(Well::GuideRateTarget well_target); + static Target convert_target(Group::GuideRateProdTarget group_target); static double pot(Target target, double oil_pot, double gas_pot, double wat_pot); template diff --git a/src/opm/output/eclipse/AggregateGroupData.cpp b/src/opm/output/eclipse/AggregateGroupData.cpp index 23c2153fb..ebe6cfb77 100644 --- a/src/opm/output/eclipse/AggregateGroupData.cpp +++ b/src/opm/output/eclipse/AggregateGroupData.cpp @@ -430,7 +430,7 @@ void productionGroup(const Opm::Schedule& sched, if (cgroup) { iGrp[nwgmax + 5] = 1; - if (prod_guide_rate_def != Opm::Group::GuideRateTarget::NO_GUIDE_RATE) { + if (prod_guide_rate_def != Opm::Group::GuideRateProdTarget::NO_GUIDE_RATE) { if (deck_cmode == Opm::Group::ProductionCMode::FLD) iGrp[nwgmax + 5] = cgroup->insert_index(); @@ -476,7 +476,7 @@ void productionGroup(const Opm::Schedule& sched, if (cgroup && (group.getGroupType() != Opm::Group::GroupType::NONE)) { auto cgroup_control = static_cast(sumState.get_group_var(cgroup->name(), "GMCTP", 0)); iGrp[nwgmax + IGroup::ProdActiveCMode] - = (prod_guide_rate_def != Opm::Group::GuideRateTarget::NO_GUIDE_RATE) ? cgroup_control : 0; + = (prod_guide_rate_def != Opm::Group::GuideRateProdTarget::NO_GUIDE_RATE) ? cgroup_control : 0; } else { switch (active_cmode) { case Opm::Group::ProductionCMode::NONE: @@ -529,7 +529,7 @@ void productionGroup(const Opm::Schedule& sched, iGrp[nwgmax + 7] = (p_exceed_act == Opm::Group::ExceedAction::NONE) ? -4 : 4; // need to be checked break; case Opm::Group::ProductionCMode::FLD: - if (cgroup && (prod_guide_rate_def != Opm::Group::GuideRateTarget::NO_GUIDE_RATE)) { + if (cgroup && (prod_guide_rate_def != Opm::Group::GuideRateProdTarget::NO_GUIDE_RATE)) { iGrp[nwgmax + IGroup::GuideRateDef] = Value::GuideRateMode::Form; } iGrp[nwgmax + 7] = (p_exceed_act == Opm::Group::ExceedAction::NONE) ? 4 : 4; diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Group/Group.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Group/Group.cpp index 9d170fc2a..914b4cdad 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Group/Group.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Group/Group.cpp @@ -65,7 +65,7 @@ Group::Group(const RestartIO::RstGroup& rst_group, std::size_t insert_index_arg, production.liquid_target.update(rst_group.liquid_rate_limit); production.active_cmode = Group::ProductionCModeFromInt(rst_group.prod_active_cmode); production.gconprod_cmode = Group::ProductionCModeFromInt(rst_group.gconprod_cmode); - production.guide_rate_def = Group::GuideRateTargetFromInt(rst_group.guide_rate_def); + production.guide_rate_def = Group::GuideRateProdTargetFromInt(rst_group.guide_rate_def); if ((production.active_cmode == Group::ProductionCMode::ORAT) || (production.active_cmode == Group::ProductionCMode::WRAT) || (production.active_cmode == Group::ProductionCMode::GRAT) || @@ -295,7 +295,7 @@ Group::GroupProductionProperties Group::GroupProductionProperties::serializeObje result.gas_target = UDAValue(3.0); result.liquid_target = UDAValue(4.0); result.guide_rate = 5.0; - result.guide_rate_def = GuideRateTarget::COMB; + result.guide_rate_def = GuideRateProdTarget::COMB; result.resv_target = 6.0; result.production_controls = 7; @@ -756,55 +756,55 @@ Group::InjectionCMode Group::InjectionCModeFromInt(int ecl_int) { } } -Group::GuideRateTarget Group::GuideRateTargetFromString( const std::string& stringValue ) { +Group::GuideRateProdTarget Group::GuideRateProdTargetFromString( const std::string& stringValue ) { if (stringValue == "OIL") - return GuideRateTarget::OIL; + return GuideRateProdTarget::OIL; else if (stringValue == "WAT") - return GuideRateTarget::WAT; + return GuideRateProdTarget::WAT; else if (stringValue == "GAS") - return GuideRateTarget::GAS; + return GuideRateProdTarget::GAS; else if (stringValue == "LIQ") - return GuideRateTarget::LIQ; + return GuideRateProdTarget::LIQ; else if (stringValue == "COMB") - return GuideRateTarget::COMB; + return GuideRateProdTarget::COMB; else if (stringValue == "WGA") - return GuideRateTarget::WGA; + return GuideRateProdTarget::WGA; else if (stringValue == "CVAL") - return GuideRateTarget::CVAL; + return GuideRateProdTarget::CVAL; else if (stringValue == "INJV") - return GuideRateTarget::INJV; + return GuideRateProdTarget::INJV; else if (stringValue == "POTN") - return GuideRateTarget::POTN; + return GuideRateProdTarget::POTN; else if (stringValue == "FORM") - return GuideRateTarget::FORM; + return GuideRateProdTarget::FORM; else if (stringValue == " ") - return GuideRateTarget::NO_GUIDE_RATE; + return GuideRateProdTarget::NO_GUIDE_RATE; else - return GuideRateTarget::NO_GUIDE_RATE; + return GuideRateProdTarget::NO_GUIDE_RATE; } // Integer values defined vectoritems/group.hpp -Group::GuideRateTarget Group::GuideRateTargetFromInt(int ecl_id) { +Group::GuideRateProdTarget Group::GuideRateProdTargetFromInt(int ecl_id) { switch(ecl_id) { case 0: - return GuideRateTarget::NO_GUIDE_RATE; + return GuideRateProdTarget::NO_GUIDE_RATE; case 1: - return GuideRateTarget::OIL; + return GuideRateProdTarget::OIL; case 2: - return GuideRateTarget::WAT; + return GuideRateProdTarget::WAT; case 3: - return GuideRateTarget::GAS; + return GuideRateProdTarget::GAS; case 4: - return GuideRateTarget::LIQ; + return GuideRateProdTarget::LIQ; case 7: - return GuideRateTarget::POTN; + return GuideRateProdTarget::POTN; case 8: - return GuideRateTarget::FORM; + return GuideRateProdTarget::FORM; case 9: - return GuideRateTarget::COMB; + return GuideRateProdTarget::COMB; default: - throw std::logic_error(fmt::format("Integer GuideRateTarget: {} not recognized", ecl_id)); + throw std::logic_error(fmt::format("Integer GuideRateProdTarget: {} not recognized", ecl_id)); } } diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRate.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRate.cpp index da2bb081f..c18f685b8 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRate.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRate.cpp @@ -37,7 +37,7 @@ double GuideRate::RateVector::eval(Well::GuideRateTarget target) const return this->eval(GuideRateModel::convert_target(target)); } -double GuideRate::RateVector::eval(Group::GuideRateTarget target) const +double GuideRate::RateVector::eval(Group::GuideRateProdTarget target) const { return this->eval(GuideRateModel::convert_target(target)); } @@ -71,7 +71,7 @@ double GuideRate::get(const std::string& well, Well::GuideRateTarget target, con return this->get(well, GuideRateModel::convert_target(target), rates); } -double GuideRate::get(const std::string& group, Group::GuideRateTarget target, const RateVector& rates) const +double GuideRate::get(const std::string& group, Group::GuideRateProdTarget target, const RateVector& rates) const { return this->get(group, GuideRateModel::convert_target(target), rates); } @@ -148,7 +148,7 @@ void GuideRate::group_compute(const std::string& wgname, // If the FORM mode is used we check if the last computation is // recent enough; then we just return. if (iter != this->values.end()) { - if (group.target == Group::GuideRateTarget::FORM) { + if (group.target == Group::GuideRateProdTarget::FORM) { if (! config.has_model()) { throw std::logic_error { "When specifying GUIDERATE target FORM you must " @@ -164,15 +164,15 @@ void GuideRate::group_compute(const std::string& wgname, } } - if (group.target == Group::GuideRateTarget::INJV) { + if (group.target == Group::GuideRateProdTarget::INJV) { throw std::logic_error("Group guide rate mode: INJV not implemented"); } - if (group.target == Group::GuideRateTarget::POTN) { + if (group.target == Group::GuideRateProdTarget::POTN) { throw std::logic_error("Group guide rate mode: POTN not implemented"); } - if (group.target == Group::GuideRateTarget::FORM) { + if (group.target == Group::GuideRateProdTarget::FORM) { if (! config.has_model()) { throw std::logic_error { "When specifying GUIDERATE target FORM you must " diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateConfig.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateConfig.cpp index 20306de65..7e6d3500c 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateConfig.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateConfig.cpp @@ -28,7 +28,7 @@ GuideRateConfig GuideRateConfig::serializeObject() GuideRateConfig result; result.m_model = std::make_shared(GuideRateModel::serializeObject()); result.wells = {{"test1", WellTarget{1.0, Well::GuideRateTarget::COMB, 2.0}}}; - result.groups = {{"test2", GroupTarget{1.0, Group::GuideRateTarget::COMB}}}; + result.groups = {{"test2", GroupTarget{1.0, Group::GuideRateProdTarget::COMB}}}; return result; } @@ -77,7 +77,7 @@ void GuideRateConfig::update_group(const Group& group) { const auto& properties = group.productionProperties(); auto guide_target = properties.guide_rate_def; - if (guide_target == Group::GuideRateTarget::NO_GUIDE_RATE) { + if (guide_target == Group::GuideRateProdTarget::NO_GUIDE_RATE) { this->groups.erase(group.name()); return; } diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.cpp index 0dceedc82..3cf423760 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Group/GuideRateModel.cpp @@ -312,17 +312,17 @@ GuideRateModel::Target GuideRateModel::convert_target(Well::GuideRateTarget well throw std::logic_error("Can not convert this .... "); } -GuideRateModel::Target GuideRateModel::convert_target(Group::GuideRateTarget group_target) { - if (group_target == Group::GuideRateTarget::OIL) +GuideRateModel::Target GuideRateModel::convert_target(Group::GuideRateProdTarget group_target) { + if (group_target == Group::GuideRateProdTarget::OIL) return Target::OIL; - if (group_target == Group::GuideRateTarget::GAS) + if (group_target == Group::GuideRateProdTarget::GAS) return Target::GAS; - if (group_target == Group::GuideRateTarget::LIQ) + if (group_target == Group::GuideRateProdTarget::LIQ) return Target::LIQ; - if (group_target == Group::GuideRateTarget::WAT) + if (group_target == Group::GuideRateProdTarget::WAT) return Target::WAT; throw std::logic_error("Can not convert this .... "); diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp index f464c7249..bfd523c87 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp @@ -415,15 +415,15 @@ namespace { const bool is_field { group_name == "FIELD" } ; const bool availableForGroupControl { respond_to_parent && !is_field } ; - auto guide_rate_def = Group::GuideRateTarget::NO_GUIDE_RATE; + auto guide_rate_def = Group::GuideRateProdTarget::NO_GUIDE_RATE; double guide_rate = 0; if (!is_field) { if (guide_rate_str) { - guide_rate_def = Group::GuideRateTargetFromString(guide_rate_str.value()); + guide_rate_def = Group::GuideRateProdTargetFromString(guide_rate_str.value()); - if ((guide_rate_def == Group::GuideRateTarget::INJV || - guide_rate_def == Group::GuideRateTarget::POTN || - guide_rate_def == Group::GuideRateTarget::FORM)) { + if ((guide_rate_def == Group::GuideRateProdTarget::INJV || + guide_rate_def == Group::GuideRateProdTarget::POTN || + guide_rate_def == Group::GuideRateProdTarget::FORM)) { std::string msg_fmt = "Problem with {keyword}\n" "In {file} line {line}\n" "The supplied guide rate will be ignored"; @@ -431,7 +431,7 @@ namespace { } else { guide_rate = record.getItem("GUIDE_RATE").get(0); if (guide_rate == 0) - guide_rate_def = Group::GuideRateTarget::POTN; + guide_rate_def = Group::GuideRateProdTarget::POTN; } } } diff --git a/tests/parser/ScheduleTests.cpp b/tests/parser/ScheduleTests.cpp index ef65b474b..32cc2c8ce 100644 --- a/tests/parser/ScheduleTests.cpp +++ b/tests/parser/ScheduleTests.cpp @@ -1126,7 +1126,7 @@ BOOST_AUTO_TEST_CASE(createDeckModifyMultipleGCONPROD) { auto g = schedule.getGroup("G1", 2); BOOST_CHECK_EQUAL(g.productionControls(st).oil_target, 2000 * siFactorL); BOOST_CHECK_EQUAL(g.productionControls(st).guide_rate, 148); - BOOST_CHECK_EQUAL(true, g.productionControls(st).guide_rate_def == Group::GuideRateTarget::OIL); + BOOST_CHECK_EQUAL(true, g.productionControls(st).guide_rate_def == Group::GuideRateProdTarget::OIL); } auto g2 = schedule.getGroup("G2", 2); From e2521495f29b226b45b402724a9263b2a41b00fc Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Tue, 9 Mar 2021 19:47:39 +0100 Subject: [PATCH 3/3] Internalize guide rate when loading GCONINJE keyword --- .../EclipseState/Schedule/Group/Group.hpp | 18 ++++ .../EclipseState/Schedule/Group/Group.cpp | 19 +++++ .../EclipseState/Schedule/KeywordHandlers.cpp | 84 ++++++++++++------- 3 files changed, 93 insertions(+), 28 deletions(-) diff --git a/opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp b/opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp index e562d5678..ae7554070 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Group/Group.hpp @@ -115,6 +115,18 @@ static GuideRateProdTarget GuideRateProdTargetFromString( const std::string& str static GuideRateProdTarget GuideRateProdTargetFromInt(int ecl_id); +enum class GuideRateInjTarget { + RATE = 1, + VOID = 2, + NETV = 3, + RESV = 4, + POTN = 5, + NO_GUIDE_RATE = 6 +}; +static GuideRateInjTarget GuideRateInjTargetFromString( const std::string& stringValue ); +static GuideRateInjTarget GuideRateInjTargetFromInt(int ecl_id); + + struct GroupInjectionProperties { GroupInjectionProperties(); GroupInjectionProperties(Phase phase, const UnitSystem& unit_system); @@ -128,6 +140,8 @@ struct GroupInjectionProperties { std::optional reinj_group; std::optional voidage_group; bool available_group_control = true; + double guide_rate = 0; + GuideRateInjTarget guide_rate_def = GuideRateInjTarget::NO_GUIDE_RATE; static GroupInjectionProperties serializeObject(); @@ -148,6 +162,8 @@ struct GroupInjectionProperties { serializer(voidage_group); serializer(injection_controls); serializer(available_group_control); + serializer(guide_rate); + serializer(guide_rate_def); } }; @@ -161,6 +177,8 @@ struct InjectionControls { int injection_controls = 0; std::string reinj_group; std::string voidage_group; + double guide_rate; + GuideRateInjTarget guide_rate_def = GuideRateInjTarget::NO_GUIDE_RATE; bool has_control(InjectionCMode control) const; }; diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Group/Group.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Group/Group.cpp index 914b4cdad..e0f172a10 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Group/Group.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Group/Group.cpp @@ -246,6 +246,8 @@ Group::GroupInjectionProperties Group::GroupInjectionProperties::serializeObject result.reinj_group = "test1"; result.voidage_group = "test2"; result.injection_controls = 5; + result.guide_rate = 12345; + result.guide_rate_def = Group::GuideRateInjTarget::NETV; return result; } @@ -261,6 +263,8 @@ bool Group::GroupInjectionProperties::operator==(const GroupInjectionProperties& this->injection_controls == other.injection_controls && this->target_void_fraction == other.target_void_fraction && this->reinj_group == other.reinj_group && + this->guide_rate == other.guide_rate && + this->guide_rate_def == other.guide_rate_def && this->available_group_control == other.available_group_control && this->voidage_group == other.voidage_group; } @@ -539,6 +543,8 @@ Group::InjectionControls Group::injectionControls(Phase phase, const SummaryStat ic.target_void_fraction = UDA::eval_group_uda(inj.target_void_fraction, this->m_name, st, this->udq_undefined); ic.reinj_group = inj.reinj_group.value_or(this->m_name); ic.voidage_group = inj.voidage_group.value_or(this->m_name); + ic.guide_rate = inj.guide_rate; + ic.guide_rate_def = inj.guide_rate_def; return ic; } @@ -756,6 +762,19 @@ Group::InjectionCMode Group::InjectionCModeFromInt(int ecl_int) { } } +Group::GuideRateInjTarget Group::GuideRateInjTargetFromString( const std::string& stringValue ) { + if (stringValue == "RATE") + return GuideRateInjTarget::RATE; + else if (stringValue == "RESV") + return GuideRateInjTarget::RESV; + else if (stringValue == "VOID") + return GuideRateInjTarget::VOID; + else if (stringValue == "NETV") + return GuideRateInjTarget::NETV; + else + return GuideRateInjTarget::NO_GUIDE_RATE; +} + Group::GuideRateProdTarget Group::GuideRateProdTargetFromString( const std::string& stringValue ) { if (stringValue == "OIL") return GuideRateProdTarget::OIL; diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp index bfd523c87..b1ef0ae44 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp @@ -330,41 +330,69 @@ namespace { const auto voidage_target = record.getItem("VOIDAGE_TARGET").get(0); const bool is_free = DeckItem::to_bool(record.getItem("FREE").getTrimmedString(0)); + std::optional guide_rate_str; + { + const auto& item = record.getItem("GUIDE_RATE_DEF"); + if (item.hasValue(0)) { + const auto& string_value = record.getItem("GUIDE_RATE_DEF").getTrimmedString(0); + if (string_value.size() > 0) + guide_rate_str = string_value; + } + + } + for (const auto& group_name : group_names) { - const bool availableForGroupControl = is_free && (group_name != "FIELD"); - auto new_group = this->snapshots.back().groups.get(group_name); - Group::GroupInjectionProperties injection; - injection.phase = phase; - injection.cmode = controlMode; - injection.surface_max_rate = surfaceInjectionRate; - injection.resv_max_rate = reservoirInjectionRate; - injection.target_reinj_fraction = reinj_target; - injection.target_void_fraction = voidage_target; - injection.injection_controls = 0; - injection.available_group_control = availableForGroupControl; + const bool is_field { group_name == "FIELD" } ; - if (!record.getItem("SURFACE_TARGET").defaultApplied(0)) - injection.injection_controls += static_cast(Group::InjectionCMode::RATE); + auto guide_rate_def = Group::GuideRateInjTarget::NO_GUIDE_RATE; + double guide_rate = 0; + if (!is_field) { + if (guide_rate_str) { + guide_rate_def = Group::GuideRateInjTargetFromString(guide_rate_str.value()); + guide_rate = record.getItem("GUIDE_RATE").get(0); + if (guide_rate == 0) + guide_rate_def = Group::GuideRateInjTarget::POTN; + } + } - if (!record.getItem("RESV_TARGET").defaultApplied(0)) - injection.injection_controls += static_cast(Group::InjectionCMode::RESV); + { + const bool availableForGroupControl = is_free && !is_field; + auto new_group = this->snapshots.back().groups.get(group_name); + Group::GroupInjectionProperties injection; + injection.phase = phase; + injection.cmode = controlMode; + injection.surface_max_rate = surfaceInjectionRate; + injection.resv_max_rate = reservoirInjectionRate; + injection.target_reinj_fraction = reinj_target; + injection.target_void_fraction = voidage_target; + injection.injection_controls = 0; + injection.guide_rate = guide_rate; + injection.guide_rate_def = guide_rate_def; + injection.available_group_control = availableForGroupControl; - if (!record.getItem("REINJ_TARGET").defaultApplied(0)) - injection.injection_controls += static_cast(Group::InjectionCMode::REIN); + if (!record.getItem("SURFACE_TARGET").defaultApplied(0)) + injection.injection_controls += static_cast(Group::InjectionCMode::RATE); - if (!record.getItem("VOIDAGE_TARGET").defaultApplied(0)) - injection.injection_controls += static_cast(Group::InjectionCMode::VREP); + if (!record.getItem("RESV_TARGET").defaultApplied(0)) + injection.injection_controls += static_cast(Group::InjectionCMode::RESV); - if (record.getItem("REINJECT_GROUP").hasValue(0)) - injection.reinj_group = record.getItem("REINJECT_GROUP").getTrimmedString(0); + if (!record.getItem("REINJ_TARGET").defaultApplied(0)) + injection.injection_controls += static_cast(Group::InjectionCMode::REIN); - if (record.getItem("VOIDAGE_GROUP").hasValue(0)) - injection.voidage_group = record.getItem("VOIDAGE_GROUP").getTrimmedString(0); + if (!record.getItem("VOIDAGE_TARGET").defaultApplied(0)) + injection.injection_controls += static_cast(Group::InjectionCMode::VREP); - if (new_group.updateInjection(injection)) { - this->snapshots.back().groups.update( std::move(new_group)); - this->snapshots.back().events().addEvent( ScheduleEvents::GROUP_INJECTION_UPDATE ); - this->snapshots.back().wellgroup_events().addEvent( group_name, ScheduleEvents::GROUP_INJECTION_UPDATE); + if (record.getItem("REINJECT_GROUP").hasValue(0)) + injection.reinj_group = record.getItem("REINJECT_GROUP").getTrimmedString(0); + + if (record.getItem("VOIDAGE_GROUP").hasValue(0)) + injection.voidage_group = record.getItem("VOIDAGE_GROUP").getTrimmedString(0); + + if (new_group.updateInjection(injection)) { + this->snapshots.back().groups.update( std::move(new_group)); + this->snapshots.back().events().addEvent( ScheduleEvents::GROUP_INJECTION_UPDATE ); + this->snapshots.back().wellgroup_events().addEvent( group_name, ScheduleEvents::GROUP_INJECTION_UPDATE); + } } } } @@ -413,7 +441,6 @@ namespace { for (const auto& group_name : group_names) { const bool is_field { group_name == "FIELD" } ; - const bool availableForGroupControl { respond_to_parent && !is_field } ; auto guide_rate_def = Group::GuideRateProdTarget::NO_GUIDE_RATE; double guide_rate = 0; @@ -437,6 +464,7 @@ namespace { } { + const bool availableForGroupControl { respond_to_parent && !is_field } ; auto new_group = this->snapshots.back().groups.get(group_name); Group::GroupProductionProperties production(this->m_static.m_unit_system, group_name); production.gconprod_cmode = controlMode;