Inetrnalize segment type in proper enum

This commit is contained in:
Joakim Hove 2020-02-12 14:16:52 +01:00
parent f80160e6c0
commit e2b58cecda
4 changed files with 53 additions and 2 deletions

View File

@ -21,6 +21,7 @@
#include <vector>
#include <opm/parser/eclipse/EclipseState/Schedule/MSW/Segment.hpp>
namespace Opm {
namespace RestartIO {
@ -30,7 +31,7 @@ struct RstSegment {
int segment;
int outlet_segment;
int branch;
int segment_type;
Segment::SegmentType segment_type;
int icd_scaling_mode;
int icd_open_flag;

View File

@ -36,6 +36,7 @@ namespace Opm {
enum class SegmentType {
REGULAR,
SICD,
AICD, // Not really supported - just included to complete the enum
VALVE,
};
@ -64,6 +65,8 @@ namespace Opm {
bool dataReady() const;
SegmentType segmentType() const;
int ecl_type_id() const;
void setVolume(const double volume_in);
void setDepthAndLength(const double depth_in, const double length_in);
@ -72,6 +75,7 @@ namespace Opm {
void addInletSegment(const int segment_number);
static double invalidValue();
static SegmentType type_from_int(int ecl_id);
bool operator==( const Segment& ) const;
bool operator!=( const Segment& ) const;

View File

@ -22,14 +22,29 @@
namespace VI = ::Opm::RestartIO::Helpers::VectorItems;
namespace Opm {
namespace {
template <typename T>
T from_ecl(int ecl_value);
template <>
Segment::SegmentType from_ecl(int int_type) {
return Segment::type_from_int(int_type);
}
}
namespace RestartIO {
RstSegment::RstSegment(const int * iseg, const double * rseg) :
segment(iseg[VI::ISeg::SegNo]),
outlet_segment(iseg[VI::ISeg::OutSeg]),
branch(iseg[VI::ISeg::BranchNo]),
segment_type(iseg[VI::ISeg::SegmentType]),
segment_type(from_ecl<Segment::SegmentType>(iseg[VI::ISeg::SegmentType])),
icd_scaling_mode(iseg[VI::ISeg::ICDScalingMode]),
icd_open_flag(iseg[VI::ISeg::ICDOpenShutFlag]),
dist_outlet(rseg[VI::RSeg::DistOutlet]),

View File

@ -233,4 +233,35 @@ static constexpr double invalid_value = -1.e100;
return m_valve;
}
int Segment::ecl_type_id() const {
switch (this->m_segment_type) {
case SegmentType::REGULAR:
return -1;
case SegmentType::SICD:
return -7;
case SegmentType::AICD:
return -8;
case SegmentType::VALVE:
return -5;
default:
throw std::invalid_argument("Unhanedled segment type");
}
}
Segment::SegmentType Segment::type_from_int(int ecl_id) {
switch(ecl_id) {
case -1:
return SegmentType::REGULAR;
case -7:
return SegmentType::SICD;
case -8:
return SegmentType::AICD;
case -5:
return SegmentType::VALVE;
default:
throw std::invalid_argument("Unhanedled segment type");
}
}
}