Merge pull request #3983 from blattms/fix-perf-all-zero

[bugfix] Fixes deadlocks with agressively distributed wells
This commit is contained in:
Markus Blatt 2022-07-29 09:37:10 +02:00 committed by GitHub
commit af28030123
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 5 deletions

View File

@ -1596,12 +1596,17 @@ namespace Opm
// approximate the perforation mixture using the mobility ratio
// and weight the perforations using the well transmissibility.
bool all_zero = std::all_of(perfRates.begin(), perfRates.end(), [](double val) { return val == 0.0; });
const auto& comm = this->parallel_well_info_.communication();
if (comm.size() > 1)
{
all_zero = (comm.min(all_zero ? 1 : 0) == 1);
}
if ( all_zero && this->isProducer() ) {
double total_tw = 0;
for (int perf = 0; perf < nperf; ++perf) {
total_tw += this->well_index_[perf];
}
const auto& comm = this->parallel_well_info_.communication();
if (comm.size() > 1)
{
total_tw = comm.sum(total_tw);

View File

@ -63,9 +63,10 @@ void WellState::initSingleProducer(const Well& well,
const double temp = 273.15 + 15.56;
auto& ws = this->wells_.add(well.name(), SingleWellState{well.name(), well_info, true, pressure_first_connection, well_perf_data, pu, temp});
if ( ws.perf_data.empty())
return;
// the rest of the code needs to executed even if ws.perf_data is empty
// as this does not say anything for the whole well if it is distributed.
// Hence never ever return here!
if (well.getStatus() == Well::Status::OPEN) {
ws.status = Well::Status::OPEN;
}
@ -85,9 +86,10 @@ void WellState::initSingleInjector(const Well& well,
const double temp = inj_controls.temperature;
auto& ws = this->wells_.add(well.name(), SingleWellState{well.name(), well_info, false, pressure_first_connection, well_perf_data, pu, temp});
if ( ws.perf_data.empty())
return;
// the rest of the code needs to executed even if ws.perf_data is empty
// as this does not say anything for the whole well if it is distributed.
// Hence never ever return here!
if (well.getStatus() == Well::Status::OPEN) {
ws.status = Well::Status::OPEN;
}