From 8cde90fbd0cd41cafd6fe8667b1fcd2544bb3768 Mon Sep 17 00:00:00 2001 From: Markus Blatt Date: Fri, 16 Dec 2022 09:58:35 +0100 Subject: [PATCH] [bugfix,mswell] Throw for connections not attached to segments. If there are connections of a multisegment well that are not connected to any segment, we throw with a meaningful error message instead of a silent segmentation fault. In that case an invalid segment index of zero would be returned. The corresponding storage index returned by segmentToNumberIndex ould become -1. This previously lead to segmentation faults when using it to index a container. --- opm/simulators/wells/MultisegmentWellGeneric.cpp | 9 +++++++++ opm/simulators/wells/WellState.cpp | 8 ++++++++ 2 files changed, 17 insertions(+) diff --git a/opm/simulators/wells/MultisegmentWellGeneric.cpp b/opm/simulators/wells/MultisegmentWellGeneric.cpp index a6e675590..ed06bd42f 100644 --- a/opm/simulators/wells/MultisegmentWellGeneric.cpp +++ b/opm/simulators/wells/MultisegmentWellGeneric.cpp @@ -37,6 +37,8 @@ #include #include +#include + namespace Opm { @@ -65,6 +67,13 @@ MultisegmentWellGeneric(WellInterfaceGeneric& baseif) const Connection& connection = completion_set.get(perf); if (connection.state() == Connection::State::OPEN) { const int segment_index = segmentNumberToIndex(connection.segment()); + if ( segment_index == -1) { + OPM_THROW(std::logic_error, + fmt::format("COMPSEGS: Well {} has connection in cell {}, {}, {} " + "without associated segment.", baseif_.wellEcl().name(), + connection.getI() + 1, connection.getJ() + 1, + connection.getK() + 1)); + } segment_perforations_[segment_index].push_back(i_perf_wells); baseif.perfDepth()[i_perf_wells] = connection.depth(); const double segment_depth = segmentSet()[segment_index].depth(); diff --git a/opm/simulators/wells/WellState.cpp b/opm/simulators/wells/WellState.cpp index ea0075008..a779ccba3 100644 --- a/opm/simulators/wells/WellState.cpp +++ b/opm/simulators/wells/WellState.cpp @@ -627,6 +627,14 @@ void WellState::initWellStateMSWell(const std::vector& wells_ecl, const Connection& connection = completion_set.get(perf); if (connection.state() == Connection::State::OPEN) { const int segment_index = segment_set.segmentNumberToIndex(connection.segment()); + if ( segment_index == -1) { + OPM_THROW(std::logic_error, + fmt::format("COMPSEGS: Well {} has connection in cell {}, {}, {} " + "without associated segment.", well_ecl.name(), + connection.getI() + 1 , connection.getJ() + 1, + connection.getK() + 1 )); + } + segment_perforations[segment_index].push_back(n_activeperf); n_activeperf++; }