From 4fce7703dbf41041e80339befd54c2ecd92d3482 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Tue, 10 Dec 2013 13:49:15 +0100 Subject: [PATCH] Added dimension to DeckDoubleItem and method get SIData(). --- opm/parser/eclipse/Deck/DeckDoubleItem.cpp | 47 +++++++++++- opm/parser/eclipse/Deck/DeckDoubleItem.hpp | 8 ++ .../Deck/tests/DeckDoubleItemTests.cpp | 73 +++++++++++++++++++ 3 files changed, 127 insertions(+), 1 deletion(-) diff --git a/opm/parser/eclipse/Deck/DeckDoubleItem.cpp b/opm/parser/eclipse/Deck/DeckDoubleItem.cpp index 70a67b988..933409507 100644 --- a/opm/parser/eclipse/Deck/DeckDoubleItem.cpp +++ b/opm/parser/eclipse/Deck/DeckDoubleItem.cpp @@ -17,9 +17,11 @@ along with OPM. If not, see . */ +#include + #include -#include +#include namespace Opm { @@ -35,6 +37,41 @@ namespace Opm { } + void DeckDoubleItem::assertSIData() { + if (m_dimensions.size() > 0) { + m_SIdata.resize( m_data.size() ); + if (m_dimensions.size() == 1) { + double SIfactor = m_dimensions[0]->getSIScaling(); + std::transform( m_data.begin() , m_data.end() , m_SIdata.begin() , std::bind1st(std::multiplies(),SIfactor)); + } else { + for (size_t index=0; index < m_data.size(); index++) { + size_t dimIndex = (index % m_dimensions.size()); + double SIfactor = m_dimensions[dimIndex]->getSIScaling(); + m_SIdata[index] = m_data[index] * SIfactor; + } + } + } else + throw std::invalid_argument("No dimension has been set - can not ask for SI data"); + } + + + + double DeckDoubleItem::getSIDouble(size_t index) { + assertSIData(); + { + if (index < m_data.size()) { + return m_SIdata[index]; + } else + throw std::out_of_range("Out of range, index must be lower than " + boost::lexical_cast(m_data.size())); + } + } + + const std::vector& DeckDoubleItem::getSIDoubleData() { + assertSIData(); + return m_SIdata; + } + + void DeckDoubleItem::push_back(std::deque data , size_t items) { for (size_t i=0; i activeDimension , std::shared_ptr defaultDimension) { + if (m_defaultApplied) + m_dimensions.push_back( defaultDimension ); + else + m_dimensions.push_back( activeDimension ); + } + + } diff --git a/opm/parser/eclipse/Deck/DeckDoubleItem.hpp b/opm/parser/eclipse/Deck/DeckDoubleItem.hpp index 763d3d2d9..7b2f861ec 100644 --- a/opm/parser/eclipse/Deck/DeckDoubleItem.hpp +++ b/opm/parser/eclipse/Deck/DeckDoubleItem.hpp @@ -26,6 +26,7 @@ #include #include +#include namespace Opm { @@ -34,16 +35,23 @@ namespace Opm { DeckDoubleItem(std::string name) : DeckItem(name) {} double getDouble(size_t index) const; const std::vector& getDoubleData() const; + double getSIDouble(size_t index); + const std::vector& getSIDoubleData(); void push_back(std::deque data , size_t items); void push_back(std::deque data); void push_back(double value); void push_backDefault(double value); void push_backMultiple(double value, size_t numValues); + void push_backDimensions(std::shared_ptr activeDimension , std::shared_ptr defaultDimension); size_t size() const; private: + void assertSIData(); + std::vector m_data; + std::vector m_SIdata; + std::vector > m_dimensions; }; typedef std::shared_ptr DeckDoubleItemPtr; diff --git a/opm/parser/eclipse/Deck/tests/DeckDoubleItemTests.cpp b/opm/parser/eclipse/Deck/tests/DeckDoubleItemTests.cpp index 96d721909..8702c6f28 100644 --- a/opm/parser/eclipse/Deck/tests/DeckDoubleItemTests.cpp +++ b/opm/parser/eclipse/Deck/tests/DeckDoubleItemTests.cpp @@ -26,6 +26,7 @@ #include #include +#include using namespace Opm; @@ -95,3 +96,75 @@ BOOST_AUTO_TEST_CASE(PushBackMultiple) { for (size_t i=0; i < 100; i++) BOOST_CHECK_EQUAL(10.22 , item.getDouble(i)); } + + + +BOOST_AUTO_TEST_CASE(PushBackDimension) { + DeckDoubleItem item("HEI"); + std::shared_ptr activeDimension(new Dimension("L" , 100)); + std::shared_ptr defaultDimension(new Dimension("L" , 10)); + + item.push_backDimensions( activeDimension , defaultDimension); +} + + + +BOOST_AUTO_TEST_CASE(GetSIWithoutDimensionThrows) { + DeckDoubleItem item("HEI"); + item.push_backMultiple(10.22 , 100 ); + + BOOST_CHECK_THROW( item.getSIDouble(0) , std::invalid_argument ); + BOOST_CHECK_THROW( item.getSIDoubleData( ) , std::invalid_argument ); +} + + + +BOOST_AUTO_TEST_CASE(GetSISingleDimensionCorrect) { + DeckDoubleItem item("HEI"); + std::shared_ptr dim(new Dimension("L" , 100)); + + item.push_backMultiple(1 , 100 ); + item.push_backDimensions( dim , dim ); + + BOOST_CHECK_EQUAL( 1 , item.getDouble(0) ); + BOOST_CHECK_EQUAL( 100 , item.getSIDouble(0) ); +} + + +BOOST_AUTO_TEST_CASE(GetSISingleDefault) { + DeckDoubleItem item("HEI"); + std::shared_ptr dim(new Dimension("L" , 1)); + std::shared_ptr defaultDim(new Dimension("L" , 100)); + + item.push_backDefault(1 ); + item.push_backDimensions( dim , defaultDim ); + + BOOST_CHECK_EQUAL( 1 , item.getDouble(0) ); + BOOST_CHECK_EQUAL( 100 , item.getSIDouble(0) ); +} + + +BOOST_AUTO_TEST_CASE(GetSIMultipleDim) { + DeckDoubleItem item("HEI"); + std::shared_ptr dim1(new Dimension("L" , 2)); + std::shared_ptr dim2(new Dimension("L" , 4)); + std::shared_ptr dim3(new Dimension("L" , 8)); + std::shared_ptr dim4(new Dimension("L" ,16)); + std::shared_ptr defaultDim(new Dimension("L" , 100)); + + item.push_backMultiple( 1 , 16 ); + item.push_backDimensions( dim1 , defaultDim ); + item.push_backDimensions( dim2 , defaultDim ); + item.push_backDimensions( dim3 , defaultDim ); + item.push_backDimensions( dim4 , defaultDim ); + + for (size_t i=0; i < 16; i+= 4) { + BOOST_CHECK_EQUAL( 2 , item.getSIDouble(i) ); + BOOST_CHECK_EQUAL( 4 , item.getSIDouble(i+ 1) ); + BOOST_CHECK_EQUAL( 8 , item.getSIDouble(i+2) ); + BOOST_CHECK_EQUAL(16 , item.getSIDouble(i+3) ); + } +} + + +