Added constructor for sub box.

This commit is contained in:
Joakim Hove
2014-05-26 18:47:15 +02:00
committed by Andreas Lauser
parent e820eadfeb
commit 74f66a5f3c
3 changed files with 78 additions and 6 deletions

View File

@@ -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++) {

View File

@@ -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<size_t>& 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<size_t> m_indexList;
};

View File

@@ -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 <stdexcept>
#include <iostream>
#include <memory>
#include <boost/filesystem.hpp>
#define BOOST_TEST_MODULE EclipseGridTests
#define BOOST_TEST_MODULE BoxManagereTests
#include <boost/test/unit_test.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
@@ -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<size_t>& 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++;
}
}
}
}
}