From da50b320fafd384bf615f2844da28ee198aaffbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Atgeirr=20Fl=C3=B8=20Rasmussen?= Date: Mon, 25 Aug 2014 11:15:39 +0200 Subject: [PATCH] Add MINPV features to EclipseGrid class. --- .../eclipse/EclipseState/Grid/EclipseGrid.cpp | 32 +++++++-- .../eclipse/EclipseState/Grid/EclipseGrid.hpp | 4 ++ .../Grid/tests/EclipseGridTests.cpp | 70 ++++++++++++++++++- 3 files changed, 101 insertions(+), 5 deletions(-) diff --git a/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.cpp b/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.cpp index 8035c6790..9c6df7aed 100644 --- a/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.cpp +++ b/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.cpp @@ -30,7 +30,7 @@ #include namespace Opm { - const double invalidThickness = -1e100; + const double invalidValue = -1e100; /** Will create an EclipseGrid instance based on an existing @@ -38,7 +38,9 @@ namespace Opm { */ EclipseGrid::EclipseGrid(const std::string& filename ) : m_pinchActive(false), - m_pinchThresholdThickness(invalidThickness) + m_pinchThresholdThickness(invalidValue), + m_minpvActive(false), + m_minpvValue(invalidValue) { ecl_grid_type * new_ptr = ecl_grid_load_case( filename.c_str() ); if (new_ptr) @@ -49,7 +51,9 @@ namespace Opm { EclipseGrid::EclipseGrid(const ecl_grid_type * src_ptr) : m_pinchActive(false), - m_pinchThresholdThickness(invalidThickness) + m_pinchThresholdThickness(invalidValue), + m_minpvActive(false), + m_minpvValue(invalidValue) { m_grid.reset( ecl_grid_alloc_copy( src_ptr ) , ecl_grid_free ); } @@ -71,7 +75,9 @@ namespace Opm { EclipseGrid::EclipseGrid(std::shared_ptr deck) : m_pinchActive(false), - m_pinchThresholdThickness(invalidThickness) + m_pinchThresholdThickness(invalidValue), + m_minpvActive(false), + m_minpvValue(invalidValue) { const bool hasRUNSPEC = Section::hasRUNSPEC(deck); const bool hasGRID = Section::hasGRID(deck); @@ -124,6 +130,10 @@ namespace Opm { m_pinchActive = true; m_pinchThresholdThickness = deck->getKeyword("PINCH")->getRecord(0)->getItem("THRESHOLD_THICKNESS")->getSIDouble(0); } + if (deck->hasKeyword("MINPV")) { + m_minpvActive = true; + m_minpvValue = deck->getKeyword("MINPV")->getRecord(0)->getItem("MINPV")->getSIDouble(0); + } } @@ -131,6 +141,8 @@ namespace Opm { bool EclipseGrid::equal(const EclipseGrid& other) const { return (m_pinchActive == other.m_pinchActive) && (m_pinchThresholdThickness == other.m_pinchThresholdThickness) + && (m_minpvActive == other.m_minpvActive) + && (m_minpvValue == other.m_minpvValue) && ecl_grid_compare( m_grid.get() , other.m_grid.get() , true , false , false ); } @@ -167,6 +179,18 @@ namespace Opm { } } + bool EclipseGrid::isMinpvActive( ) const { + return m_minpvActive; + } + + double EclipseGrid::getMinpvValue( ) const { + if (isMinpvActive()) { + return m_minpvValue; + } else { + throw std::logic_error("cannot call getMinpvValue() when isMinpvActive() is false"); + } + } + void EclipseGrid::assertGlobalIndex(size_t globalIndex) const { if (globalIndex >= getCartesianSize()) throw std::invalid_argument("input index above valid range"); diff --git a/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp b/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp index d8246e6ca..e52a678b2 100644 --- a/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp +++ b/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.hpp @@ -45,6 +45,8 @@ namespace Opm { size_t getCartesianSize( ) const; bool isPinchActive( ) const; double getPinchThresholdThickness( ) const; + bool isMinpvActive( ) const; + double getMinpvValue( ) const; void assertGlobalIndex(size_t globalIndex) const; void assertIJK(size_t i , size_t j , size_t k) const; @@ -65,6 +67,8 @@ namespace Opm { std::shared_ptr m_grid; bool m_pinchActive; double m_pinchThresholdThickness; + bool m_minpvActive; + double m_minpvValue; void initCartesianGrid(const std::vector& dims , DeckConstPtr deck); void initCornerPointGrid(const std::vector& dims , DeckConstPtr deck); diff --git a/opm/parser/eclipse/EclipseState/Grid/tests/EclipseGridTests.cpp b/opm/parser/eclipse/EclipseState/Grid/tests/EclipseGridTests.cpp index 37d079daa..5717145bd 100644 --- a/opm/parser/eclipse/EclipseState/Grid/tests/EclipseGridTests.cpp +++ b/opm/parser/eclipse/EclipseState/Grid/tests/EclipseGridTests.cpp @@ -116,6 +116,52 @@ static Opm::DeckPtr createPinchedCPDeck() { } +static Opm::DeckPtr createMinpvDefaultCPDeck() { + const char *deckData = + "RUNSPEC\n" + "\n" + "DIMENS\n" + " 10 10 10 /\n" + "GRID\n" + "COORD\n" + " 726*1 / \n" + "ZCORN \n" + " 8000*1 / \n" + "ACTNUM \n" + " 1000*1 / \n" + "MINPV \n" + " / \n" + "EDIT\n" + "\n"; + + Opm::ParserPtr parser(new Opm::Parser()); + return parser->parseString(deckData) ; +} + + +static Opm::DeckPtr createMinpvCPDeck() { + const char *deckData = + "RUNSPEC\n" + "\n" + "DIMENS\n" + " 10 10 10 /\n" + "GRID\n" + "COORD\n" + " 726*1 / \n" + "ZCORN \n" + " 8000*1 / \n" + "ACTNUM \n" + " 1000*1 / \n" + "MINPV \n" + " 10 / \n" + "EDIT\n" + "\n"; + + Opm::ParserPtr parser(new Opm::Parser()); + return parser->parseString(deckData) ; +} + + static Opm::DeckPtr createCARTDeck() { const char *deckData = "RUNSPEC\n" @@ -627,5 +673,27 @@ BOOST_AUTO_TEST_CASE(ConstructorNORUNSPEC_PINCH) { BOOST_CHECK_THROW(grid1.getPinchThresholdThickness(), std::logic_error); BOOST_CHECK(grid2.isPinchActive()); BOOST_CHECK_EQUAL(grid2.getPinchThresholdThickness(), 0.2); - +} + + + + +BOOST_AUTO_TEST_CASE(ConstructorMINPV) { + Opm::DeckConstPtr deck1 = createCPDeck(); + Opm::DeckConstPtr deck2 = createMinpvDefaultCPDeck(); + Opm::DeckConstPtr deck3 = createMinpvCPDeck(); + + Opm::EclipseGrid grid1(deck1); + Opm::EclipseGrid grid2(deck2); + Opm::EclipseGrid grid3(deck3); + + BOOST_CHECK(!grid1.equal( grid2 )); + BOOST_CHECK(!grid1.equal( grid3 )); + BOOST_CHECK(!grid2.equal( grid3 )); + BOOST_CHECK(!grid1.isMinpvActive()); + BOOST_CHECK_THROW(grid1.getMinpvValue(), std::logic_error); + BOOST_CHECK(grid2.isMinpvActive()); + BOOST_CHECK_EQUAL(grid2.getMinpvValue(), 1e-6); + BOOST_CHECK(grid3.isMinpvActive()); + BOOST_CHECK_EQUAL(grid3.getMinpvValue(), 10.0); }