diff --git a/opm/io/eclipse/rst/segment.hpp b/opm/io/eclipse/rst/segment.hpp index 5ddcfd3b9..ba827b668 100644 --- a/opm/io/eclipse/rst/segment.hpp +++ b/opm/io/eclipse/rst/segment.hpp @@ -30,7 +30,7 @@ class UnitSystem; namespace RestartIO { struct RstSegment { - RstSegment(const ::Opm::UnitSystem& unit_system, const int* iseg, const double * rseg); + RstSegment(const ::Opm::UnitSystem& unit_system, int segment_number, const int* iseg, const double * rseg); int segment; int outlet_segment; diff --git a/src/opm/io/eclipse/rst/segment.cpp b/src/opm/io/eclipse/rst/segment.cpp index 0f995319f..cf70677f2 100644 --- a/src/opm/io/eclipse/rst/segment.cpp +++ b/src/opm/io/eclipse/rst/segment.cpp @@ -50,8 +50,8 @@ double area_to_si(const UnitSystem& unit_system, double raw_value) { } -RstSegment::RstSegment(const ::Opm::UnitSystem& unit_system, const int * iseg, const double * rseg) : - segment( iseg[VI::ISeg::SegNo]), +RstSegment::RstSegment(const ::Opm::UnitSystem& unit_system, int segment_number, const int * iseg, const double * rseg) : + segment( segment_number), outlet_segment( iseg[VI::ISeg::OutSeg]), branch( iseg[VI::ISeg::BranchNo]), segment_type( from_ecl(iseg[VI::ISeg::SegmentType])), diff --git a/src/opm/io/eclipse/rst/well.cpp b/src/opm/io/eclipse/rst/well.cpp index fbf87d845..5837f9145 100644 --- a/src/opm/io/eclipse/rst/well.cpp +++ b/src/opm/io/eclipse/rst/well.cpp @@ -135,10 +135,11 @@ RstWell::RstWell(const ::Opm::UnitSystem& unit_system, for (int is=0; is < header.nsegmx; is++) { std::size_t iseg_offset = header.nisegz * (is + (this->msw_index - 1) * header.nsegmx); std::size_t rseg_offset = header.nrsegz * (is + (this->msw_index - 1) * header.nsegmx); - auto segment_number = iseg[iseg_offset + VI::ISeg::SegNo]; - if (segment_number != 0) { + auto other_segment_number = iseg[iseg_offset + VI::ISeg::SegNo]; + if (other_segment_number != 0) { + auto segment_number = is + 1; segment_map.insert({segment_number, this->segments.size()}); - this->segments.emplace_back( unit_system, iseg.data() + iseg_offset, rseg.data() + rseg_offset); + this->segments.emplace_back( unit_system, segment_number, iseg.data() + iseg_offset, rseg.data() + rseg_offset); } } diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp index ddffd7f84..7de5e26d0 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Schedule.cpp @@ -2985,9 +2985,19 @@ void Schedule::load_rst(const RestartIO::RstState& rst_state, const EclipseGrid& if (!segments.empty()) { std::vector segments_list; + /* + The ordering of the segments in the WellSegments structure seems a + bit random; in some parts of the code the segment_number seems to + be treated like a random integer ID, whereas in other parts it + seems to be treated like a running index. Here the segments in + WellSegments are sorted according to the segment number - observe + that this is somewhat important because the first top segment is + treated differently from the other segment. + */ for (const auto& segment_pair : segments) segments_list.push_back( std::move(segment_pair.second) ); + std::sort( segments_list.begin(), segments_list.end(),[](const Segment& seg1, const Segment& seg2) { return seg1.segmentNumber() < seg2.segmentNumber(); } ); auto comp_pressure_drop = WellSegments::CompPressureDrop::HFA; std::shared_ptr well_segments = std::make_shared(comp_pressure_drop, segments_list); well.updateSegments( std::move(well_segments) ); diff --git a/tests/test_AggregateMSWData.cpp b/tests/test_AggregateMSWData.cpp index 6501ad2d4..b6e958d6e 100644 --- a/tests/test_AggregateMSWData.cpp +++ b/tests/test_AggregateMSWData.cpp @@ -845,7 +845,7 @@ BOOST_AUTO_TEST_CASE(MSW_RST) { ); const auto& iseg = amswd.getISeg(); const auto& rseg = amswd.getRSeg(); - auto segment = Opm::RestartIO::RstSegment(simCase.es.getUnits(), iseg.data(), rseg.data()); + auto segment = Opm::RestartIO::RstSegment(simCase.es.getUnits(), 1, iseg.data(), rseg.data()); }