From 0600399dcaf90f2df2586a54b8a3d5be308fe999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20Gl=C3=A4ser?= <dennis.glaeser@iws.uni-stuttgart.de> Date: Thu, 28 Dec 2023 13:13:03 +0100 Subject: [PATCH] [facet][box] duplicate dofs on fractures that extend the boundary --- dumux/multidomain/facet/vertexmapper.hh | 28 +++++++++++-------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/dumux/multidomain/facet/vertexmapper.hh b/dumux/multidomain/facet/vertexmapper.hh index 4d7aca243e..82cb88f3d5 100644 --- a/dumux/multidomain/facet/vertexmapper.hh +++ b/dumux/multidomain/facet/vertexmapper.hh @@ -77,21 +77,17 @@ public: dim ) ] = true; } - // for now, set all markers to true for vertices on codim one grid - for (const auto& vertex : vertices(codimOneGridView)) - vertexMarkers[codimOneGridAdapter.bulkGridVertexIndex(vertex)] = true; - - // unmark where necessary + // mark all vertices on the lower-dimensional grid to be enriched (except immersed boundaries) + std::vector<typename GridView::IndexSet::IndexType> vertexIndicesStorage; for (const auto& codimOneElement : elements(codimOneGridView)) { - // if a codimension one element has less than two embedments we do not need to enrich - if (codimOneGridAdapter.numEmbedments(codimOneElement) < 2) + // if a codimension one element has 2 or more embedments, we need to enrich + if (codimOneGridAdapter.numEmbedments(codimOneElement) >= 2) + { for (int i = 0; i < codimOneElement.subEntities(dim-1); ++i) - vertexMarkers[ codimOneGridAdapter.bulkGridVertexIndex(codimOneElement.template subEntity<dim-1>(i)) ] = false; + vertexMarkers[ codimOneGridAdapter.bulkGridVertexIndex(codimOneElement.template subEntity<dim-1>(i)) ] = true; - // otherwise, we check for immersed boundaries where we also must not enrich - else - { + // however, we have to exclude immersed boundaries const auto refElem = referenceElement(codimOneElement); for (const auto& intersection : intersections(codimOneGridView, codimOneElement)) { @@ -99,18 +95,18 @@ public: if (!intersection.boundary()) continue; - // obtain all grid indices of the intersection corners + // obtain all bulk grid indices of the lower-dimensional intersection corners const auto numCorners = intersection.geometry().corners(); - std::vector<typename GridView::IndexSet::IndexType> vertexIndices(numCorners); + vertexIndicesStorage.resize(numCorners); for (int i = 0; i < numCorners; ++i) { const auto vIdxLocal = refElem.subEntity(intersection.indexInInside(), 1, i, dim-1); - vertexIndices[i] = codimOneGridAdapter.bulkGridVertexIndex( codimOneElement.template subEntity<dim-1>(vIdxLocal) ); + vertexIndicesStorage[i] = codimOneGridAdapter.bulkGridVertexIndex( codimOneElement.template subEntity<dim-1>(vIdxLocal) ); } // if any of the vertices is on an immersed boundary, we must not enrich any of them - if (std::any_of(vertexIndices.begin(), vertexIndices.end(), [&isOnBoundary] (auto idx) { return !isOnBoundary[idx]; })) - std::for_each(vertexIndices.begin(), vertexIndices.end(), [&vertexMarkers] (auto idx) { vertexMarkers[idx] = false; }); + if (std::any_of(vertexIndicesStorage.begin(), vertexIndicesStorage.end(), [&isOnBoundary] (auto idx) { return !isOnBoundary[idx]; })) + std::for_each(vertexIndicesStorage.begin(), vertexIndicesStorage.end(), [&vertexMarkers] (auto idx) { vertexMarkers[idx] = false; }); } } } -- GitLab