include group controls for zero rate target checking

This commit is contained in:
Stein Krogstad 2024-02-28 15:38:19 +01:00 committed by Arne Morten Kvarving
parent 9841c5d21c
commit 2db90a92e7
3 changed files with 76 additions and 1 deletions

View File

@ -2366,8 +2366,11 @@ namespace Opm
const bool allow_open = this->well_ecl_.getStatus() == WellStatus::OPEN &&
well_state.well(this->index_of_well_).status == WellStatus::OPEN;
// don't allow switcing for wells under zero rate target or requested fixed status and control
const bool allow_switching = !this->wellUnderZeroRateTarget(summary_state, well_state) &&
//const bool allow_switching = !this->wellUnderZeroRateTarget(summary_state, well_state) &&
// (!fixed_control || !fixed_status) && allow_open;
const bool allow_switching = !this->wellUnderZeroRateTargetVersion(simulator, well_state, deferred_logger) &&
(!fixed_control || !fixed_status) && allow_open;
bool changed = false;
bool final_check = false;
// well needs to be set operable or else solving/updating of re-opened wells is skipped

View File

@ -225,6 +225,14 @@ public:
std::vector<Scalar>& well_flux,
DeferredLogger& deferred_logger) const = 0;
bool wellUnderZeroRateTargetVersion(const Simulator& simulator,
const WellState<Scalar>& well_state,
DeferredLogger& deferred_logger) const;
bool stoppedOrZeroRateTargetVersion(const Simulator& simulator,
const WellState<Scalar>& well_state,
DeferredLogger& deferred_logger) const;
bool updateWellStateWithTHPTargetProd(const Simulator& simulator,
WellState<Scalar>& well_state,
DeferredLogger& deferred_logger) const;

View File

@ -1427,6 +1427,70 @@ namespace Opm
}
}
template<typename TypeTag>
bool
WellInterface<TypeTag>::
wellUnderZeroRateTargetVersion(const Simulator& simulator,
const WellState<Scalar>& well_state,
DeferredLogger& deferred_logger) const
{
// Extended version of WellInterfaceGeneric::wellUnderZeroRateTarget that also checks group controls
const auto& ws = well_state.well(this->index_of_well_);
const auto& summaryState = simulator.vanguard().summaryState();
const bool isGroupControlled = (this->isInjector() && ws.injection_cmode == Well::InjectorCMode::GRUP) ||
(this->isProducer() && ws.production_cmode == Well::ProducerCMode::GRUP);
if (!isGroupControlled) {
// well is not under group control, check "light-weight" version
return this->wellUnderZeroRateTarget(summaryState, well_state);
} else {
const auto& well = this->well_ecl_;
const auto& schedule = simulator.vanguard().schedule();
const auto& group_state = simulator.problem().wellModel().groupState();
const auto& group = schedule.getGroup(well.groupName(), this->currentStep());
const Scalar efficiencyFactor = well.getEfficiencyFactor();
if (this->isInjector()) {
// Check injector under group control
const auto& controls = well.injectionControls(summaryState);
std::optional<Scalar> target = this->getGroupInjectionTargetRate(group,
well_state,
group_state,
schedule,
summaryState,
controls.injector_type,
efficiencyFactor,
deferred_logger);
if (target.has_value()) {
return target.value() == 0.0;
} else {
return false;
}
} else {
// Check producer under group control
Scalar scale = this->getGroupProductionTargetRate(group,
well_state,
group_state,
schedule,
summaryState,
efficiencyFactor,
deferred_logger);
return scale == 0.0;
}
}
}
template<typename TypeTag>
bool
WellInterface<TypeTag>::
stoppedOrZeroRateTargetVersion(const Simulator& simulator,
const WellState<Scalar>& well_state,
DeferredLogger& deferred_logger) const
{
// Extended version of WellInterfaceGeneric::stopppedOrZeroRateTarget that also checks group controls
return (this->wellIsStopped() || wellUnderZeroRateTargetVersion(simulator,
well_state,
deferred_logger));
}
template<typename TypeTag>
std::vector<typename WellInterface<TypeTag>::Scalar>
WellInterface<TypeTag>::