diff --git a/opm/parser/eclipse/EclipseState/Runspec.hpp b/opm/parser/eclipse/EclipseState/Runspec.hpp index 6ee353a7b..1b686f4ee 100644 --- a/opm/parser/eclipse/EclipseState/Runspec.hpp +++ b/opm/parser/eclipse/EclipseState/Runspec.hpp @@ -34,6 +34,7 @@ enum class Phase { GAS = 1, WATER = 2, SOLVENT = 3, + POLYMER = 4, }; Phase get_phase( const std::string& ); @@ -42,12 +43,12 @@ std::ostream& operator<<( std::ostream&, const Phase& ); class Phases { public: Phases() noexcept = default; - Phases( bool oil, bool gas, bool wat, bool solvent = false ) noexcept; + Phases( bool oil, bool gas, bool wat, bool solvent = false, bool polymer = false ) noexcept; bool active( Phase ) const noexcept; size_t size() const noexcept; private: - std::bitset< 4 > bits; + std::bitset< 5 > bits; }; diff --git a/src/opm/parser/eclipse/EclipseState/Runspec.cpp b/src/opm/parser/eclipse/EclipseState/Runspec.cpp index ff5544b49..c40217ff3 100644 --- a/src/opm/parser/eclipse/EclipseState/Runspec.cpp +++ b/src/opm/parser/eclipse/EclipseState/Runspec.cpp @@ -32,6 +32,7 @@ Phase get_phase( const std::string& str ) { if( str == "WAT" ) return Phase::WATER; if( str == "WATER" ) return Phase::WATER; if( str == "SOLVENT" ) return Phase::SOLVENT; + if( str == "POLYMER" ) return Phase::POLYMER; throw std::invalid_argument( "Unknown phase '" + str + "'" ); } @@ -42,6 +43,8 @@ std::ostream& operator<<( std::ostream& stream, const Phase& p ) { case Phase::GAS: return stream << "GAS"; case Phase::WATER: return stream << "WATER"; case Phase::SOLVENT: return stream << "SOLVENT"; + case Phase::POLYMER: return stream << "POLYMER"; + } return stream; @@ -49,11 +52,13 @@ std::ostream& operator<<( std::ostream& stream, const Phase& p ) { using un = std::underlying_type< Phase >::type; -Phases::Phases( bool oil, bool gas, bool wat, bool sol ) noexcept : - bits( (oil ? (1 << static_cast< un >( Phase::OIL ) ) : 0) | - (gas ? (1 << static_cast< un >( Phase::GAS ) ) : 0) | - (wat ? (1 << static_cast< un >( Phase::WATER ) ) : 0) | - (sol ? (1 << static_cast< un >( Phase::SOLVENT) ) : 0) ) +Phases::Phases( bool oil, bool gas, bool wat, bool sol, bool pol ) noexcept : + bits( (oil ? (1 << static_cast< un >( Phase::OIL ) ) : 0) | + (gas ? (1 << static_cast< un >( Phase::GAS ) ) : 0) | + (wat ? (1 << static_cast< un >( Phase::WATER ) ) : 0) | + (sol ? (1 << static_cast< un >( Phase::SOLVENT ) ) : 0) | + (pol ? (1 << static_cast< un >( Phase::POLYMER ) ) : 0) ) + {} bool Phases::active( Phase p ) const noexcept { @@ -69,6 +74,7 @@ Runspec::Runspec( const Deck& deck ) : deck.hasKeyword( "GAS" ), deck.hasKeyword( "WATER" ), deck.hasKeyword( "SOLVENT" ), + deck.hasKeyword( "POLYMER" ) } ), m_tabdims( deck ), endscale( deck ) diff --git a/src/opm/parser/eclipse/EclipseState/Schedule/Well.cpp b/src/opm/parser/eclipse/EclipseState/Schedule/Well.cpp index 277470490..b04006466 100644 --- a/src/opm/parser/eclipse/EclipseState/Schedule/Well.cpp +++ b/src/opm/parser/eclipse/EclipseState/Schedule/Well.cpp @@ -113,6 +113,8 @@ namespace Opm { case Phase::GAS: return p.GasRate; case Phase::SOLVENT: throw std::invalid_argument( "Production of 'SOLVENT' requested." ); + case Phase::POLYMER: + throw std::invalid_argument( "Production of 'POLYMER' requested." ); } throw std::logic_error( "Unreachable state. Invalid Phase value. " diff --git a/tests/parser/RunspecTests.cpp b/tests/parser/RunspecTests.cpp index 5cc6eed63..d64691618 100644 --- a/tests/parser/RunspecTests.cpp +++ b/tests/parser/RunspecTests.cpp @@ -286,3 +286,54 @@ BOOST_AUTO_TEST_CASE( SWATINIT ) { BOOST_CHECK( !endscale.irreversible() ); } + + +BOOST_AUTO_TEST_CASE(Solvent) { + const std::string input = R"( + RUNSPEC + OIL + GAS + WATER + SOLVENT + )"; + + Parser parser; + ParseContext parseContext; + + auto deck = parser.parseString(input, parseContext); + + Runspec runspec( deck ); + const auto& phases = runspec.phases(); + BOOST_CHECK_EQUAL( 4, phases.size() ); + BOOST_CHECK( phases.active( Phase::OIL ) ); + BOOST_CHECK( phases.active( Phase::GAS ) ); + BOOST_CHECK( phases.active( Phase::WATER ) ); + BOOST_CHECK( phases.active( Phase::SOLVENT ) ); + + +} + +BOOST_AUTO_TEST_CASE(Polymer) { + const std::string input = R"( + RUNSPEC + OIL + GAS + WATER + POLYMER + )"; + + Parser parser; + ParseContext parseContext; + + auto deck = parser.parseString(input, parseContext); + + Runspec runspec( deck ); + const auto& phases = runspec.phases(); + BOOST_CHECK_EQUAL( 4, phases.size() ); + BOOST_CHECK( phases.active( Phase::OIL ) ); + BOOST_CHECK( phases.active( Phase::GAS ) ); + BOOST_CHECK( phases.active( Phase::WATER ) ); + BOOST_CHECK( phases.active( Phase::POLYMER ) ); + + +}