Added dimension to DeckDoubleItem and method get SIData().
This commit is contained in:
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user