[Dune-devel] Destiny of MultiIndex: was Re: [Dune-Commit] [Commit] dune-grid - 6a9b515: Move MultiIndex class from StructuredGridFactory to a separate header
Oliver Sander
sander at igpm.rwth-aachen.de
Mon Mar 16 19:17:06 CET 2015
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
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: OpenPGP digital signature
URL: <https://lists.dune-project.org/pipermail/dune-devel/attachments/20150316/d21898eb/attachment.sig>
More information about the Dune-devel
mailing list