From 29bfdd00bf8829572ada3a714bb2cb0a2718e019 Mon Sep 17 00:00:00 2001 From: Williham Williham Totland Date: Fri, 25 Sep 2020 14:23:07 +0200 Subject: [PATCH] Extracts access that depend only on `record` to the outer loop. --- .../EclipseState/Schedule/KeywordHandlers.cpp | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp index f6b100db0..315e8ef59 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/KeywordHandlers.cpp @@ -312,23 +312,39 @@ namespace { for (const auto& record : handlerContext.keyword) { const std::string& groupNamePattern = record.getItem("GROUP").getTrimmedString(0); const auto group_names = this->groupNames(groupNamePattern); - if (group_names.empty()) invalidNamePattern(groupNamePattern, handlerContext.currentStep, parseContext, errors, handlerContext.keyword); - for (const auto& group_name : group_names){ - Group::ProductionCMode controlMode = Group::ProductionCModeFromString( record.getItem("CONTROL_MODE").getTrimmedString(0) ); - Group::ExceedAction exceedAction = Group::ExceedActionFromString(record.getItem("EXCEED_PROC").getTrimmedString(0) ); - auto oil_target = record.getItem("OIL_TARGET").get(0); - auto gas_target = record.getItem("GAS_TARGET").get(0); - auto water_target = record.getItem("WATER_TARGET").get(0); - auto liquid_target = record.getItem("LIQUID_TARGET").get(0); + const Group::ProductionCMode controlMode = Group::ProductionCModeFromString(record.getItem("CONTROL_MODE").getTrimmedString(0)); + const Group::ExceedAction exceedAction = Group::ExceedActionFromString(record.getItem("EXCEED_PROC").getTrimmedString(0)); + + const bool respond_to_parent = DeckItem::to_bool(record.getItem("RESPOND_TO_PARENT").getTrimmedString(0)); + + const auto oil_target = record.getItem("OIL_TARGET").get(0); + const auto gas_target = record.getItem("GAS_TARGET").get(0); + const auto water_target = record.getItem("WATER_TARGET").get(0); + const auto liquid_target = record.getItem("LIQUID_TARGET").get(0); + const auto resv_target = record.getItem("RESERVOIR_FLUID_TARGET").getSIDouble(0); + + const bool apply_default_oil_target = record.getItem("OIL_TARGET").defaultApplied(0); + const bool apply_default_gas_target = record.getItem("GAS_TARGET").defaultApplied(0); + const bool apply_default_water_target = record.getItem("WATER_TARGET").defaultApplied(0); + const bool apply_default_liquid_target = record.getItem("LIQUID_TARGET").defaultApplied(0); + const bool apply_default_resv_target = record.getItem("RESERVOIR_FLUID_TARGET").defaultApplied(0); + + const std::optional guide_rate_str = record.getItem("GUIDE_RATE_DEF").hasValue(0) + ? std::optional(record.getItem("GUIDE_RATE_DEF").getTrimmedString(0)) + : std::nullopt; + + 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::GuideRateTarget::NO_GUIDE_RATE; double guide_rate = 0; - if (group_name != "FIELD") { - if (record.getItem("GUIDE_RATE_DEF").hasValue(0)) { - std::string guide_rate_str = record.getItem("GUIDE_RATE_DEF").getTrimmedString(0); - guide_rate_def = Group::GuideRateTargetFromString( guide_rate_str ); + if (!is_field) { + if (guide_rate_str) { + guide_rate_def = Group::GuideRateTargetFromString(guide_rate_str.value()); if ((guide_rate_def == Group::GuideRateTarget::INJV || guide_rate_def == Group::GuideRateTarget::POTN || @@ -342,12 +358,10 @@ namespace { } } } - bool availableForGroupControl = DeckItem::to_bool(record.getItem("RESPOND_TO_PARENT").getTrimmedString(0)) && (group_name != "FIELD"); { auto group_ptr = std::make_shared(this->getGroup(group_name, handlerContext.currentStep)); Group::GroupProductionProperties production(group_name); - auto resv_target = record.getItem("RESERVOIR_FLUID_TARGET").getSIDouble(0); production.cmode = controlMode; production.oil_target = oil_target; production.gas_target = gas_target; @@ -368,19 +382,19 @@ namespace { production.production_controls = 0; - if (!record.getItem("OIL_TARGET").defaultApplied(0)) + if (!apply_default_oil_target) production.production_controls += static_cast(Group::ProductionCMode::ORAT); - if (!record.getItem("GAS_TARGET").defaultApplied(0)) + if (!apply_default_gas_target) production.production_controls += static_cast(Group::ProductionCMode::GRAT); - if (!record.getItem("WATER_TARGET").defaultApplied(0)) + if (!apply_default_water_target) production.production_controls += static_cast(Group::ProductionCMode::WRAT); - if (!record.getItem("LIQUID_TARGET").defaultApplied(0)) + if (!apply_default_liquid_target) production.production_controls += static_cast(Group::ProductionCMode::LRAT); - if (!record.getItem("RESERVOIR_FLUID_TARGET").defaultApplied(0)) + if (!apply_default_resv_target) production.production_controls += static_cast(Group::ProductionCMode::RESV); if (group_ptr->updateProduction(production)) {