From 74f66a5f3c3b991e13c48bb843862dcb39713278 Mon Sep 17 00:00:00 2001 From: Joakim Hove Date: Mon, 26 May 2014 18:47:15 +0200 Subject: [PATCH] Added constructor for sub box. --- opm/parser/eclipse/EclipseState/Grid/Box.cpp | 37 ++++++++++++++++- opm/parser/eclipse/EclipseState/Grid/Box.hpp | 6 ++- .../EclipseState/Grid/tests/BoxTests.cpp | 41 +++++++++++++++++-- 3 files changed, 78 insertions(+), 6 deletions(-) diff --git a/opm/parser/eclipse/EclipseState/Grid/Box.cpp b/opm/parser/eclipse/EclipseState/Grid/Box.cpp index ec5c89a8e..9b062cb25 100644 --- a/opm/parser/eclipse/EclipseState/Grid/Box.cpp +++ b/opm/parser/eclipse/EclipseState/Grid/Box.cpp @@ -42,11 +42,44 @@ namespace Opm { m_stride[0] = 1; m_stride[1] = m_dims[0]; m_stride[2] = m_dims[0] * m_dims[1]; - + m_isGlobal = true; } + + Box::Box(const Box& globalBox , int i1 , int i2 , int j1 , int j2 , int k1 , int k2) { + assertDims(globalBox , 0 , i1 , i2); + assertDims(globalBox , 1 , j1 , j2); + assertDims(globalBox , 2 , k1 , k2); + + m_dims[0] = (size_t) (i2 - i1 + 1); + m_dims[1] = (size_t) (j2 - j1 + 1); + m_dims[2] = (size_t) (k2 - k1 + 1); + + m_offset[0] = (size_t) i1; + m_offset[1] = (size_t) j1; + m_offset[2] = (size_t) k1; + + m_stride[0] = 1; + m_stride[1] = globalBox.getDim(0); + m_stride[2] = globalBox.getDim(0) * globalBox.getDim(1); + + if (size() == globalBox.size()) + m_isGlobal = true; + else + m_isGlobal = false; + } + + void Box::assertDims(const Box& globalBox, size_t idim , int l1 , int l2) { + if ((l1 < 0) || (l2 < 0) || (l1 > l2)) + throw std::invalid_argument("Invalid index values for sub box"); + + if ((size_t) l2 >= globalBox.getDim(idim)) + throw std::invalid_argument("Invalid index values for sub box"); + } + + size_t Box::size() const { return m_dims[0] * m_dims[1] * m_dims[2]; } @@ -80,7 +113,7 @@ namespace Opm { size_t ii,ij,ik; size_t l = 0; - + for (ik=0; ik < m_dims[2]; ik++) { size_t k = ik + m_offset[2]; for (ij=0; ij < m_dims[1]; ij++) { diff --git a/opm/parser/eclipse/EclipseState/Grid/Box.hpp b/opm/parser/eclipse/EclipseState/Grid/Box.hpp index 61de7317d..d2f6560e8 100644 --- a/opm/parser/eclipse/EclipseState/Grid/Box.hpp +++ b/opm/parser/eclipse/EclipseState/Grid/Box.hpp @@ -29,17 +29,21 @@ namespace Opm { class Box { public: Box(int nx , int ny , int nz); + Box(const Box& globalBox , int i1 , int i2 , int j1 , int j2 , int k1 , int k2); // Zero offset coordinates. size_t size() const; bool isGlobal() const; size_t getDim(size_t idim) const; const std::vector& getIndexList(); + + private: void assertIndexList(); - + static void assertDims(const Box& globalBox, size_t idim , int l1 , int l2); size_t m_dims[3]; size_t m_offset[3]; size_t m_stride[3]; + bool m_isGlobal; std::vector m_indexList; }; diff --git a/opm/parser/eclipse/EclipseState/Grid/tests/BoxTests.cpp b/opm/parser/eclipse/EclipseState/Grid/tests/BoxTests.cpp index f352e7845..fd8bc5706 100644 --- a/opm/parser/eclipse/EclipseState/Grid/tests/BoxTests.cpp +++ b/opm/parser/eclipse/EclipseState/Grid/tests/BoxTests.cpp @@ -1,5 +1,5 @@ /* - Copyright 2013 Statoil ASA. + Copyright 2014 Statoil ASA. This file is part of the Open Porous Media project (OPM). @@ -19,9 +19,10 @@ #include #include +#include #include -#define BOOST_TEST_MODULE EclipseGridTests +#define BOOST_TEST_MODULE BoxManagereTests #include #include @@ -56,5 +57,39 @@ BOOST_AUTO_TEST_CASE(CreateBox) { } } } - +} + + + +BOOST_AUTO_TEST_CASE(CreateSubBox) { + Opm::Box globalBox( 10,10,10 ); + + BOOST_CHECK_THROW( new Opm::Box( globalBox , -1 , 9 , 1 , 8 , 1, 8) , std::invalid_argument); // Negative throw + BOOST_CHECK_THROW( new Opm::Box( globalBox , 1 , 19 , 1 , 8 , 1, 8) , std::invalid_argument); // Bigger than global: throw + BOOST_CHECK_THROW( new Opm::Box( globalBox , 9 , 1 , 1 , 8 , 1, 8) , std::invalid_argument); // Inverted order: throw + + Opm::Box subBox1(globalBox , 0,9,0,9,0,9); + BOOST_CHECK( subBox1.isGlobal()); + + + Opm::Box subBox2(globalBox , 1,3,1,4,1,5); + BOOST_CHECK( !subBox2.isGlobal()); + BOOST_CHECK_EQUAL( 60U , subBox2.size() ); + + { + size_t i,j,k; + size_t d = 0; + const std::vector& indexList = subBox2.getIndexList(); + + for (k=0; k < subBox2.getDim(2); k++) { + for (j=0; j < subBox2.getDim(1); j++) { + for (i=0; i < subBox2.getDim(0); i++) { + + size_t g = (i + 1) + (j + 1)*globalBox.getDim(0) + (k + 1)*globalBox.getDim(0)*globalBox.getDim(1); + BOOST_CHECK_EQUAL( indexList[d] , g); + d++; + } + } + } + } }