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"
44#include <unordered_map>
68 typedef std::vector<GeometryType>
Types;
75 IndexSet(std::size_t numCells, std::size_t numPoints)
77 geom_types_[0].emplace_back(Dune::GeometryTypes::cube(3));
78 geom_types_[3].emplace_back(Dune::GeometryTypes::cube(0));
79 size_codim_map_[0] = numCells;
80 size_codim_map_[3] = numPoints;
93 return geom_types_[codim];
102 return geom_types_[codim];
109 int size(GeometryType type)
const
112 return size(3 - type.dim());
125 return size_codim_map_[codim];
145 template<
class EntityType>
159 return index(e.template subEntity<cc>(i));
173 DUNE_THROW(NotImplemented,
"subIndex not implemented for codim"
174 << codim <<
"entities.");
181 template <
class EntityType>
185 return index(e) >= 0 &&
index(e) < this->
size(EntityType::codimension);
190 Types geom_types_[4];
191 std::array<int,4> size_codim_map_{0,0,0,0};
210 return computeId_cell(e);
215 return computeId_point(e);
218 template<
class EntityType>
219 IdType id(
const EntityType& e)
const
227 return intersection.id();
233 return id(e.template subEntity<cc>(i));
240 template<
class EntityType>
241 IdType computeId(
const EntityType& e)
const
244 for(
int c=0; c<EntityType::codimension; ++c )
246 return myId + e.index();
249 const CpGridData& grid_;
251 IdType computeId_cell(
const cpgrid::Entity<0>& e)
const
255 if (grid_.levelData().size() > 1) {
256 const auto& gridIdx = grid_.getGridIdx();
258 if ( gridIdx == 0 ) {
259 return myId + e.index();
262 if ( (gridIdx>0) && (gridIdx <
static_cast<int>(grid_.levelData().size() -1)) ) {
263 if ((e.level() != gridIdx)) {
264 return grid_.levelData()[e.level()]->localIdSet().id(e.getEquivLevelElem());
269 for (
int lowerLevel = 0; lowerLevel< gridIdx; ++lowerLevel) {
270 for(
int c=0; c<4; ++c ) {
271 myId += grid_.levelData()[lowerLevel]->indexSet().size( c );
274 return myId + e.index();
278 assert( grid_.getGridIdx() == (
static_cast<int>(grid_.levelData().size()) -1) );
281 std::array<int,2> level_levelIdx = {0,0};
282 level_levelIdx = grid_.leaf_to_level_cells_[e.index()];
283 const auto& levelEntity = cpgrid::Entity<0>(*(grid_.levelData()[level_levelIdx[0]]), level_levelIdx[1],
true);
284 return grid_.levelData()[level_levelIdx[0]]->local_id_set_ ->id(levelEntity);
288 return myId + e.index();
292 IdType computeId_point(
const cpgrid::Entity<3>& e)
const
296 if (grid_.levelData().size() > 1) {
297 const auto& gridIdx = grid_.getGridIdx();
299 if ( gridIdx == 0 ) {
301 for(
int c=0; c<3; ++c ) {
302 myId += grid_.indexSet().size( c );
304 return myId + e.index();
307 if ( (gridIdx>0) && (gridIdx <
static_cast<int>(grid_.levelData().size() -1)) ) {
308 const auto& level_levelIdx = grid_.corner_history_[e.index()];
309 if(level_levelIdx[0] != -1) {
310 const auto& levelEntity = cpgrid::Entity<3>(*(grid_.levelData()[level_levelIdx[0]]), level_levelIdx[1],
true);
311 return grid_.levelData()[level_levelIdx[0]]->localIdSet().id(levelEntity);
316 for (
int lowerLevel = 0; lowerLevel< gridIdx; ++lowerLevel) {
317 for(
int c=0; c<4; ++c ) {
318 myId += grid_.levelData()[lowerLevel]->indexSet().size( c );
322 for(
int c=0; c<3; ++c ) {
323 myId += grid_.indexSet().size( c );
325 return myId + e.index();
329 assert( grid_.getGridIdx() == (
static_cast<int>(grid_.levelData().size()) -1) );
332 std::array<int,2> level_levelIdx = {0,0};
333 level_levelIdx = grid_.corner_history_[e.index()];
334 const auto& levelEntity = cpgrid::Entity<3>(*(grid_.levelData()[level_levelIdx[0]]), level_levelIdx[1],
true);
335 return grid_.levelData()[level_levelIdx[0]]->local_id_set_ ->id(levelEntity);
339 for(
int c=0; c<3; ++c ) {
340 myId += grid_.indexSet().size( c );
342 return myId + e.index();
355 void swap(std::vector<int>& cellMapping,
356 std::vector<int>& faceMapping,
357 std::vector<int>& pointMapping)
365 : idSet_(ids), view_(view)
373 assert(view_ == e.pgrid_);
378 return idSet_->id(e);
382 return this->
template getMapping<codim>()[e.
index()];
388 return idSet_->id(e);
390 return this->
template getMapping<codim>()[e.
index()];
396 assert(view_ == e.pgrid_);
397 return id(e.template subEntity<cc>(i));
403 IdType getMaxCodimGlobalId()
405 auto max_elem_codim = std::max_element(this->
template getMapping<codim>().begin(),
406 this->
template getMapping<codim>().end());
407 return *max_elem_codim;
410 IdType getMaxGlobalId()
416 return std::max(getMaxCodimGlobalId<0>(), getMaxCodimGlobalId<3>());
420 std::shared_ptr<const IdSet> idSet_;
434 using IdType =
typename LevelGlobalIdSet::IdType;
441 return levelIdSet(e.pgrid_).id(e);
447 return levelIdSet(e.pgrid_).template subId<cc>(e, i);
452 void insertIdSet(
const CpGridData& view);
455 const LevelGlobalIdSet& levelIdSet(
const CpGridData*
const data)
const
457 auto candidate = idSets_.find(data);
458 assert(candidate != idSets_.end());
459 return *candidate->second;
462 std::map<const CpGridData* const, std::shared_ptr<const LevelGlobalIdSet>> idSets_;
472 grid_ = &(idSet.idSet_->grid_);
476 mapping_.reset(
new std::unordered_map<int,int>);
478 for (
const auto& globalId: idSet.template getMapping<3>())
479 (*mapping_)[globalId] = localId++;
482 int operator[](
int i)
const
486 return(*mapping_)[i];
490 return i - grid_->size(0) - grid_->size(1) - grid_->size(2);
493 OPM_THROW(std::runtime_error,
"No grid or mapping. Should not be here!");
497 mapping_.reset(
nullptr);
500 std::unique_ptr<std::unordered_map<int,int> > mapping_;
Struct that hods all the data needed to represent a Cpgrid.
Definition CpGridData.hpp:147
const IndexSet & indexSet() const
Get the index set.
Definition CpGridData.hpp:607
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:431
typename LevelGlobalIdSet::IdType IdType
The type of the id.
Definition Indexsets.hpp:434
Definition Indexsets.hpp:196
IdType id(const cpgrid::Intersection &intersection) const
return id of intersection (here face number)
Definition Indexsets.hpp:225
Definition Indexsets.hpp:53
bool contains(const EntityType &e) const
Definition Indexsets.hpp:182
int size(int codim) const
Definition Indexsets.hpp:123
IndexType subIndex(const cpgrid::Entity< 0 > &e, int i) const
Definition Indexsets.hpp:157
const Types & types(int codim) const
Definition Indexsets.hpp:100
~IndexSet()
Destructor.
Definition Indexsets.hpp:84
std::vector< GeometryType > Types
Definition Indexsets.hpp:68
IndexType index(const EntityType &e) const
Definition Indexsets.hpp:146
IndexType index(const cpgrid::Entity< cd > &e) const
Definition Indexsets.hpp:135
int size(GeometryType type) const
Definition Indexsets.hpp:109
IndexSet()
Definition Indexsets.hpp:73
const Types & geomTypes(int codim) const
Definition Indexsets.hpp:91
int IndexType
Definition Indexsets.hpp:57
Definition Intersection.hpp:66
Definition Indexsets.hpp:349
Definition Indexsets.hpp:466
Copyright 2019 Equinor AS.
Definition CartesianIndexMapper.hpp:10
Export the type of the entity used as parameter in the index(...) method.
Definition Indexsets.hpp:62