Shut production well if zero rate and disallowing crossflow.

This commit is contained in:
Atgeirr Flø Rasmussen 2019-12-13 11:08:36 +01:00
parent a89e8f6457
commit f09dcda21c

View File

@ -636,6 +636,8 @@ namespace Opm {
{
std::vector<WellInterfacePtr> well_container;
Opm::DeferredLogger local_deferredLogger;
const int nw = numLocalWells();
if (nw > 0) {
@ -684,6 +686,40 @@ namespace Opm {
continue;
}
// If a production well disallows crossflow and its
// (prediction type) rate control is zero, then it is effectively shut.
if (!well_ecl.getAllowCrossFlow() && well_ecl.isProducer() && well_ecl.predictionMode()) {
const auto& summaryState = ebosSimulator_.vanguard().summaryState();
auto prod_controls = well_ecl.productionControls(summaryState);
bool zero_rate_control = false;
switch (prod_controls.cmode) {
case Well::ProducerCMode::ORAT:
zero_rate_control = (prod_controls.oil_rate == 0.0);
break;
case Well::ProducerCMode::WRAT:
zero_rate_control = (prod_controls.water_rate == 0.0);
break;
case Well::ProducerCMode::GRAT:
zero_rate_control = (prod_controls.gas_rate == 0.0);
break;
case Well::ProducerCMode::LRAT:
zero_rate_control = (prod_controls.liquid_rate == 0.0);
break;
case Well::ProducerCMode::RESV:
zero_rate_control = (prod_controls.resv_rate == 0.0);
break;
default:
// Might still have zero rate controls, but is pressure controlled.
zero_rate_control = false;
}
if (zero_rate_control) {
// Treat as shut, do not add to container.
local_deferredLogger.info(" Well shut due to zero rate control and disallowing crossflow: " + well_ecl.name());
well_state_.shutWell(w);
continue;
}
}
if (well_status == Well::Status::STOP) {
well_state_.thp()[w] = 0.;
wellIsStopped = true;
@ -721,6 +757,12 @@ namespace Opm {
}
}
// Collect log messages and print.
Opm::DeferredLogger global_deferredLogger = gatherDeferredLogger(local_deferredLogger);
if (terminal_output_) {
global_deferredLogger.logMessages();
}
return well_container;
}