25#ifndef DUMUX_FACETCOUPLING_CODIM_ONE_GRID_ADAPTER_HH
26#define DUMUX_FACETCOUPLING_CODIM_ONE_GRID_ADAPTER_HH
32#include <dune/grid/common/mcmgmapper.hh>
33#include <dune/geometry/referenceelements.hh>
51template<
class Embeddings,
int bulkGr
idId = 0,
int facetGr
idId = 1>
55 using FacetGridView =
typename Embeddings::template GridView<facetGridId>;
56 using FacetGridVertex =
typename FacetGridView::template Codim<FacetGridView::dimension>::Entity;
57 using FacetGridElement =
typename FacetGridView::template Codim<0>::Entity;
61 using BulkGridView =
typename Embeddings::template GridView<bulkGridId>;
62 using BulkMapper = Dune::MultipleCodimMultipleGeomTypeMapper<BulkGridView>;
63 using BulkReferenceElements =
typename Dune::ReferenceElements<typename BulkGridView::ctype, BulkGridView::dimension>;
64 using BulkGridElement =
typename BulkGridView::template Codim<0>::Entity;
65 using BulkGridIntersection =
typename BulkGridView::Intersection;
66 using BulkGridVertex =
typename BulkGridView::template Codim<BulkGridView::dimension>::Entity;
70 static_assert( int(FacetGridView::dimension) == int(BulkGridView::dimension) - 1,
71 "Grid dimension mismatch! Please check the provided domain ids!" );
72 static_assert( int(FacetGridView::dimensionworld) == int(BulkGridView::dimensionworld),
73 "Grid world dimension mismatch! All grids must have the same world dimension" );
79 : embeddingsPtr_(embeddings)
80 , bulkVertexMapper_(embeddings->template gridView<bulkGridId>(),
Dune::mcmgVertexLayout())
83 const auto& bulkGridView = embeddings->template gridView<bulkGridId>();
84 bulkInsertionToGridVIdx_.resize(bulkGridView.size(BulkGridView::dimension));
85 for (
const auto& v : vertices(bulkGridView))
86 bulkInsertionToGridVIdx_[embeddings->template insertionIndex<bulkGridId>(v)] = bulkVertexMapper_.index(v);
92 hierarchyToBulkInsertionIdx_.resize(embeddingsPtr_->numVerticesInHierarchy());
93 bulkGridHasHierarchyVertex_.resize(embeddingsPtr_->numVerticesInHierarchy(),
false);
94 const auto& bulkHierarchyIndices = embeddingsPtr_->gridHierarchyIndices(bulkGridId);
95 for (std::size_t insIdx = 0; insIdx < bulkHierarchyIndices.size(); ++insIdx)
97 hierarchyToBulkInsertionIdx_[ bulkHierarchyIndices[insIdx] ] = insIdx;
98 bulkGridHasHierarchyVertex_[ bulkHierarchyIndices[insIdx] ] =
true;
102 bulkVertexIsOnFacetGrid_.resize(bulkGridView.size(BulkGridView::dimension),
false);
103 const auto& facetGridView = embeddings->template gridView<facetGridId>();
104 for (
const auto& v : vertices(facetGridView))
106 const auto insIdx = embeddings->template insertionIndex<facetGridId>(v);
107 const auto hierarchyInsIdx = embeddings->gridHierarchyIndices(facetGridId)[insIdx];
109 if (bulkGridHasHierarchyVertex_[hierarchyInsIdx])
110 bulkVertexIsOnFacetGrid_[ getBulkGridVertexIndex_(hierarchyInsIdx) ] =
true;
114 facetElementCorners_.resize(facetGridView.size(0));
115 facetElementsAtBulkVertex_.resize(bulkGridView.size(BulkGridView::dimension));
117 std::size_t facetElementCounter = 0;
118 for (
const auto& element : elements(facetGridView))
123 const auto numCorners = element.subEntities(FacetGridView::dimension);
124 std::vector<BulkIndexType> cornerIndices(numCorners);
125 for (
int i = 0; i < numCorners; ++i)
126 cornerIndices[i] =
bulkGridVertexIndex(element.template subEntity<FacetGridView::dimension>(i));
129 for (
auto bulkVIdx : cornerIndices)
130 facetElementsAtBulkVertex_[bulkVIdx].push_back(facetElementCounter);
133 std::sort(cornerIndices.begin(), cornerIndices.end());
134 facetElementCorners_[facetElementCounter] = std::move(cornerIndices);
137 facetElementCounter++;
149 const auto insIdx = embeddingsPtr_->template insertionIndex<facetGridId>(v);
150 const auto hierarchyInsIdx = embeddingsPtr_->gridHierarchyIndices(facetGridId)[insIdx];
151 return getBulkGridVertexIndex_(hierarchyInsIdx);
160 const auto bulkInsIdx = embeddingsPtr_->template insertionIndex<bulkGridId>(v);
161 const auto bulkVIdx = bulkInsertionToGridVIdx_[bulkInsIdx];
162 return bulkVertexIsOnFacetGrid_[bulkVIdx];
171 bool isOnFacetGrid(
const BulkGridElement& element,
const BulkGridIntersection& intersection)
const
174 const auto refElement = BulkReferenceElements::general(element.type());
175 const auto numCorners = intersection.geometry().corners();
176 const auto facetIdx = intersection.indexInInside();
178 std::vector<BulkIndexType> cornerIndices(numCorners);
179 for (
int i = 0; i < numCorners; ++i)
180 cornerIndices[i] = bulkVertexMapper_.subIndex( element,
181 refElement.subEntity(facetIdx, 1, i, BulkGridView::dimension),
182 BulkGridView::dimension );
193 template<
class IndexStorage>
197 std::vector<std::size_t> facetElemIndices;
198 for (
auto bulkVIdx : bulkVertexIndices)
199 facetElemIndices.insert( facetElemIndices.end(),
200 facetElementsAtBulkVertex_[bulkVIdx].begin(),
201 facetElementsAtBulkVertex_[bulkVIdx].end() );
204 if (facetElemIndices.size() == 0)
208 std::sort(facetElemIndices.begin(), facetElemIndices.end());
209 facetElemIndices.erase(std::unique(facetElemIndices.begin(), facetElemIndices.end()), facetElemIndices.end());
212 auto cornerIndexCopy = bulkVertexIndices;
213 std::sort(cornerIndexCopy.begin(), cornerIndexCopy.end());
214 for (
const auto& facetElemIdx : facetElemIndices)
216 const auto& facetElemCorners = facetElementCorners_[facetElemIdx];
217 if (facetElemCorners.size() != cornerIndexCopy.size())
220 if ( std::equal(cornerIndexCopy.begin(), cornerIndexCopy.end(),
221 facetElemCorners.begin(), facetElemCorners.end()) )
241 {
return embeddingsPtr_->template adjoinedEntityIndices<facetGridId>(e).size(); }
245 BulkIndexType getBulkGridVertexIndex_(BulkIndexType hierarchyInsertionIdx)
const
247 assert(bulkGridHasHierarchyVertex_[hierarchyInsertionIdx]);
248 return bulkInsertionToGridVIdx_[ hierarchyToBulkInsertionIdx_[hierarchyInsertionIdx] ];
252 std::shared_ptr<const Embeddings> embeddingsPtr_;
255 BulkMapper bulkVertexMapper_;
258 std::vector<bool> bulkVertexIsOnFacetGrid_;
259 std::vector<BulkIndexType> bulkInsertionToGridVIdx_;
260 std::vector<BulkIndexType> hierarchyToBulkInsertionIdx_;
261 std::vector<bool> bulkGridHasHierarchyVertex_;
264 std::vector< std::vector<BulkIndexType> > facetElementsAtBulkVertex_;
265 std::vector< std::vector<BulkIndexType> > facetElementCorners_;
Defines the index types used for grid and local indices.
Definition: common/pdesolver.hh:35
typename GridView::IndexSet::IndexType GridIndex
Definition: indextraits.hh:39
Adapter that allows retrieving information on a d-dimensional grid for entities of a (d-1)-dimensiona...
Definition: codimonegridadapter.hh:53
bool composeFacetElement(const IndexStorage &bulkVertexIndices) const
Returns true if a given set of bulk vertex indices make up a facet grid element.
Definition: codimonegridadapter.hh:194
bool isOnFacetGrid(const BulkGridVertex &v) const
Returns true if the vertex of the d-dimensional grid with the given vertex index also exists on the (...
Definition: codimonegridadapter.hh:158
CodimOneGridAdapter(std::shared_ptr< const Embeddings > embeddings)
The constructor.
Definition: codimonegridadapter.hh:78
bool isEmbedded(const FacetGridElement &e) const
Returns true if a (d-1)-dimensional element is embedded in the d-dimensional domain.
Definition: codimonegridadapter.hh:233
bool isOnFacetGrid(const BulkGridElement &element, const BulkGridIntersection &intersection) const
Returns true if the given intersection coincides with a facet grid.
Definition: codimonegridadapter.hh:171
std::size_t numEmbedments(const FacetGridElement &e) const
Returns the number of d-dimensional elements in which the given (d-1)-dimensional element is embedded...
Definition: codimonegridadapter.hh:240
BulkIndexType bulkGridVertexIndex(const FacetGridVertex &v) const
Returns the index within the d-dimensional grid of a vertex of the (d-1)-dimensional grid.
Definition: codimonegridadapter.hh:147