14#ifndef DUMUX_GEOMETRY_GEOMETRIC_ENTITY_SET_HH 
   15#define DUMUX_GEOMETRY_GEOMETRIC_ENTITY_SET_HH 
   21#include <initializer_list> 
   23#include <dune/grid/common/mcmgmapper.hh> 
   24#include <dune/geometry/multilineargeometry.hh> 
   35template <
class Gr
idView, 
int codim = 0, 
class Mapper = Dune::MultipleCodimMultipleGeomTypeMapper<Gr
idView>>
 
   40    using Entity = 
typename GridView::template Codim<codim>::Entity;
 
   49    , entityMap_(std::make_shared<EntityMap>(gridView.grid(), mapper_))
 
 
   54                               std::shared_ptr<const EntityMap> entityMap)
 
   57    , entityMap_(entityMap)
 
 
   68    using ctype = 
typename GridView::ctype;
 
   73    decltype(
auto) 
size()
 const 
   74    { 
return gridView_.size(codim); }
 
 
   80    { 
return entities(gridView_, Dune::Codim<codim>()).begin(); }
 
 
   85    decltype(
auto) 
end() 
const 
   86    { 
return entities(gridView_, Dune::Codim<codim>()).end(); }
 
 
   92    { 
return mapper_.index(e); }
 
 
  103    std::shared_ptr<const EntityMap> entityMap_;
 
 
  109namespace Dumux::Detail::GeometricEntity {
 
  114template<
class GeoType>
 
  118    using Geometry = GeoType;
 
  123    EntityWrapper(
const Geometry& geo, 
const std::size_t index) : geo_(geo), index_(index) {}
 
  128    EntityWrapper(Geometry&& geo, 
const std::size_t index) : geo_(std::move(geo)), index_(index) {}
 
  133    const Geometry& geometry()
 const 
  139    std::size_t index()
 const 
  158template<
class GeoType>
 
  162    using Entity = Detail::GeometricEntity::EntityWrapper<GeoType>;
 
  169        std::size_t 
index = 0;
 
  173        for (
auto&& g : geometries)
 
  174            entities_.emplace_back(g, 
index++);
 
 
  182        std::size_t 
index = 0;
 
  183        for (
auto&& g : geometries)
 
  184            entities_.emplace_back(g, 
index++);
 
 
  192        std::size_t 
index = 0;
 
  193        for (
auto&& g : geometries)
 
  194            entities_.emplace_back(std::move(g), 
index++);
 
 
  205    using ctype = 
typename Entity::Geometry::ctype;
 
  211    { 
return entities_.size(); }
 
 
  217    { 
return entities_.begin(); }
 
 
  222    decltype(
auto) 
end() 
const 
  223    { 
return entities_.end(); }
 
 
  228    template<
class Entity>
 
  230    { 
return e.index(); }
 
 
  236    { assert(
index < entities_.size()); 
return entities_[
index]; }
 
 
  239    std::vector<Entity> entities_;
 
 
  248template<
class GeoType, std::
size_t N>
 
  249class FixedSizeGeometriesEntitySet
 
  251    template<
class GT, std::size_t... I>
 
  252    FixedSizeGeometriesEntitySet(GT&& gt, std::index_sequence<I...>)
 
  253    : entities_{{ 
Entity(std::get<I>(gt), I)... }}
 
  254    { 
static_assert(
sizeof...(I) == N, 
"Number of geometries must match the size of the entity set"); }
 
  257    using Entity = Detail::GeometricEntity::EntityWrapper<GeoType>;
 
  265    : FixedSizeGeometriesEntitySet(std::forward_as_tuple(std::forward<G>(g)...), std::make_index_sequence<N>{})
 
 
  276    using ctype = 
typename Entity::Geometry::ctype;
 
  282    { 
return entities_.size(); }
 
 
  288    { 
return entities_.begin(); }
 
 
  293    decltype(
auto) 
end() 
const 
  294    { 
return entities_.end(); }
 
 
  299    template<
class Entity>
 
  301    { 
return e.index(); }
 
 
  307    { assert(
index < entities_.size()); 
return entities_[
index]; }
 
 
  310    std::array<Entity, N> entities_;
 
 
  317template<
class GeoType>
 
  319: 
public FixedSizeGeometriesEntitySet<GeoType, 1>
 
  321    using ParentType = FixedSizeGeometriesEntitySet<GeoType, 1>;
 
  323    using ParentType::ParentType;
 
 
A map from indices to entities using grid entity seeds.
Definition entitymap.hh:27
std::size_t index(const Entity &e) const
get an entities index
Definition geometricentityset.hh:300
FixedSizeGeometriesEntitySet(G &&... g)
Constructor with one or more geometries as arguments.
Definition geometricentityset.hh:264
constexpr auto size() const
the number of entities in this set
Definition geometricentityset.hh:281
const Entity & entity(std::size_t index) const
get an entity from an index
Definition geometricentityset.hh:306
static constexpr int dimensionworld
Definition geometricentityset.hh:271
decltype(auto) begin() const
begin iterator to enable range-based for iteration
Definition geometricentityset.hh:287
Detail::GeometricEntity::EntityWrapper< GeoType > Entity
Definition geometricentityset.hh:257
typename Entity::Geometry::ctype ctype
the coordinate type
Definition geometricentityset.hh:276
decltype(auto) end() const
end iterator to enable range-based for iteration
Definition geometricentityset.hh:293
decltype(auto) end() const
end iterator to enable range-based for iteration
Definition geometricentityset.hh:222
typename Entity::Geometry::ctype ctype
Definition geometricentityset.hh:205
Detail::GeometricEntity::EntityWrapper< Geometry > Entity
Definition geometricentityset.hh:162
decltype(auto) begin() const
begin iterator to enable range-based for iteration
Definition geometricentityset.hh:216
decltype(auto) size() const
the number of entities in this set
Definition geometricentityset.hh:210
const Entity & entity(std::size_t index) const
get an entity from an index
Definition geometricentityset.hh:235
std::size_t index(const Entity &e) const
Definition geometricentityset.hh:229
GeometriesEntitySet(std::initializer_list< typename Entity::Geometry > &&geometries)
Constructor for initializer_list.
Definition geometricentityset.hh:167
GeometriesEntitySet(const std::vector< typename Entity::Geometry > &geometries)
Constructor for a vector of geometries.
Definition geometricentityset.hh:180
@ dimensionworld
Definition geometricentityset.hh:200
GeometriesEntitySet(std::vector< typename Entity::Geometry > &&geometries)
Constructor for a vector of geometries.
Definition geometricentityset.hh:190
typename GV::ctype ctype
Definition geometricentityset.hh:68
GridViewGeometricEntitySet(const GridView &gridView, const Mapper &mapper)
Definition geometricentityset.hh:46
std::size_t index(const Entity &e) const
get an entities index
Definition geometricentityset.hh:91
typename GV::template Codim< codim >::Entity Entity
Definition geometricentityset.hh:40
decltype(auto) size() const
the number of entities in this set
Definition geometricentityset.hh:73
@ dimensionworld
Definition geometricentityset.hh:63
GridViewGeometricEntitySet(const GridView &gridView)
Definition geometricentityset.hh:42
Entity entity(std::size_t index) const
get an entity from an index
Definition geometricentityset.hh:97
decltype(auto) end() const
end iterator to enable range-based for iteration
Definition geometricentityset.hh:85
GridViewGeometricEntitySet(const GridView &gridView, const Mapper &mapper, std::shared_ptr< const EntityMap > entityMap)
Definition geometricentityset.hh:52
decltype(auto) begin() const
begin iterator to enable range-based for iteration
Definition geometricentityset.hh:79
An interface for a geometric entity set with a single geometry.
Definition geometricentityset.hh:320
A map from indices to entities using grid entity seeds.
Definition common/pdesolver.hh:24