diff --git a/dune/foamgrid/foamgrid.hh b/dune/foamgrid/foamgrid.hh index 91c68a080b6c59038bbb289637913514a9475234..050af06ae1398fcff5e83fc9bf09f2ba2e075135 100644 --- a/dune/foamgrid/foamgrid.hh +++ b/dune/foamgrid/foamgrid.hh @@ -134,10 +134,7 @@ class FoamGrid : globalRefined(0), numBoundarySegments_(0), growing_(false) - { - //static_assert(dimgrid == 2, "FoamGrid currently only works for 2D in nD"); - std::fill(freeIdCounter_.begin(), freeIdCounter_.end(), 0); - } + {} //! Destructor ~FoamGrid() @@ -648,6 +645,14 @@ class FoamGrid : //! compute the grid indices and ids void setIndices(); + /** \brief Produce an entity id that has not been used in this grid before. + * \note Every entity, no matter which codimension, gets a unique id in the whole grid. + */ + unsigned int getNextFreeId() + { + return freeIdCounter_++; + } + //! Compute the codim 2-0 connectivity useful for removal of elements void computeTwoZeroConnectivity() { @@ -702,8 +707,8 @@ class FoamGrid : //! The id set FoamGridIdSet<const FoamGrid > idSet_; - /** \brief Counters that always provide the next free id for each dimension */ - std::array<unsigned int, dimgrid+1> freeIdCounter_; + /** \brief a counter that always provides the next free unique id for an entity */ + unsigned int freeIdCounter_; /** \brief How many times was the leaf level globally refined. */ int globalRefined; diff --git a/dune/foamgrid/foamgrid/foamgrid.cc b/dune/foamgrid/foamgrid/foamgrid.cc index 0b622907f99453887eda27ce1a4be105ffa34230..47d324c0f00c987dca73e61adeb6a44b0141ecae 100644 --- a/dune/foamgrid/foamgrid/foamgrid.cc +++ b/dune/foamgrid/foamgrid/foamgrid.cc @@ -585,7 +585,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2 //create midpoint std::get<0>(entityImps_[nextLevel]) .push_back(FoamGridEntityImp<0, dimgrid, dimworld>(nextLevel, midPoint, - freeIdCounter_[0]++)); + getNextFreeId())); FoamGridEntityImp<0, dimgrid, dimworld>& midVertex = std::get<0>(entityImps_[nextLevel]).back(); nextLevelVertices[vertexIndex++]=&midVertex; @@ -602,7 +602,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2 // create the facets and publish them in the father std::get<1>(entityImps_[nextLevel]) .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(nextLevelVertices[facetVertexMapping[facetIndex/2].first], &midVertex, - nextLevel, freeIdCounter_[1]++, *facet)); + nextLevel, getNextFreeId(), *facet)); (*facet)->sons_[0] = &std::get<1>(entityImps_[nextLevel]).back(); ++((*facet)->nSons_); // Inherit the boundaryId and SegmentIndex (are treated as the same for now) @@ -618,7 +618,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2 assert((*facet)->vertex_[1]->sons_[0]!=nullptr); std::get<1>(entityImps_[nextLevel]) .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(&midVertex, nextLevelVertices[facetVertexMapping[facetIndex/2].second], - nextLevel, freeIdCounter_[1]++, *facet)); + nextLevel, getNextFreeId(), *facet)); (*facet)->sons_[1] = &std::get<1>(entityImps_[nextLevel]).back(); ++((*facet)->nSons_); // Inherit the boundaryId and SegmentIndex (are treated as the same for now) @@ -662,21 +662,21 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2 std::get<1>(entityImps_[nextLevel]) .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(nextLevelVertices[3], nextLevelVertices[4], nextLevel, - freeIdCounter_[1]++)); + getNextFreeId())); nextLevelFacets[facetIndex++]=&std::get<1>(entityImps_[nextLevel]).back(); // the one opposite to father vertex 1 std::get<1>(entityImps_[nextLevel]) .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(nextLevelVertices[3], nextLevelVertices[5], nextLevel, - freeIdCounter_[1]++)); + getNextFreeId())); nextLevelFacets[facetIndex++]=&std::get<1>(entityImps_[nextLevel]).back(); // and the one opposite to father vertex 2 std::get<1>(entityImps_[nextLevel]) .push_back(FoamGridEntityImp<1, dimgrid, dimworld>(nextLevelVertices[4], nextLevelVertices[5], nextLevel, - freeIdCounter_[1]++)); + getNextFreeId())); nextLevelFacets[facetIndex++]=&std::get<1>(entityImps_[nextLevel]).back(); assert(facetIndex==nextLevelFacets.size()); @@ -686,7 +686,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2 // create the new triangles that lie in the corners // First the one that contains vertex 0 of the father. std::get<2>(entityImps_[nextLevel]) - .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[2]++)); + .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId())); FoamGridEntityImp<dimgrid, dimgrid, dimworld>* newElement = &(std::get<dimgrid>(entityImps_[nextLevel]).back()); newElement->isNew_=true; @@ -707,7 +707,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2 // Next the one that contains vertex 1 of the father. std::get<2>(entityImps_[nextLevel]) - .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[2]++)); + .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId())); newElement = &(std::get<dimgrid>(entityImps_[nextLevel]).back()); newElement->isNew_=true; newElement->father_=&element; @@ -727,7 +727,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2 // Last the one that contains vertex 2 of the father. std::get<dimgrid>(entityImps_[nextLevel]) - .push_back(FoamGridEntityImp<dimgrid, dimgrid ,dimworld>(nextLevel, freeIdCounter_[2]++)); + .push_back(FoamGridEntityImp<dimgrid, dimgrid ,dimworld>(nextLevel, getNextFreeId())); newElement = &(std::get<2>(entityImps_[nextLevel]).back()); newElement->isNew_=true; newElement->father_=&element; @@ -747,7 +747,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<2 // create the triangle in the center std::get<dimgrid>(entityImps_[nextLevel]) - .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[2]++)); + .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId())); newElement = &(std::get<2>(entityImps_[nextLevel]).back()); newElement->isNew_=true; newElement->father_=&element; @@ -869,7 +869,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<1 element.elementParametrization_->evaluate(localMidPoint, midPoint); } // Create element midpoint - std::get<0>(entityImps_[nextLevel]).push_back(FoamGridEntityImp<0, dimgrid, dimworld>(nextLevel, midPoint, freeIdCounter_[0]++)); + std::get<0>(entityImps_[nextLevel]).push_back(FoamGridEntityImp<0, dimgrid, dimworld>(nextLevel, midPoint, getNextFreeId())); FoamGridEntityImp<0, dimgrid, dimworld>& midVertex = std::get<0>(entityImps_[nextLevel]).back(); nextLevelVertices[vertexIndex++]=&midVertex; @@ -880,7 +880,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<1 // create the elements // First the one that contains vertex 0 of the father. std::get<dimgrid>(entityImps_[nextLevel]) - .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[dimgrid]++)); + .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId())); FoamGridEntityImp<dimgrid, dimgrid, dimworld>* newElement = &(std::get<dimgrid>(entityImps_[nextLevel]).back()); newElement->isNew_=true; @@ -900,7 +900,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::refineSimplexElement(FoamGridEntityImp<1 // Next the one that contains vertex 1 of the father. std::get<dimgrid>(entityImps_[nextLevel]) - .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, freeIdCounter_[dimgrid]++)); + .push_back(FoamGridEntityImp<dimgrid, dimgrid, dimworld>(nextLevel, getNextFreeId())); newElement = &(std::get<dimgrid>(entityImps_[nextLevel]).back()); newElement->isNew_=true; newElement->father_=&element; @@ -1113,7 +1113,7 @@ bool Dune::FoamGrid<dimgrid, dimworld>::grow() if(!insertedMap.count(*vIt)) { // add the vertex to the grid - (*vIt)->id_ = freeIdCounter_[0]++; + (*vIt)->id_ = getNextFreeId(); std::get<0>(entityImps_[level]).push_back(*(*vIt)); // add a map entry so we know this new vertex was already inserted @@ -1137,7 +1137,7 @@ bool Dune::FoamGrid<dimgrid, dimworld>::grow() } // We are ready to insert the element into the grid - eIt->id_ = freeIdCounter_[dimgrid]++; + eIt->id_ = getNextFreeId(); std::get<dimgrid>(entityImps_[level]).push_back(*eIt); newEntities = true; } @@ -1320,7 +1320,7 @@ void Dune::FoamGrid<dimgrid, dimworld>::addNewFacet(FoamGridEntityImp<1, dimgrid std::array<FoamGridEntityImp<0, dimgrid, dimworld>*,dimgrid> vertexArray, int level) { - std::get<1>(entityImps_[level]).push_back(FoamGridEntityImp<1, 2, dimworld>(vertexArray[0], vertexArray[1], level, freeIdCounter_[1]++)); + std::get<1>(entityImps_[level]).push_back(FoamGridEntityImp<1, 2, dimworld>(vertexArray[0], vertexArray[1], level, getNextFreeId())); facet = &*std::get<1>(entityImps_[level]).rbegin(); } diff --git a/dune/foamgrid/foamgrid/foamgridfactory.hh b/dune/foamgrid/foamgrid/foamgridfactory.hh index bc36f9c3cfd1ec60462df72945697b34fa3cb7df..6cef7c85f73ac71d981b5c57d3e98ddc087508a3 100644 --- a/dune/foamgrid/foamgrid/foamgridfactory.hh +++ b/dune/foamgrid/foamgrid/foamgridfactory.hh @@ -69,7 +69,7 @@ template <int dimgrid, int dimworld> virtual void insertVertex(const FieldVector<ctype,dimworld>& pos) { std::get<0>(grid_->entityImps_[0]).push_back(FoamGridEntityImp<0, dimgrid, dimworld> (0, // level pos, // position - grid_->freeIdCounter_[0]++)); + grid_->getNextFreeId())); vertexArray_.push_back(&*std::get<0>(grid_->entityImps_[0]).rbegin()); } @@ -159,7 +159,7 @@ template <int dimworld> FoamGridEntityImp<1, dimgrid, dimworld> newElement(this->vertexArray_[vertices[0]], this->vertexArray_[vertices[1]], 0, - this->grid_->freeIdCounter_[1]++); + this->grid_->getNextFreeId()); std::get<1>(this->grid_->entityImps_[0]).push_back(newElement); @@ -178,7 +178,7 @@ template <int dimworld> FoamGridEntityImp<1, dimgrid, dimworld> newElement(this->vertexArray_[vertices[0]], this->vertexArray_[vertices[1]], 0, - this->grid_->freeIdCounter_[1]++); + this->grid_->getNextFreeId()); // save the pointer to the element parametrization newElement.elementParametrization_ = elementParametrization; @@ -269,7 +269,7 @@ template <int dimworld> assert(type.isTriangle()); FoamGridEntityImp<dimgrid, dimgrid, dimworld> newElement(0, // level - this->grid_->freeIdCounter_[dimgrid]++); // id + this->grid_->getNextFreeId()); // id newElement.vertex_[0] = this->vertexArray_[vertices[0]]; newElement.vertex_[1] = this->vertexArray_[vertices[1]]; newElement.vertex_[2] = this->vertexArray_[vertices[2]]; @@ -288,7 +288,7 @@ template <int dimworld> { assert(type.isTriangle()); FoamGridEntityImp<dimgrid, dimgrid, dimworld> newElement(0, // level - this->grid_->freeIdCounter_[dimgrid]++); // id + this->grid_->getNextFreeId()); // id newElement.vertex_[0] = this->vertexArray_[vertices[0]]; newElement.vertex_[1] = this->vertexArray_[vertices[1]]; newElement.vertex_[2] = this->vertexArray_[vertices[2]]; @@ -350,8 +350,8 @@ template <int dimworld> // The current edge has not been inserted already. We do that now. std::get<1>(this->grid_->entityImps_[0]).push_back(FoamGridEntityImp<1, dimgrid, dimworld>(v0, v1, - 0, // level - this->grid_->freeIdCounter_[1]++ // id + 0, // level + this->grid_->getNextFreeId() // id )); existingEdge = &*std::get<1>(this->grid_->entityImps_[0]).rbegin();