diff --git a/opm/parser/eclipse/EclipseState/Schedule/Completion.cpp b/opm/parser/eclipse/EclipseState/Schedule/Completion.cpp index 7a5737368..60fc9ee90 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Completion.cpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Completion.cpp @@ -19,20 +19,23 @@ #include #include +#include namespace Opm { - Completion::Completion(int i, int j , int k , CompletionStateEnum state , double CF, double diameter, double skinFactor, const CompletionDirection::DirectionEnum direction) { - m_i = i; - m_j = j; - m_k = k; - - m_state = state; - m_CF = CF; - m_diameter = diameter; - m_skinFactor = skinFactor; - m_direction = direction; - } + Completion::Completion(int i, int j , int k , CompletionStateEnum state , + const Value& CF, + const Value& diameter, + const Value& skinFactor, + const CompletionDirection::DirectionEnum direction) : m_i(i), + m_j(j), + m_k(k), + m_state(state), + m_CF(CF), + m_diameter(diameter), + m_skinFactor(skinFactor), + m_direction(direction) + { } bool Completion::sameCoordinate(const Completion& other) const { @@ -60,15 +63,25 @@ namespace Opm { int K1 = compdatRecord->getItem("K1")->getInt(0) - 1; int K2 = compdatRecord->getItem("K2")->getInt(0) - 1; CompletionStateEnum state = CompletionStateEnumFromString( compdatRecord->getItem("STATE")->getTrimmedString(0) ); + Value CF("CF"); + Value diameter("Diameter"); + Value skinFactor("SkinFactor"); { DeckItemConstPtr CFItem = compdatRecord->getItem("CF"); - if (!CFItem->setInDeck()) - throw std::invalid_argument("The connection factor item can not be defaulted"); + DeckItemConstPtr diameterItem = compdatRecord->getItem("DIAMETER"); + DeckItemConstPtr skinFactorItem = compdatRecord->getItem("SKIN"); + + if (CFItem->hasData()) + CF.setValue( CFItem->getSIDouble(0)); + + if (diameterItem->hasData()) + diameter.setValue( diameterItem->getSIDouble(0)); + + if (skinFactorItem->hasData()) + skinFactor.setValue( skinFactorItem->getRawDouble(0)); } - double CF = compdatRecord->getItem("CF")->getSIDouble(0); - double diameter = compdatRecord->getItem("DIAMETER")->getSIDouble(0); - double skinFactor = compdatRecord->getItem("SKIN")->getRawDouble(0); + const CompletionDirection::DirectionEnum& direction = CompletionDirection::DirectionEnumFromString(compdatRecord->getItem("DIR")->getTrimmedString(0)); for (int k = K1; k <= K2; k++) { @@ -136,15 +149,15 @@ namespace Opm { } double Completion::getCF() const { - return m_CF; + return m_CF.getValue(); } double Completion::getDiameter() const { - return m_diameter; + return m_diameter.getValue(); } double Completion::getSkinFactor() const { - return m_skinFactor; + return m_skinFactor.getValue(); } CompletionDirection::DirectionEnum Completion::getDirection() const { diff --git a/opm/parser/eclipse/EclipseState/Schedule/Completion.hpp b/opm/parser/eclipse/EclipseState/Schedule/Completion.hpp index c93b231ca..cbabd3d64 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/Completion.hpp +++ b/opm/parser/eclipse/EclipseState/Schedule/Completion.hpp @@ -28,13 +28,19 @@ #include #include #include +#include namespace Opm { class Completion { public: - Completion(int i, int j , int k , CompletionStateEnum state , double CF, double diameter, double skinFactor, const CompletionDirection::DirectionEnum direction = CompletionDirection::DirectionEnum::Z); + Completion(int i, int j , int k , CompletionStateEnum state , + const Value& CF, + const Value& diameter, + const Value& skinFactor, + const CompletionDirection::DirectionEnum direction = CompletionDirection::DirectionEnum::Z); + bool sameCoordinate(const Completion& other) const; int getI() const; int getJ() const; @@ -52,7 +58,9 @@ namespace Opm { private: int m_i, m_j, m_k; - double m_CF, m_diameter, m_skinFactor; + Value m_diameter; + Value m_CF; + Value m_skinFactor; CompletionStateEnum m_state; CompletionDirection::DirectionEnum m_direction; }; diff --git a/opm/parser/eclipse/EclipseState/Schedule/tests/CompletionSetTests.cpp b/opm/parser/eclipse/EclipseState/Schedule/tests/CompletionSetTests.cpp index 9219ee619..827ad218d 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/tests/CompletionSetTests.cpp +++ b/opm/parser/eclipse/EclipseState/Schedule/tests/CompletionSetTests.cpp @@ -48,8 +48,8 @@ BOOST_AUTO_TEST_CASE(CreateCompletionSetOK) { BOOST_AUTO_TEST_CASE(AddCompletionSizeCorrect) { Opm::CompletionSet completionSet; - Opm::CompletionConstPtr completion1(new Opm::Completion(10,10,10,Opm::OPEN , 99.88, 22.33, 33.22)); - Opm::CompletionConstPtr completion2(new Opm::Completion(11,10,10,Opm::OPEN , 99.88, 22.33, 33.22)); + Opm::CompletionConstPtr completion1(new Opm::Completion(10,10,10,Opm::OPEN , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); + Opm::CompletionConstPtr completion2(new Opm::Completion(11,10,10,Opm::OPEN , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); completionSet.add( completion1 ); BOOST_CHECK_EQUAL( 1U , completionSet.size() ); @@ -62,8 +62,8 @@ BOOST_AUTO_TEST_CASE(AddCompletionSizeCorrect) { BOOST_AUTO_TEST_CASE(CompletionSetGetOutOfRangeThrows) { Opm::CompletionSet completionSet; - Opm::CompletionConstPtr completion1(new Opm::Completion(10,10,10,Opm::OPEN , 99.88, 22.33, 33.22)); - Opm::CompletionConstPtr completion2(new Opm::Completion(11,10,10,Opm::OPEN , 99.88, 22.33, 33.22)); + Opm::CompletionConstPtr completion1(new Opm::Completion(10,10,10,Opm::OPEN , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); + Opm::CompletionConstPtr completion2(new Opm::Completion(11,10,10,Opm::OPEN , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); completionSet.add( completion1 ); BOOST_CHECK_EQUAL( 1U , completionSet.size() ); @@ -78,8 +78,8 @@ BOOST_AUTO_TEST_CASE(CompletionSetGetOutOfRangeThrows) { BOOST_AUTO_TEST_CASE(AddCompletionSameCellUpdates) { Opm::CompletionSet completionSet; - Opm::CompletionConstPtr completion1(new Opm::Completion(10,10,10,Opm::OPEN , 99.88, 22.33, 33.22)); - Opm::CompletionConstPtr completion2(new Opm::Completion(10,10,10,Opm::SHUT , 99.88, 22.33, 33.22)); + Opm::CompletionConstPtr completion1(new Opm::Completion(10,10,10,Opm::OPEN , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); + Opm::CompletionConstPtr completion2(new Opm::Completion(10,10,10,Opm::SHUT , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); completionSet.add( completion1 ); @@ -94,9 +94,9 @@ BOOST_AUTO_TEST_CASE(AddCompletionSameCellUpdates) { BOOST_AUTO_TEST_CASE(AddCompletionShallowCopy) { Opm::CompletionSet completionSet; - Opm::CompletionConstPtr completion1(new Opm::Completion(10,10,10,Opm::OPEN , 99.88, 22.33, 33.22)); - Opm::CompletionConstPtr completion2(new Opm::Completion(10,10,11,Opm::SHUT , 99.88, 22.33, 33.22)); - Opm::CompletionConstPtr completion3(new Opm::Completion(10,10,12,Opm::SHUT , 99.88, 22.33, 33.22)); + Opm::CompletionConstPtr completion1(new Opm::Completion(10,10,10,Opm::OPEN , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); + Opm::CompletionConstPtr completion2(new Opm::Completion(10,10,11,Opm::SHUT , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); + Opm::CompletionConstPtr completion3(new Opm::Completion(10,10,12,Opm::SHUT , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); completionSet.add( completion1 ); completionSet.add( completion2 ); diff --git a/opm/parser/eclipse/EclipseState/Schedule/tests/CompletionTests.cpp b/opm/parser/eclipse/EclipseState/Schedule/tests/CompletionTests.cpp index 8d2bc54c3..f32415191 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/tests/CompletionTests.cpp +++ b/opm/parser/eclipse/EclipseState/Schedule/tests/CompletionTests.cpp @@ -39,29 +39,29 @@ BOOST_AUTO_TEST_CASE(CreateCompletionOK) { - Opm::Completion completion(10,10,10,Opm::OPEN,100, 3.33, 3.3); + Opm::Completion completion(10,10,10,Opm::OPEN,Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22)); } BOOST_AUTO_TEST_CASE(testGetFunctions) { - Opm::Completion completion(10,11,12,Opm::OPEN,100, 44, 33); + Opm::Completion completion(10,11,12,Opm::OPEN,Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22)); BOOST_CHECK_EQUAL( 10 , completion.getI() ); BOOST_CHECK_EQUAL( 11 , completion.getJ() ); BOOST_CHECK_EQUAL( 12 , completion.getK() ); BOOST_CHECK_EQUAL( Opm::OPEN , completion.getState()); - BOOST_CHECK_EQUAL( 100 , completion.getCF()); - BOOST_CHECK_EQUAL( 44 , completion.getDiameter()); - BOOST_CHECK_EQUAL( 33 , completion.getSkinFactor()); + BOOST_CHECK_EQUAL( 99.88 , completion.getCF()); + BOOST_CHECK_EQUAL( 22.33 , completion.getDiameter()); + BOOST_CHECK_EQUAL( 33.22 , completion.getSkinFactor()); } BOOST_AUTO_TEST_CASE(CompletionTestssameCoordinate) { - Opm::Completion completion1(10,10,10,Opm::OPEN, 100.0, 30, 40); - Opm::Completion completion2(10,10,10,Opm::OPEN, 100.0, 30, 40); - Opm::Completion completion3(11,10,10,Opm::OPEN, 100.0, 30, 40); - Opm::Completion completion4(10,11,10,Opm::OPEN, 100.0, 30, 40); - Opm::Completion completion5(10,10,11,Opm::OPEN, 100.0, 30, 40); + Opm::Completion completion1(10,10,10,Opm::OPEN, Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22)); + Opm::Completion completion2(10,10,10,Opm::OPEN, Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22)); + Opm::Completion completion3(11,10,10,Opm::OPEN, Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22)); + Opm::Completion completion4(10,11,10,Opm::OPEN, Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22)); + Opm::Completion completion5(10,10,11,Opm::OPEN, Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22)); BOOST_CHECK( completion1.sameCoordinate( completion2 )); BOOST_CHECK_EQUAL( false , completion1.sameCoordinate( completion3 )); diff --git a/opm/parser/eclipse/EclipseState/Schedule/tests/WellTests.cpp b/opm/parser/eclipse/EclipseState/Schedule/tests/WellTests.cpp index c33cb0c6c..fca91381c 100644 --- a/opm/parser/eclipse/EclipseState/Schedule/tests/WellTests.cpp +++ b/opm/parser/eclipse/EclipseState/Schedule/tests/WellTests.cpp @@ -171,11 +171,11 @@ BOOST_AUTO_TEST_CASE(UpdateCompletions) { std::vector newCompletions; std::vector newCompletions2; - Opm::CompletionPtr comp1(new Opm::Completion( 10 , 10 , 10 , Opm::AUTO , 99.0, 22.3, 33.2)); - Opm::CompletionPtr comp2(new Opm::Completion( 10 , 11 , 10 , Opm::SHUT , 99.0, 22.3, 33.2)); - Opm::CompletionPtr comp3(new Opm::Completion( 10 , 10 , 12 , Opm::OPEN , 99.0, 22.3, 33.2)); - Opm::CompletionPtr comp4(new Opm::Completion( 10 , 10 , 12 , Opm::SHUT , 99.0, 22.3, 33.2)); - Opm::CompletionPtr comp5(new Opm::Completion( 10 , 10 , 13 , Opm::OPEN , 99.0, 22.3, 33.2)); + Opm::CompletionPtr comp1(new Opm::Completion( 10 , 10 , 10 , Opm::AUTO , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); + Opm::CompletionPtr comp2(new Opm::Completion( 10 , 11 , 10 , Opm::SHUT , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); + Opm::CompletionPtr comp3(new Opm::Completion( 10 , 10 , 12 , Opm::OPEN , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); + Opm::CompletionPtr comp4(new Opm::Completion( 10 , 10 , 12 , Opm::SHUT , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); + Opm::CompletionPtr comp5(new Opm::Completion( 10 , 10 , 13 , Opm::OPEN , Opm::Value("CF",99.88), Opm::Value("D",22.33), Opm::Value("SKIN",33.22))); //std::vector newCompletions2{ comp4 , comp5}; Newer c++ diff --git a/opm/parser/eclipse/EclipseState/Util/tests/ValueTests.cpp b/opm/parser/eclipse/EclipseState/Util/tests/ValueTests.cpp index b13b39453..41a7e2b39 100644 --- a/opm/parser/eclipse/EclipseState/Util/tests/ValueTests.cpp +++ b/opm/parser/eclipse/EclipseState/Util/tests/ValueTests.cpp @@ -70,3 +70,11 @@ BOOST_AUTO_TEST_CASE( check_equal2 ) { v2.setValue(110); BOOST_CHECK_EQUAL( true , v1.equal(v2)); } + + +BOOST_AUTO_TEST_CASE( check_assign) { + Opm::Value v1("v1",100); + Opm::Value v2(v1); + + BOOST_CHECK(v1.equal(v2)); +} diff --git a/opm/parser/eclipse/IntegrationTests/CompletionsFromDeck.cpp b/opm/parser/eclipse/IntegrationTests/CompletionsFromDeck.cpp index 089e34d51..37d5fc064 100644 --- a/opm/parser/eclipse/IntegrationTests/CompletionsFromDeck.cpp +++ b/opm/parser/eclipse/IntegrationTests/CompletionsFromDeck.cpp @@ -19,7 +19,10 @@ #define BOOST_TEST_MODULE CompletionIntegrationTests + #include +#include + #include #include #include @@ -65,9 +68,17 @@ BOOST_AUTO_TEST_CASE( CreateCompletionsFromRecord ) { BOOST_CHECK_EQUAL( 3.8134259259259256e-12 , completion2->getCF() ); BOOST_CHECK_EQUAL( Opm::CompletionDirection::DirectionEnum::X, completion2->getDirection() ); } - - // We do not accept a defaulted Connection Factor - BOOST_CHECK_THROW(Completion::completionsFromCOMPDATRecord( line1 ) , std::invalid_argument ); + + { + std::pair > pair = Completion::completionsFromCOMPDATRecord( line1 ); + + // We try to get the numerical value of a default CF: + CompletionPtr comp = pair.second[0]; + /* + This statement gives a compilation error: + BOOST_CHECK_THROW( comp->getCF() , std::logical_error ); + */ + } } @@ -109,9 +120,6 @@ BOOST_AUTO_TEST_CASE( CreateCompletionsFromKeyword ) { BOOST_CHECK_EQUAL( OPEN , completion4->getState() ); BOOST_CHECK_EQUAL( 5.4722222222222212e-13 , completion4->getCF() ); BOOST_CHECK_EQUAL( Opm::CompletionDirection::DirectionEnum::Y, completion4->getDirection() ); - - - }