[Dune-devel] Destiny of MultiIndex: was Re: [Dune-Commit] [Commit] dune-grid - 6a9b515: Move MultiIndex class from StructuredGridFactory to a separate header

Dominic Kempf dominic.r.kempf at gmail.com
Mon Mar 16 19:33:22 CET 2015


Sounds like a good idea to me. Maybe we could/should extend the interface
then? postfix operator++, the operator--s, logical and stream operators
come to my mind.

On Mon, Mar 16, 2015 at 7:17 PM, Oliver Sander <sander at igpm.rwth-aachen.de>
wrote:

> Hi all,
>
> >
> >     Move MultiIndex class from StructuredGridFactory to a separate header
> >
> >     The TensorGridFactory needs the same class, so I move it to a new
> header.
>
> a smart move.  I have needed (and reimplemented) such a class again and
> again.
> Maybe we should move multiindex.hh into dune-common right away?
> --
> Oliver
>
>
> >
> >  dune/grid/utility/CMakeLists.txt           |  1 +
> >  dune/grid/utility/Makefile.am              |  1 +
> >  dune/grid/utility/multiindex.hh            | 57
> ++++++++++++++++++++++++++++++
> >  dune/grid/utility/structuredgridfactory.hh | 53
> +++------------------------
> >  dune/grid/utility/tensorgridfactory.hh     |  2 ++
> >  5 files changed, 65 insertions(+), 49 deletions(-)
> >  create mode 100644 dune/grid/utility/multiindex.hh
> >
> >
> >
> > diff --git a/dune/grid/utility/CMakeLists.txt
> b/dune/grid/utility/CMakeLists.txt
> > index 1c42604..15d2311 100644
> > --- a/dune/grid/utility/CMakeLists.txt
> > +++ b/dune/grid/utility/CMakeLists.txt
> > @@ -8,6 +8,7 @@ set(HEADERS
> >    gridtype.hh
> >    hierarchicsearch.hh
> >    hostgridaccess.hh
> > +  multiindex.hh
> >    parmetisgridpartitioner.hh
> >    persistentcontainer.hh
> >    persistentcontainerinterface.hh
> > diff --git a/dune/grid/utility/Makefile.am
> b/dune/grid/utility/Makefile.am
> > index e14c152..d81c3e2 100644
> > --- a/dune/grid/utility/Makefile.am
> > +++ b/dune/grid/utility/Makefile.am
> > @@ -10,6 +10,7 @@ gridutility_HEADERS =                               \
> >       gridtype.hh                             \
> >       hierarchicsearch.hh                     \
> >       hostgridaccess.hh                       \
> > +     multiindex.hh \
> >       parmetisgridpartitioner.hh              \
> >       persistentcontainer.hh                  \
> >       persistentcontainerinterface.hh         \
> > diff --git a/dune/grid/utility/multiindex.hh
> b/dune/grid/utility/multiindex.hh
> > new file mode 100644
> > index 0000000..b6b281f
> > --- /dev/null
> > +++ b/dune/grid/utility/multiindex.hh
> > @@ -0,0 +1,57 @@
> > +#ifndef DUNE_GRID_UTILITY_MULTIINDEX_HH
> > +#define DUNE_GRID_UTILITY_MULTIINDEX_HH
> > +
> > +/** \file
> > + *  \brief Implements a multiindex with arbitrary dimension and fixed
> index ranges
> > + *  This is used by various factory classes.
> > + */
> > +
> > +#include<array>
> > +
> > +namespace Dune
> > +{
> > + namespace FactoryUtilities
> > + {
> > +  template<std::size_t dim>
> > +  class MultiIndex : public std::array<unsigned int,dim>
> > +  {
> > +    // The range of each component
> > +    std::array<unsigned int,dim> limits_;
> > +
> > +  public:
> > +    /** \brief Constructor with a given range for each digit */
> > +    MultiIndex(const std::array<unsigned int,dim>& limits) :
> limits_(limits)
> > +    {
> > +      std::fill(this->begin(), this->end(), 0);
> > +    }
> > +
> > +    /** \brief Increment the MultiIndex */
> > +    MultiIndex<dim>& operator++()
> > +    {
> > +      for (int i=0; i<dim; i++)
> > +      {
> > +        // Augment digit
> > +        (*this)[i]++;
> > +
> > +        // If there is no carry-over we can stop here
> > +        if ((*this)[i]<limits_[i])
> > +          break;
> > +
> > +        (*this)[i] = 0;
> > +      }
> > +      return *this;
> > +    }
> > +
> > +    /** \brief Compute how many times you can call operator++ before
> getting to (0,...,0) again */
> > +    size_t cycle() const
> > +    {
> > +      size_t result = 1;
> > +      for (int i=0; i<dim; i++)
> > +        result *= limits_[i];
> > +      return result;
> > +    }
> > +  };
> > + }
> > +}
> > +
> > +#endif
> > diff --git a/dune/grid/utility/structuredgridfactory.hh
> b/dune/grid/utility/structuredgridfactory.hh
> > index 8832149..8e2700a 100644
> > --- a/dune/grid/utility/structuredgridfactory.hh
> > +++ b/dune/grid/utility/structuredgridfactory.hh
> > @@ -19,6 +19,7 @@
> >  #include <dune/common/shared_ptr.hh>
> >
> >  #include <dune/grid/common/gridfactory.hh>
> > +#include <dune/grid/utility/multiindex.hh>
> >  #include <dune/grid/yaspgrid.hh>
> >
> >  namespace Dune {
> > @@ -34,59 +35,13 @@ namespace Dune {
> >
> >      static const int dimworld = GridType::dimensionworld;
> >
> > -    /** \brief dim-dimensional multi-index.  The range for each
> component can be set individually
> > -     */
> > -    class MultiIndex
> > -      : public array<unsigned int,dim>
> > -    {
> > -
> > -      // The range of each component
> > -      array<unsigned int,dim> limits_;
> > -
> > -    public:
> > -      /** \brief Constructor with a given range for each digit */
> > -      MultiIndex(const array<unsigned int,dim>& limits)
> > -        : limits_(limits)
> > -      {
> > -        std::fill(this->begin(), this->end(), 0);
> > -      }
> > -
> > -      /** \brief Increment the MultiIndex */
> > -      MultiIndex& operator++() {
> > -
> > -        for (int i=0; i<dim; i++) {
> > -
> > -          // Augment digit
> > -          (*this)[i]++;
> > -
> > -          // If there is no carry-over we can stop here
> > -          if ((*this)[i]<limits_[i])
> > -            break;
> > -
> > -          (*this)[i] = 0;
> > -
> > -        }
> > -        return *this;
> > -      }
> > -
> > -      /** \brief Compute how many times you can call operator++ before
> getting to (0,...,0) again */
> > -      size_t cycle() const {
> > -        size_t result = 1;
> > -        for (int i=0; i<dim; i++)
> > -          result *= limits_[i];
> > -        return result;
> > -      }
> > -
> > -    };
> > -
> >      /** \brief Insert a structured set of vertices into the factory */
> >      static void insertVertices(GridFactory<GridType>& factory,
> >                                 const FieldVector<ctype,dimworld>&
> lowerLeft,
> >                                 const FieldVector<ctype,dimworld>&
> upperRight,
> >                                 const array<unsigned int,dim>& vertices)
> >      {
> > -
> > -      MultiIndex index(vertices);
> > +      FactoryUtilities::MultiIndex<dim> index(vertices);
> >
> >        // Compute the total number of vertices to be created
> >        int numVertices = index.cycle();
> > @@ -166,7 +121,7 @@ namespace Dune {
> >                cornersTemplate[i] += unitOffsets[j];
> >
> >          // Insert elements
> > -        MultiIndex index(elements);
> > +        FactoryUtilities::MultiIndex<dim> index(elements);
> >
> >          // Compute the total number of elementss to be created
> >          int numElements = index.cycle();
> > @@ -234,7 +189,7 @@ namespace Dune {
> >
> >          // Loop over all "cubes", and split up each cube into dim!
> >          // (factorial) simplices
> > -        MultiIndex elementsIndex(elements);
> > +        FactoryUtilities::MultiIndex<dim> elementsIndex(elements);
> >          size_t cycle = elementsIndex.cycle();
> >
> >          for (size_t i=0; i<cycle; ++elementsIndex, i++) {
> > diff --git a/dune/grid/utility/tensorgridfactory.hh
> b/dune/grid/utility/tensorgridfactory.hh
> > index 971bc4e..8aa47cf 100644
> > --- a/dune/grid/utility/tensorgridfactory.hh
> > +++ b/dune/grid/utility/tensorgridfactory.hh
> > @@ -19,6 +19,8 @@
> >  #include<memory>
> >  #include<vector>
> >
> > +#include<dune/grid/utility/multiindex.hh>
> > +
> >  namespace Dune
> >  {
> >    // forward declaration of TensorGridFactoryCreator, which is the real
> factory
> >
> > _______________________________________________
> > Dune-Commit mailing list
> > Dune-Commit at dune-project.org
> > http://lists.dune-project.org/mailman/listinfo/dune-commit
> >
>
>
>
> _______________________________________________
> Dune-devel mailing list
> Dune-devel at dune-project.org
> http://lists.dune-project.org/mailman/listinfo/dune-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.dune-project.org/pipermail/dune-devel/attachments/20150316/d98a3ddd/attachment.htm>


More information about the Dune-devel mailing list