Skip to content

Commit

Permalink
Import NV-AMG version of MiniFE from Mantevo
Browse files Browse the repository at this point in the history
  • Loading branch information
nmhamster committed Jul 5, 2016
1 parent 875f2e0 commit d9d9ae6
Show file tree
Hide file tree
Showing 245 changed files with 44,469 additions and 0 deletions.
22 changes: 22 additions & 0 deletions nvamg/basic/Box.hpp
@@ -0,0 +1,22 @@
#ifndef _Box_hpp_
#define _Box_hpp_

/**
* a 'Box' is 3 pairs of ints, where each pair specifies a lower
* and upper bound for one of the 3 spatial dimensions.
*
* This struct stores the 3 pairs as a simple array of 6 ints,
* but defines the bracket operator so that it can be referenced
* using 2-dimensional array notation like this:
* int xmin = box[0][0]; int xmax = box[0][1];
* int ymin = box[1][0]; int ymax = box[1][1];
* int zmin = box[2][0]; int zmax = box[2][1];
*/
struct Box {
int ranges[6];
int* operator[](int xyz) { return &ranges[xyz*2]; }
const int* operator[](int xyz) const { return &ranges[xyz*2]; }
};

#endif

143 changes: 143 additions & 0 deletions nvamg/basic/BoxIterator.hpp
@@ -0,0 +1,143 @@
#ifndef _BoxTraverser_hpp_
#define _BoxTraverser_hpp_

//@HEADER
// ************************************************************************
//
// miniFE: simple finite-element assembly and linear-solve
// Copyright (2006) Sandia Corporation
//
// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
// license for use of this work by or on behalf of the U.S. Government.
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
//
// ************************************************************************
//@HEADER

namespace miniFE {

/** Class for traversing a 3-dimensional 'box' of indices.
//One way to traverse a 'box[3][2]' is to use a triply-nested for-loop:
for(int z=box[2][0]; z<box[2][1]; ++z) {
for(int y=box[1][0]; y<box[1][1]; ++y) {
for(int x=box[0][0]; x<box[0][1]; ++x) {
...
}
}
}
//Another way is to use this BoxIterator class, like so:
//BoxIterator iter = BoxIterator::begin(box);
//BoxIterator end = BoxIterator::end(box);
for(; iter != end; ++iter) {
int x = iter.x;
int y = iter.y;
int z = iter.z;
...
}
*/
class BoxIterator {
public:
~BoxIterator(){}

static BoxIterator begin(const Box& box)
{
return BoxIterator(box);
}

static BoxIterator end(const Box& box)
{
return BoxIterator(box, true/*at_end==true*/);
}

BoxIterator& operator=(const BoxIterator& src)
{
box_[0][0] = src.box_[0][0]; box_[0][1] = src.box_[0][1];
box_[1][0] = src.box_[1][0]; box_[1][1] = src.box_[1][1];
box_[2][0] = src.box_[2][0]; box_[2][1] = src.box_[2][1];
x = src.x;
y = src.y;
z = src.z;
return *this;
}

BoxIterator& operator++()
{
++x;
if (x >= box_[0][1]) {
x = box_[0][0];
++y;
if (y >= box_[1][1]) {
y = box_[1][0];
++z;
if (z >= box_[2][1]) {
z = box_[2][1];
y = box_[1][1];
x = box_[0][1];
}
}
}
return *this;
}

BoxIterator operator++(int)
{
BoxIterator temp = *this;
++(*this);
return temp;
}

bool operator==(const BoxIterator& rhs) const
{
return x == rhs.x && y == rhs.y && z == rhs.z;
}

bool operator!=(const BoxIterator& rhs) const
{
return !(this->operator==(rhs));
}

int x;
int y;
int z;

private:
BoxIterator(const Box& box, bool at_end = false)
: x(box[0][0]),
y(box[1][0]),
z(box[2][0]),
box_()
{
box_[0][0] = box[0][0]; box_[0][1] = box[0][1];
box_[1][0] = box[1][0]; box_[1][1] = box[1][1];
box_[2][0] = box[2][0]; box_[2][1] = box[2][1];
if (at_end) {
x = box[0][1];
y = box[1][1];
z = box[2][1];
}
}

Box box_;
};//class BoxTraverser

}//namespace miniFE

#endif

0 comments on commit d9d9ae6

Please sign in to comment.