Sort segments
This commit is contained in:
parent
aa6128c4be
commit
ad5b410940
@ -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;
|
||||
|
@ -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<Segment::SegmentType>(iseg[VI::ISeg::SegmentType])),
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2985,9 +2985,19 @@ void Schedule::load_rst(const RestartIO::RstState& rst_state, const EclipseGrid&
|
||||
|
||||
if (!segments.empty()) {
|
||||
std::vector<Segment> 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<Opm::WellSegments> well_segments = std::make_shared<Opm::WellSegments>(comp_pressure_drop, segments_list);
|
||||
well.updateSegments( std::move(well_segments) );
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user