diff --git a/grid/common/mapper.hh b/grid/common/mapper.hh index 7c4328fb78f8ac9d77cdaa3f1f0cde140e7e13c3..2c5e00caf178fea87db8d011c9c337cc41819034 100644 --- a/grid/common/mapper.hh +++ b/grid/common/mapper.hh @@ -6,7 +6,9 @@ #define __DUNE_MAPPER2_HH__ #include <iostream> +#include <dune/common/exceptions.hh> #include "dune/common/helpertemplates.hh" + /** * @file * @brief Mapper classes are used to attach data to a grid @@ -32,7 +34,106 @@ namespace Dune * */ + /** @brief A mapper. + * + * In this implementation of a mapper the entity set used as domain for the map consists + * of the entities of a given codimension c for all entities in the given index set. The index + * set may only contain entities of a single geometry type, otherwise an exception is thrown. This + * version is usually not used directly but is used to implement versions for leafwise and levelwise + * entity sets. + * + * Template parameters are: + * + * \par G + * A Dune grid type. + * \par IS + * LeafIndexSet or LevelIndexSet type of the given grid. + * \par c + * A valid codimension. + */ + template <typename G, typename IS, int c> + class SingleCodimSingleGeomTypeMapper { + public: + + /** @brief Construct mapper from grid and one fo its index sets. + + \param grid A Dune grid object. + \param indexset IndexSet object returned by grid. + + */ + SingleCodimSingleGeomTypeMapper (const G& grid, const IS& indexset); + + /** @brief Map entity to array index. + + \param e Reference to codim cc entity, where cc is the template parameter of the function. + \return An index in the range 0 ... Max number of entities in set - 1. + */ + template<int cc> // this is necessary for multiple codim mappers + int map (const typename G::Traits::template Codim<cc>::Entity& e) const; + + /** @brief Map subentity of codim 0 entity to array index. + + \param e Reference to codim 0 entity. + \param i Number of codim cc subentity of e, where cc is the template parameter of the function. + \return An index in the range 0 ... Max number of entities in set - 1. + */ + template<int cc> // this is now the subentity's codim + int submap (const typename G::Traits::template Codim<0>::Entity& e, int i) const; + + /** @brief Return total number of entities in the entity set managed by the mapper. + + This number can be used to allocate a vector of data elements associated with the + entities of the set. In the parallel case this number is per process (i.e. it + may be different in different processes). + + \return Size of the entity set. + */ + int size () const; + + private: + const G& g; + const IS& is; + }; + + + template <typename G, typename IS, int c> + SingleCodimSingleGeomTypeMapper<G,IS,c>::SingleCodimSingleGeomTypeMapper (const G& grid, const IS& indexset) + : g(grid), is(indexset) + { + // check that grid has only a single geometry type + if (is.geomtypes().size() != 1) + DUNE_THROW(GridError, "mapper treats only a single codim and a single geometry type"); + } + + template <typename G, typename IS, int c> + template<int cc> + int SingleCodimSingleGeomTypeMapper<G,IS,c>::map (const typename G::Traits::template Codim<cc>::Entity& e) const + { + IsTrue< cc == c >::yes(); + return is.template index<cc>(e); + } + + template <typename G, typename IS, int c> + template<int cc> + int SingleCodimSingleGeomTypeMapper<G,IS,c>::submap (const typename G::Traits::template Codim<0>::Entity& e, int i) const + { + IsTrue< cc == c >::yes(); + return is.template subindex<cc>(e,i); + } + + template <typename G, typename IS, int c> + int SingleCodimSingleGeomTypeMapper<G,IS,c>::size () const + { + return is.size(c,is.geomtypes()[0]); + } + + template <typename G, int c> + class LeafSingleCodimSingleGeomTypeMapper : public SingleCodimSingleGeomTypeMapper<G,typename G::LeafIndexSet,c> { + public: + LeafSingleCodimSingleGeomTypeMapper (const G& grid) : SingleCodimSingleGeomTypeMapper<G,typename G::LeafIndexSet,c>(grid,grid.leafindexset()) + {} + }; /** @} */ }