167 using GridView =
typename GG::GridView;
168 static constexpr int dim = GridView::dimension;
169 static constexpr int dimWorld = GridView::dimensionworld;
171 using GridIndexType =
typename GridView::IndexSet::IndexType;
172 using Element =
typename GridView::template Codim<0>::Entity;
174 using CoordScalar =
typename GridView::ctype;
175 using FeLocalBasis =
typename GG::FeCache::FiniteElementType::Traits::LocalBasisType;
176 using ReferenceElements =
typename Dune::ReferenceElements<CoordScalar, dim>;
177 using FaceReferenceElements =
typename Dune::ReferenceElements<CoordScalar, dim-1>;
180 typename GG::SubControlVolume,
181 typename GG::SubControlVolumeFace>;
199 {
return scvs_[scvIdx]; }
203 {
return scvfs_[scvfIdx]; }
213 friend inline Dune::IteratorRange<typename std::vector<SubControlVolume>::const_iterator>
216 using Iter =
typename std::vector<SubControlVolume>::const_iterator;
217 return Dune::IteratorRange<Iter>(fvGeometry.scvs_.begin(), fvGeometry.scvs_.end());
228 friend inline Dune::IteratorRange<typename std::vector<SubControlVolumeFace>::const_iterator>
231 using Iter =
typename std::vector<SubControlVolumeFace>::const_iterator;
232 return Dune::IteratorRange<Iter>(fvGeometry.scvfs_.begin(), fvGeometry.scvfs_.end());
237 {
return gridGeometry().feCache().get(elemGeometryType_).localBasis(); }
241 {
return scvs_.size(); }
245 {
return scvfs_.size(); }
249 void bind(
const Element& element)
263 makeElementGeometries(element);
268 {
return *gridGeometryPtr_; }
272 void makeElementGeometries(
const Element& element)
274 auto eIdx = gridGeometry().elementMapper().index(element);
277 auto elementGeometry = element.geometry();
278 elemGeometryType_ = elementGeometry.type();
279 const auto referenceElement = ReferenceElements::general(elemGeometryType_);
282 GeometryHelper geometryHelper(elementGeometry);
285 scvs_.resize(elementGeometry.corners());
286 using LocalIndexType =
typename SubControlVolumeFace::Traits::LocalIndexType;
287 for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < elementGeometry.corners(); ++scvLocalIdx)
290 const auto dofIdxGlobal = gridGeometry().vertexMapper().subIndex(element, scvLocalIdx, dim);
293 scvs_[scvLocalIdx] = SubControlVolume(geometryHelper,
300 const auto numInnerScvf = (dim==1) ? 1 : element.subEntities(dim-1);
301 scvfs_.resize(numInnerScvf);
303 unsigned int scvfLocalIdx = 0;
304 for (; scvfLocalIdx < numInnerScvf; ++scvfLocalIdx)
307 std::vector<LocalIndexType> localScvIndices({
static_cast<LocalIndexType
>(referenceElement.subEntity(scvfLocalIdx, dim-1, 0, dim)),
308 static_cast<LocalIndexType
>(referenceElement.subEntity(scvfLocalIdx, dim-1, 1, dim))});
310 scvfs_[scvfLocalIdx] = SubControlVolumeFace(geometryHelper,
314 std::move(localScvIndices));
328 LocalIndexType scvLocalIdx = element.subEntities(dim);
329 for (
const auto& intersection : intersections(gridGeometry().gridView(), element))
332 const auto& isGeometry = intersection.geometry();
333 const auto numCorners = isGeometry.corners();
334 const auto idxInInside = intersection.indexInInside();
336 std::vector<GridIndexType> isVertexIndices(numCorners);
337 for (
unsigned int vIdxLocal = 0; vIdxLocal < numCorners; ++vIdxLocal)
338 isVertexIndices[vIdxLocal] = gridGeometry().vertexMapper().subIndex(element,
339 referenceElement.subEntity(idxInInside, 1, vIdxLocal, dim),
342 if (intersection.boundary())
344 for (
unsigned int isScvfLocalIdx = 0; isScvfLocalIdx < numCorners; ++isScvfLocalIdx)
347 const LocalIndexType insideScvIdx =
static_cast<LocalIndexType
>(referenceElement.subEntity(idxInInside, 1, isScvfLocalIdx, dim));
348 std::vector<LocalIndexType> localScvIndices = {insideScvIdx, insideScvIdx};
350 scvfs_.emplace_back(geometryHelper,
355 std::move(localScvIndices));
363 if (this->gridGeometry().isOnFracture(element, intersection))
366 const auto curNumScvs = scvs_.size();
367 scvs_.reserve(curNumScvs+numCorners);
368 for (
unsigned int vIdxLocal = 0; vIdxLocal < numCorners; ++vIdxLocal)
369 scvs_.emplace_back(geometryHelper,
373 static_cast<LocalIndexType
>(referenceElement.subEntity(idxInInside, 1, vIdxLocal, dim)),
377 isVertexIndices[vIdxLocal]);
382 const auto& faceReferenceElement = FaceReferenceElements::general(isGeometry.type());
383 for (
unsigned int edgeIdx = 0; edgeIdx < faceReferenceElement.size(1); ++edgeIdx)
386 std::vector<LocalIndexType> localScvIndices({
static_cast<LocalIndexType
>(faceReferenceElement.subEntity(edgeIdx, 1, 0, dim-1)),
387 static_cast<LocalIndexType
>(faceReferenceElement.subEntity(edgeIdx, 1, 1, dim-1))});
390 std::for_each( localScvIndices.begin(),
391 localScvIndices.end(),
392 [curNumScvs] (
auto& elemLocalIdx) { elemLocalIdx += curNumScvs; } );
395 scvfs_.emplace_back(geometryHelper,
400 std::move(localScvIndices),
401 intersection.boundary());
409 std::vector<LocalIndexType> localScvIndices({0, 1});
412 std::for_each( localScvIndices.begin(),
413 localScvIndices.end(),
414 [curNumScvs] (
auto& elemLocalIdx) { elemLocalIdx += curNumScvs; } );
417 scvfs_.emplace_back(geometryHelper,
422 std::move(localScvIndices),
423 intersection.boundary());
430 Dune::GeometryType elemGeometryType_;
434 const GridGeometry* gridGeometryPtr_;
443 std::vector<SubControlVolume> scvs_;
444 std::vector<SubControlVolumeFace> scvfs_;