78 : embeddingsPtr_(embeddings)
79 , bulkVertexMapper_(embeddings->template gridView<bulkGridId>(),
Dune::mcmgVertexLayout())
82 const auto& bulkGridView = embeddings->template gridView<bulkGridId>();
83 bulkInsertionToGridVIdx_.resize(bulkGridView.size(BulkGridView::dimension));
84 for (
const auto& v : vertices(bulkGridView))
85 bulkInsertionToGridVIdx_[embeddings->template insertionIndex<bulkGridId>(v)] = bulkVertexMapper_.index(v);
91 hierarchyToBulkInsertionIdx_.resize(embeddingsPtr_->numVerticesInHierarchy());
92 bulkGridHasHierarchyVertex_.resize(embeddingsPtr_->numVerticesInHierarchy(),
false);
93 const auto& bulkHierarchyIndices = embeddingsPtr_->gridHierarchyIndices(bulkGridId);
94 for (std::size_t insIdx = 0; insIdx < bulkHierarchyIndices.size(); ++insIdx)
96 hierarchyToBulkInsertionIdx_[ bulkHierarchyIndices[insIdx] ] = insIdx;
97 bulkGridHasHierarchyVertex_[ bulkHierarchyIndices[insIdx] ] =
true;
101 bulkVertexIsOnFacetGrid_.resize(bulkGridView.size(BulkGridView::dimension),
false);
102 const auto& facetGridView = embeddings->template gridView<facetGridId>();
103 for (
const auto& v : vertices(facetGridView))
105 const auto insIdx = embeddings->template insertionIndex<facetGridId>(v);
106 const auto hierarchyInsIdx = embeddings->gridHierarchyIndices(facetGridId)[insIdx];
108 if (bulkGridHasHierarchyVertex_[hierarchyInsIdx])
109 bulkVertexIsOnFacetGrid_[ getBulkGridVertexIndex_(hierarchyInsIdx) ] =
true;
113 facetElementCorners_.resize(facetGridView.size(0));
114 facetElementsAtBulkVertex_.resize(bulkGridView.size(BulkGridView::dimension));
116 std::size_t facetElementCounter = 0;
117 for (
const auto& element : elements(facetGridView))
122 const auto numCorners = element.subEntities(FacetGridView::dimension);
123 std::vector<BulkIndexType> cornerIndices(numCorners);
124 for (
int i = 0; i < numCorners; ++i)
125 cornerIndices[i] =
bulkGridVertexIndex(element.template subEntity<FacetGridView::dimension>(i));
128 for (
auto bulkVIdx : cornerIndices)
129 facetElementsAtBulkVertex_[bulkVIdx].push_back(facetElementCounter);
132 std::sort(cornerIndices.begin(), cornerIndices.end());
133 facetElementCorners_[facetElementCounter] = std::move(cornerIndices);
136 facetElementCounter++;
170 bool isOnFacetGrid(
const BulkGridElement& element,
const BulkGridIntersection& intersection)
const
173 const auto refElement = BulkReferenceElements::general(element.type());
174 const auto numCorners = intersection.geometry().corners();
175 const auto facetIdx = intersection.indexInInside();
177 std::vector<BulkIndexType> cornerIndices(numCorners);
178 for (
int i = 0; i < numCorners; ++i)
179 cornerIndices[i] = bulkVertexMapper_.subIndex( element,
180 refElement.subEntity(facetIdx, 1, i, BulkGridView::dimension),
181 BulkGridView::dimension );
196 std::vector<std::size_t> facetElemIndices;
197 for (
auto bulkVIdx : bulkVertexIndices)
198 facetElemIndices.insert( facetElemIndices.end(),
199 facetElementsAtBulkVertex_[bulkVIdx].begin(),
200 facetElementsAtBulkVertex_[bulkVIdx].end() );
203 if (facetElemIndices.size() == 0)
207 std::sort(facetElemIndices.begin(), facetElemIndices.end());
208 facetElemIndices.erase(std::unique(facetElemIndices.begin(), facetElemIndices.end()), facetElemIndices.end());
211 auto cornerIndexCopy = bulkVertexIndices;
212 std::sort(cornerIndexCopy.begin(), cornerIndexCopy.end());
213 for (
const auto& facetElemIdx : facetElemIndices)
215 const auto& facetElemCorners = facetElementCorners_[facetElemIdx];
216 if (facetElemCorners.size() != cornerIndexCopy.size())
219 if ( std::equal(cornerIndexCopy.begin(), cornerIndexCopy.end(),
220 facetElemCorners.begin(), facetElemCorners.end()) )