Added dimension to DeckDoubleItem and method get SIData().

This commit is contained in:
Joakim Hove
2013-12-10 13:49:15 +01:00
parent bb8b3ab240
commit 4fce7703db
3 changed files with 127 additions and 1 deletions

View File

@@ -17,9 +17,11 @@
along with OPM. If not, see <http://www.gnu.org/licenses/>.
*/
#include <opm/parser/eclipse/Deck/DeckDoubleItem.hpp>
#include <boost/lexical_cast.hpp>
#include <opm/parser/eclipse/Deck/DeckDoubleItem.hpp>
#include <algorithm>
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<double>(),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<std::string>(m_data.size()));
}
}
const std::vector<double>& DeckDoubleItem::getSIDoubleData() {
assertSIData();
return m_SIdata;
}
void DeckDoubleItem::push_back(std::deque<double> data , size_t items) {
for (size_t i=0; i<items; i++) {
m_data.push_back(data[i]);
@@ -67,5 +104,13 @@ namespace Opm {
return m_data.size();
}
void DeckDoubleItem::push_backDimensions(std::shared_ptr<const Dimension> activeDimension , std::shared_ptr<const Dimension> defaultDimension) {
if (m_defaultApplied)
m_dimensions.push_back( defaultDimension );
else
m_dimensions.push_back( activeDimension );
}
}

View File

@@ -26,6 +26,7 @@
#include <memory>
#include <opm/parser/eclipse/Deck/DeckItem.hpp>
#include <opm/parser/eclipse/Units/Dimension.hpp>
namespace Opm {
@@ -34,16 +35,23 @@ namespace Opm {
DeckDoubleItem(std::string name) : DeckItem(name) {}
double getDouble(size_t index) const;
const std::vector<double>& getDoubleData() const;
double getSIDouble(size_t index);
const std::vector<double>& getSIDoubleData();
void push_back(std::deque<double> data , size_t items);
void push_back(std::deque<double> 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<const Dimension> activeDimension , std::shared_ptr<const Dimension> defaultDimension);
size_t size() const;
private:
void assertSIData();
std::vector<double> m_data;
std::vector<double> m_SIdata;
std::vector<std::shared_ptr<const Dimension> > m_dimensions;
};
typedef std::shared_ptr<DeckDoubleItem> DeckDoubleItemPtr;

View File

@@ -26,6 +26,7 @@
#include <opm/parser/eclipse/Deck/DeckDoubleItem.hpp>
#include <opm/parser/eclipse/Deck/DeckStringItem.hpp>
#include <opm/parser/eclipse/Units/Dimension.hpp>
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<Dimension> activeDimension(new Dimension("L" , 100));
std::shared_ptr<Dimension> 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<Dimension> 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<Dimension> dim(new Dimension("L" , 1));
std::shared_ptr<Dimension> 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<Dimension> dim1(new Dimension("L" , 2));
std::shared_ptr<Dimension> dim2(new Dimension("L" , 4));
std::shared_ptr<Dimension> dim3(new Dimension("L" , 8));
std::shared_ptr<Dimension> dim4(new Dimension("L" ,16));
std::shared_ptr<Dimension> 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) );
}
}