36#ifndef OPM_INDEXSETS_HEADER
37#define OPM_INDEXSETS_HEADER
39#include <dune/geometry/type.hh>
40#include <opm/common/ErrorMacros.hpp>
41#include "GlobalIdMapping.hpp"
42#include "Intersection.hpp"
45#include <unordered_map>
71 typedef std::vector<GeometryType>
Types;
78 IndexSet(std::size_t numCells, std::size_t numPoints)
80 geom_types_[0].emplace_back(Dune::GeometryTypes::cube(3));
81 geom_types_[3].emplace_back(Dune::GeometryTypes::cube(0));
82 size_codim_map_[0] = numCells;
83 size_codim_map_[3] = numPoints;
96 return geom_types_[codim];
105 return geom_types_[codim];
112 int size(GeometryType type)
const
115 return size(3 - type.dim());
128 return size_codim_map_[codim];
148 template<
class EntityType>
162 return index(e.template subEntity<cc>(i));
176 DUNE_THROW(NotImplemented,
"subIndex not implemented for codim"
177 << codim <<
"entities.");
184 template <
class EntityType>
188 return index(e) >= 0 &&
index(e) < this->
size(EntityType::codimension);
193 Types geom_types_[4];
194 std::array<int,4> size_codim_map_{0,0,0,0};
204 typedef std::int64_t IdType;
213 return computeId_cell(e);
218 return computeId_point(e);
221 template<
class EntityType>
222 IdType id(
const EntityType& e)
const
230 return intersection.id();
236 return id(e.template subEntity<cc>(i));
243 template<
class EntityType>
244 IdType computeId(
const EntityType& e)
const
247 for(
int c=0; c<EntityType::codimension; ++c )
249 return myId + e.index();
252 const CpGridData& grid_;
254 IdType computeId_cell(
const cpgrid::Entity<0>& e)
const
258 if (grid_.levelData().size() > 1) {
259 const auto& gridIdx = grid_.getGridIdx();
261 if ( gridIdx == 0 ) {
262 return myId + e.index();
265 if ( (gridIdx>0) && (gridIdx <
static_cast<int>(grid_.levelData().size() -1)) ) {
266 if ((e.level() != gridIdx)) {
267 return grid_.levelData()[e.level()]->localIdSet().id(e.getLevelElem());
272 for (
int lowerLevel = 0; lowerLevel< gridIdx; ++lowerLevel) {
273 for(
int c=0; c<4; ++c ) {
274 myId += grid_.levelData()[lowerLevel]->indexSet().size( c );
277 return myId + e.index();
281 assert( grid_.getGridIdx() == (
static_cast<int>(grid_.levelData().size()) -1) );
284 const std::array<int,2> level_levelIdx = grid_.leaf_to_level_cells_[e.index()];
285 const auto& levelEntity = cpgrid::Entity<0>(*(grid_.levelData()[level_levelIdx[0]]), level_levelIdx[1],
true);
286 return grid_.levelData()[level_levelIdx[0]]->local_id_set_ ->id(levelEntity);
290 return myId + e.index();
294 IdType computeId_point(
const cpgrid::Entity<3>& e)
const
298 if (grid_.levelData().size() > 1) {
299 const auto& gridIdx = grid_.getGridIdx();
301 if ( gridIdx == 0 ) {
303 for(
int c=0; c<3; ++c ) {
304 myId += grid_.indexSet().size( c );
306 return myId + e.index();
309 if ( (gridIdx>0) && (gridIdx <
static_cast<int>(grid_.levelData().size() -1)) ) {
310 const auto& level_levelIdx = grid_.corner_history_[e.index()];
311 if(level_levelIdx[0] != -1) {
312 const auto& levelEntity = cpgrid::Entity<3>(*(grid_.levelData()[level_levelIdx[0]]), level_levelIdx[1],
true);
313 return grid_.levelData()[level_levelIdx[0]]->localIdSet().id(levelEntity);
318 for (
int lowerLevel = 0; lowerLevel< gridIdx; ++lowerLevel) {
319 for(
int c=0; c<4; ++c ) {
320 myId += grid_.levelData()[lowerLevel]->indexSet().size( c );
324 for(
int c=0; c<3; ++c ) {
325 myId += grid_.indexSet().size( c );
327 return myId + e.index();
331 assert( grid_.getGridIdx() == (
static_cast<int>(grid_.levelData().size()) -1) );
334 const std::array<int,2> level_levelIdx = grid_.corner_history_[e.index()];
335 const auto& levelEntity = cpgrid::Entity<3>(*(grid_.levelData()[level_levelIdx[0]]), level_levelIdx[1],
true);
336 return grid_.levelData()[level_levelIdx[0]]->local_id_set_ ->id(levelEntity);
340 for(
int c=0; c<3; ++c ) {
341 myId += grid_.indexSet().size( c );
343 return myId + e.index();
354 typedef std::int64_t IdType;
356 void swap(std::vector<int>& cellMapping,
357 std::vector<int>& faceMapping,
358 std::vector<int>& pointMapping)
366 : idSet_(std::move(ids)), view_(view)
374 assert(view_ == e.pgrid_);
379 return idSet_->id(e);
383 return this->
template getMapping<codim>()[e.
index()];
389 return idSet_->id(e);
391 return this->
template getMapping<codim>()[e.
index()];
397 assert(view_ == e.pgrid_);
398 return id(e.template subEntity<cc>(i));
404 IdType getMaxCodimGlobalId()
408 IdType max_codim_id = 0;
410 for (
int elemIdx = 0; elemIdx < view_-> size(0); ++elemIdx) {
412 max_codim_id = std::max(max_codim_id, idSet_->id(element));
416 for (
int pointIdx = 0; pointIdx < view_->
size(3); ++pointIdx) {
418 max_codim_id = std::max(max_codim_id, idSet_->id(point));
426 auto max_elem_codim = std::max_element(this->
template getMapping<codim>().begin(),
427 this->
template getMapping<codim>().end());
428 return *max_elem_codim;
432 IdType getMaxGlobalId()
435 return std::max(getMaxCodimGlobalId<0>(), getMaxCodimGlobalId<3>());
439 std::shared_ptr<const IdSet> idSet_;
453 using IdType =
typename LevelGlobalIdSet::IdType;
460 return levelIdSet(e.pgrid_).id(e);
466 return levelIdSet(e.pgrid_).template subId<cc>(e, i);
471 void insertIdSet(
const CpGridData& view);
474 const LevelGlobalIdSet& levelIdSet(
const CpGridData*
const data)
const
476 auto candidate = idSets_.find(data);
477 assert(candidate != idSets_.end());
478 return *candidate->second;
481 std::map<const CpGridData* const, std::shared_ptr<const LevelGlobalIdSet>> idSets_;
491 grid_ = &(idSet.idSet_->grid_);
495 mapping_.reset(
new std::unordered_map<int,int>);
497 for (
const auto& globalId: idSet.template getMapping<3>())
498 (*mapping_)[globalId] = localId++;
501 int operator[](
int i)
const
505 return(*mapping_)[i];
509 return i - grid_->size(0) - grid_->size(1) - grid_->size(2);
512 OPM_THROW(std::runtime_error,
"No grid or mapping. Should not be here!");
516 mapping_.reset(
nullptr);
519 std::unique_ptr<std::unordered_map<int,int> > mapping_;
Struct that hods all the data needed to represent a Cpgrid.
Definition CpGridData.hpp:138
int size(int codim) const
number of leaf entities per codim in this process
Definition CpGridData.cpp:147
const IndexSet & indexSet() const
Get the index set.
Definition CpGridData.hpp:647
Represents an entity of a given codim, with positive or negative orientation.
Definition EntityRep.hpp:99
int index() const
The (positive) index of an entity.
Definition EntityRep.hpp:126
Class managing the mappings of local indices to global ids.
Definition GlobalIdMapping.hpp:31
void swap(std::vector< int > &cellMapping, std::vector< int > &faceMapping, std::vector< int > &pointMapping)
Swap data for initialization.
Definition GlobalIdMapping.hpp:38
The global id set for Dune.
Definition Indexsets.hpp:450
typename LevelGlobalIdSet::IdType IdType
The type of the id.
Definition Indexsets.hpp:453
Definition Indexsets.hpp:199
IdType id(const cpgrid::Intersection &intersection) const
return id of intersection (here face number)
Definition Indexsets.hpp:228
Definition Indexsets.hpp:56
bool contains(const EntityType &e) const
Definition Indexsets.hpp:185
int size(int codim) const
Definition Indexsets.hpp:126
IndexType subIndex(const cpgrid::Entity< 0 > &e, int i) const
Definition Indexsets.hpp:160
const Types & types(int codim) const
Definition Indexsets.hpp:103
~IndexSet()
Destructor.
Definition Indexsets.hpp:87
std::vector< GeometryType > Types
Definition Indexsets.hpp:71
std::int64_t IndexType
Definition Indexsets.hpp:60
IndexType index(const EntityType &e) const
Definition Indexsets.hpp:149
IndexType index(const cpgrid::Entity< cd > &e) const
Definition Indexsets.hpp:138
int size(GeometryType type) const
Definition Indexsets.hpp:112
IndexSet()
Definition Indexsets.hpp:76
const Types & geomTypes(int codim) const
Definition Indexsets.hpp:94
Definition Intersection.hpp:66
Definition Indexsets.hpp:350
Definition Indexsets.hpp:485
The namespace Dune is the main namespace for all Dune code.
Definition CartesianIndexMapper.hpp:10
Export the type of the entity used as parameter in the index(...) method.
Definition Indexsets.hpp:65