Merge pull request #2276 from totto82/fixREIN

Fix REIN for multi level groups by passing the top phase
This commit is contained in:
Atgeirr Flø Rasmussen 2020-01-20 09:55:27 +01:00 committed by GitHub
commit f003d37dba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 9 deletions

View File

@ -1954,7 +1954,9 @@ namespace Opm {
well_state.setCurrentProductionGroupControl(group.name(), newControl);
ss << "Switching control mode for group "<< group.name() << " to " << Group::ProductionCMode2String(newControl);
}
wellGroupHelpers::setGroupControl(group, schedule(), reportStepIdx, false, well_state, ss);
// Pass a dummy phase for producer groups. The topUpPhase is only relevant for injector groups
const Phase topUpPhase = Phase::WATER;
wellGroupHelpers::setGroupControl(group, schedule(), topUpPhase, reportStepIdx, false, well_state, ss);
break;
}
default:
@ -1991,7 +1993,9 @@ namespace Opm {
}
well_state.setCurrentInjectionGroupControl(group.name(), newControl);
}
wellGroupHelpers::setGroupControl(group, schedule(), reportStepIdx, /*isInjector*/true, well_state, ss);
const auto& summaryState = ebosSimulator_.vanguard().summaryState();
const Phase& topUpPhase = group.injectionControls(summaryState).phase;
wellGroupHelpers::setGroupControl(group, schedule(), topUpPhase, reportStepIdx, /*isInjector*/true, well_state, ss);
if (!ss.str().empty())
deferred_logger.info(ss.str());

View File

@ -29,16 +29,18 @@ namespace Opm {
namespace wellGroupHelpers
{
inline void setGroupControl(const Group& group, const Schedule& schedule, const int reportStepIdx, const bool injector, WellStateFullyImplicitBlackoil& wellState, std::ostringstream& ss) {
inline void setGroupControl(const Group& group, const Schedule& schedule, const Phase& topUpPhase, const int reportStepIdx, const bool injector, WellStateFullyImplicitBlackoil& wellState, std::ostringstream& ss) {
for (const std::string& groupName : group.groups()) {
const Group& groupTmp = schedule.getGroup(groupName, reportStepIdx);
setGroupControl(groupTmp, schedule, reportStepIdx, injector, wellState, ss);
if (injector)
setGroupControl(groupTmp, schedule, topUpPhase, reportStepIdx, injector, wellState, ss);
if (injector) {
if (groupTmp.injection_phase() == topUpPhase || wellState.currentInjectionGroupControl(groupName) == Group::InjectionCMode::NONE) // only switch sub groups with same phase or NONE
wellState.setCurrentInjectionGroupControl(groupName, Group::InjectionCMode::FLD);
else
} else {
wellState.setCurrentProductionGroupControl(groupName, Group::ProductionCMode::FLD);
}
}
const auto& end = wellState.wellMap().end();
for (const std::string& wellName : group.wells()) {
@ -64,9 +66,21 @@ namespace Opm {
if (wellEcl.isInjector() && injector) {
// only switch if the well phase is the same as the group phase
if (group.injection_phase() != wellEcl.getPreferredPhase())
// Get the current controls.
const Well::InjectorType& injectorType = wellEcl.getInjectionProperties().injectorType;
if (injectorType == Well::InjectorType::WATER && topUpPhase != Phase::WATER)
continue;
if (injectorType == Well::InjectorType::OIL && topUpPhase != Phase::OIL)
continue;
if (injectorType == Well::InjectorType::GAS && topUpPhase != Phase::GAS)
continue;
if (injectorType == Well::InjectorType::MULTI)
throw("Expected WATER, OIL or GAS as type for injectors " + wellEcl.name());
if (wellState.currentInjectionControls()[well_index] != Well::InjectorCMode::GRUP) {
wellState.currentInjectionControls()[well_index] = Well::InjectorCMode::GRUP;
ss <<"\n Injector " << wellName << " switches to GRUP control limit";
@ -102,7 +116,7 @@ namespace Opm {
if (schedule.gConSale(reportStepIdx).has(group.name())) {
wellState.setCurrentInjectionGroupControl(group.name(), Group::InjectionCMode::SALE);
std::ostringstream ss;
setGroupControl(group, schedule, reportStepIdx, /*injector*/true, wellState, ss);
setGroupControl(group, schedule, Phase::GAS, reportStepIdx, /*injector*/true, wellState, ss);
}
}