14#ifndef DUMUX_DISCRETIZATION_CCTPFA_FV_ELEMENT_GEOMETRY_HH
15#define DUMUX_DISCRETIZATION_CCTPFA_FV_ELEMENT_GEOMETRY_HH
23#include <dune/common/exceptions.hh>
25#include <dune/common/iteratorrange.hh>
26#include <dune/geometry/referenceelements.hh>
32namespace Detail::Tpfa {
34template<
class Gr
idIndexType>
36 const std::vector<GridIndexType>& indices)
38 auto it = std::find(indices.begin(), indices.end(), idx);
39 assert(it != indices.end() &&
"Could not find the scv/scvf! Make sure to properly bind this class!");
54template<
class GG,
bool enableGr
idGeometryCache>
67 using GridView =
typename GG::GridView;
73 using Element =
typename GridView::template Codim<0>::Entity;
82 static constexpr std::size_t maxNumElementScvs = 1;
84 static constexpr std::size_t maxNumElementScvfs = 2*GridView::dimension;
88 : gridGeometryPtr_(&gridGeometry) {}
94 return gridGeometry().scv(scvIdx);
101 return gridGeometry().scvf(scvfIdx);
108 return gridGeometry().flipScvf(scvfIdx, outsideScvIdx);
116 friend inline Dune::IteratorRange< ScvIterator<SubControlVolume, std::array<GridIndexType, 1>, ThisType> >
120 return Dune::IteratorRange<ScvIterator>(
ScvIterator(fvGeometry.scvIndices_.begin(), fvGeometry),
121 ScvIterator(fvGeometry.scvIndices_.end(), fvGeometry));
125 template<
class LocalDof>
128 using Geometry =
typename Element::Geometry;
129 using Scalar =
typename Geometry::ctype;
130 static constexpr int dim = Geometry::mydimension;
131 const auto& scv = fvGeometry.scv(fvGeometry.scvIndices_[localDof.index()]);
132 const auto& globalPos = scv.dofPosition();
133 const auto localPos = Dune::referenceElement<Scalar, dim>(fvGeometry.element().type()).position(0, 0);
142 friend inline Dune::IteratorRange< ScvfIterator<SubControlVolumeFace, std::vector<GridIndexType>, ThisType> >
145 const auto& g = fvGeometry.gridGeometry();
146 const auto scvIdx = fvGeometry.scvIndices_[0];
148 return Dune::IteratorRange<ScvfIterator>(
ScvfIterator(g.scvfIndicesOfScv(scvIdx).begin(), fvGeometry),
149 ScvfIterator(g.scvfIndicesOfScv(scvIdx).end(), fvGeometry));
155 return scvIndices_.size();
161 return gridGeometry().scvfIndicesOfScv(scvIndices_[0]).size();
171 this->bindElement(element);
172 return std::move(*
this);
177 this->bindElement(element);
187 this->bindElement(element);
188 return std::move(*
this);
195 scvIndices_[0] = gridGeometry().elementMapper().index(*element_);
200 {
return static_cast<bool>(element_); }
204 {
return *element_; }
208 {
return *gridGeometryPtr_; }
212 {
return gridGeometry().hasBoundaryScvf(scvIndices_[0]); }
215 {
return gridGeometryPtr_->element(scv.dofIndex()).geometry(); }
219 const auto element = gridGeometryPtr_->element(scvf.insideScvIdx());
220 const auto& scvfIndices = gridGeometryPtr_->scvfIndicesOfScv(scvf.insideScvIdx());
222 LocalIndexType localIdx = 0;
223 for (
const auto& intersection : intersections(gridGeometryPtr_->gridView(), element))
225 if (intersection.neighbor() || intersection.boundary())
227 if (localIdx == localScvfIdx)
228 return intersection.geometry();
234 DUNE_THROW(Dune::InvalidStateException,
"Could not find scvf geometry");
239 std::optional<Element> element_;
240 std::array<GridIndexType, 1> scvIndices_;
241 const GridGeometry* gridGeometryPtr_;
253 using GridView =
typename GG::GridView;
257 static const int dim = GridView::dimension;
258 static const int dimWorld = GridView::dimensionworld;
262 using Element =
typename GridView::template Codim<0>::Entity;
270 static constexpr std::size_t maxNumElementScvs = 1;
272 static constexpr std::size_t maxNumElementScvfs = 2*dim;
276 : gridGeometryPtr_(&gridGeometry) {}
282 if (scvIdx == scvIndices_[0])
292 auto it = std::find(scvfIndices_.begin(), scvfIndices_.end(), scvfIdx);
293 if (it != scvfIndices_.end())
303 auto it = std::find(scvfIndices_.begin(), scvfIndices_.end(), scvfIdx);
304 if (it != scvfIndices_.end())
306 const auto localScvfIdx =
std::distance(scvfIndices_.begin(), it);
307 return neighborScvfs_[flippedScvfIndices_[localScvfIdx][outsideScvIdx]];
312 const auto localFlippedIndex = flippedNeighborScvfIndices_[localScvfIdx][outsideScvIdx];
313 if (localFlippedIndex < scvfs_.size())
314 return scvfs_[localFlippedIndex];
316 return neighborScvfs_[localFlippedIndex - scvfs_.size()];
325 friend inline Dune::IteratorRange<typename std::array<SubControlVolume, 1>::const_iterator>
328 using IteratorType =
typename std::array<SubControlVolume, 1>::const_iterator;
329 return Dune::IteratorRange<IteratorType>(g.scvs_.begin(), g.scvs_.end());
333 template<
class LocalDof>
336 using Geometry =
typename Element::Geometry;
337 using Scalar =
typename Geometry::ctype;
338 static constexpr int dim = Geometry::mydimension;
339 const auto& globalPos = fvGeometry.scvs_[localDof.index()].dofPosition();
340 const auto localPos = Dune::referenceElement<Scalar, dim>(fvGeometry.
element().type()).position(0, 0);
349 friend inline Dune::IteratorRange<typename std::vector<SubControlVolumeFace>::const_iterator>
352 using IteratorType =
typename std::vector<SubControlVolumeFace>::const_iterator;
353 return Dune::IteratorRange<IteratorType>(g.scvfs_.begin(), g.scvfs_.end());
358 {
return scvs_.size(); }
362 {
return scvfs_.size(); }
371 this->bind_(element);
372 return std::move(*
this);
377 this->bind_(element);
387 this->bindElement_(element);
388 return std::move(*
this);
393 this->bindElement_(element);
398 {
return static_cast<bool>(element_); }
402 {
return *element_; }
406 {
return *gridGeometryPtr_; }
410 {
return hasBoundaryScvf_; }
413 {
return gridGeometryPtr_->element(scv.dofIndex()).geometry(); }
417 const auto element = gridGeometryPtr_->element(scvf.insideScvIdx());
418 const auto& scvfIndices = gridGeometryPtr_->scvfIndicesOfScv(scvf.insideScvIdx());
420 LocalIndexType localIdx = 0;
421 for (
const auto& intersection : intersections(gridGeometryPtr_->gridView(), element))
423 if (intersection.neighbor() || intersection.boundary())
425 if (localIdx == localScvfIdx)
426 return intersection.geometry();
432 DUNE_THROW(Dune::InvalidStateException,
"Could not find scvf geometry");
438 void bind_(
const Element& element)
440 bindElement_(element);
442 neighborScvs_.reserve(element.subEntities(1));
443 neighborScvfIndices_.reserve(element.subEntities(1));
444 neighborScvfs_.reserve(element.subEntities(1));
446 std::vector<GridIndexType> handledNeighbors;
447 handledNeighbors.reserve(element.subEntities(1));
449 for (
const auto& intersection : intersections(gridGeometry().gridView(), element))
452 if (intersection.neighbor())
454 const auto outside = intersection.outside();
455 const auto outsideIdx = gridGeometry().elementMapper().index(outside);
458 if ( std::find(handledNeighbors.begin(), handledNeighbors.end(), outsideIdx) == handledNeighbors.end() )
460 makeNeighborGeometries(outside, outsideIdx);
461 handledNeighbors.push_back(outsideIdx);
467 if (dim < dimWorld || gridGeometry().isPeriodic())
469 flippedScvfIndices_.resize(scvfs_.size());
470 for (
unsigned int localScvfIdx = 0; localScvfIdx < scvfs_.size(); ++localScvfIdx)
472 const auto& scvf = scvfs_[localScvfIdx];
476 flippedScvfIndices_[localScvfIdx].resize(scvf.numOutsideScvs());
477 for (
unsigned int localOutsideScvIdx = 0; localOutsideScvIdx < scvf.numOutsideScvs(); ++localOutsideScvIdx)
479 const auto globalOutsideScvIdx = scvf.outsideScvIdx(localOutsideScvIdx);
480 for (
unsigned int localNeighborScvfIdx = 0; localNeighborScvfIdx < neighborScvfs_.size(); ++localNeighborScvfIdx)
482 if (neighborScvfs_[localNeighborScvfIdx].insideScvIdx() == globalOutsideScvIdx)
484 flippedScvfIndices_[localScvfIdx][localOutsideScvIdx] = localNeighborScvfIdx;
491 flippedNeighborScvfIndices_.resize(neighborScvfs_.size());
492 for (
unsigned int localScvfIdx = 0; localScvfIdx < neighborScvfs_.size(); ++localScvfIdx)
494 const auto& neighborScvf = neighborScvfs_[localScvfIdx];
495 flippedNeighborScvfIndices_[localScvfIdx].resize(neighborScvf.numOutsideScvs());
496 for (
unsigned int localOutsideScvIdx = 0; localOutsideScvIdx < neighborScvf.numOutsideScvs(); ++localOutsideScvIdx)
498 flippedNeighborScvfIndices_[localScvfIdx][localOutsideScvIdx] = findFlippedScvfIndex_(neighborScvf.insideScvIdx(), neighborScvf.outsideScvIdx(localOutsideScvIdx));
505 void bindElement_(
const Element& element)
509 scvfs_.reserve(
element.subEntities(1));
510 scvfIndices_.reserve(
element.subEntities(1));
511 makeElementGeometries(element);
514 GridIndexType findFlippedScvfIndex_(GridIndexType insideScvIdx, GridIndexType globalOutsideScvIdx)
516 for (
unsigned int localNeighborScvfIdx = 0; localNeighborScvfIdx < neighborScvfs_.size(); ++localNeighborScvfIdx)
518 if (neighborScvfs_[localNeighborScvfIdx].insideScvIdx() == globalOutsideScvIdx)
520 return scvfs_.size() + localNeighborScvfIdx;
525 for (
unsigned int localOutsideScvfIdx = 0; localOutsideScvfIdx < scvfs_.size(); ++localOutsideScvfIdx)
527 const auto& outsideScvf = scvfs_[localOutsideScvfIdx];
528 for (
unsigned int j = 0; j < outsideScvf.numOutsideScvs(); ++j)
530 if (outsideScvf.outsideScvIdx(j) == insideScvIdx)
532 return localOutsideScvfIdx;
537 DUNE_THROW(Dune::InvalidStateException,
"No flipped version of this scvf found!");
541 void makeElementGeometries(
const Element& element)
543 using ScvfGridIndexStorage =
typename SubControlVolumeFace::Traits::GridIndexStorage;
545 const auto eIdx = gridGeometry().elementMapper().index(element);
546 scvs_[0] = SubControlVolume(
element.geometry(), eIdx);
547 scvIndices_[0] = eIdx;
549 const auto& scvFaceIndices = gridGeometry().scvfIndicesOfScv(eIdx);
550 const auto& neighborVolVarIndices = gridGeometry().neighborVolVarIndices(eIdx);
555 std::vector<bool> handledScvf;
557 handledScvf.resize(
element.subEntities(1),
false);
560 for (
const auto& intersection : intersections(gridGeometry().gridView(), element))
563 if (handledScvf[intersection.indexInInside()])
566 const auto& scvfNeighborVolVarIndices = neighborVolVarIndices[scvfCounter];
567 if (intersection.neighbor() || intersection.boundary())
569 ScvfGridIndexStorage scvIndices;
570 scvIndices.resize(scvfNeighborVolVarIndices.size() + 1);
571 scvIndices[0] = eIdx;
572 std::copy(scvfNeighborVolVarIndices.begin(), scvfNeighborVolVarIndices.end(), scvIndices.begin()+1);
574 const bool onBoundary = intersection.boundary() && !intersection.neighbor();
575 hasBoundaryScvf_ = (hasBoundaryScvf_ || onBoundary);
577 scvfs_.emplace_back(intersection,
578 intersection.geometry(),
579 scvFaceIndices[scvfCounter],
582 scvfIndices_.emplace_back(scvFaceIndices[scvfCounter]);
587 handledScvf[intersection.indexInInside()] =
true;
593 void makeNeighborGeometries(
const Element& element,
const GridIndexType eIdx)
595 using ScvfGridIndexStorage =
typename SubControlVolumeFace::Traits::GridIndexStorage;
598 neighborScvs_.emplace_back(
element.geometry(), eIdx);
599 neighborScvIndices_.push_back(eIdx);
601 const auto& scvFaceIndices = gridGeometry().scvfIndicesOfScv(eIdx);
602 const auto& neighborVolVarIndices = gridGeometry().neighborVolVarIndices(eIdx);
607 std::vector<bool> handledScvf;
609 handledScvf.resize(
element.subEntities(1),
false);
612 for (
const auto& intersection : intersections(gridGeometry().gridView(), element))
615 if (handledScvf[intersection.indexInInside()])
618 if (intersection.neighbor())
621 const auto& scvfNeighborVolVarIndices = neighborVolVarIndices[scvfCounter];
622 if (scvfNeighborVolVarIndices[0] < gridGeometry().gridView().size(0))
627 if (scvfNeighborVolVarIndices[0] == gridGeometry().elementMapper().index(*element_))
629 ScvfGridIndexStorage scvIndices({eIdx, scvfNeighborVolVarIndices[0]});
630 neighborScvfs_.emplace_back(intersection,
631 intersection.geometry(),
632 scvFaceIndices[scvfCounter],
636 neighborScvfIndices_.push_back(scvFaceIndices[scvfCounter]);
645 for (
unsigned outsideScvIdx = 0; outsideScvIdx < scvfNeighborVolVarIndices.size(); ++outsideScvIdx)
647 if (scvfNeighborVolVarIndices[outsideScvIdx] == gridGeometry().elementMapper().index(*element_))
649 ScvfGridIndexStorage scvIndices;
650 scvIndices.resize(scvfNeighborVolVarIndices.size() + 1);
651 scvIndices[0] = eIdx;
652 std::copy(scvfNeighborVolVarIndices.begin(), scvfNeighborVolVarIndices.end(), scvIndices.begin()+1);
653 neighborScvfs_.emplace_back(intersection,
654 intersection.geometry(),
655 scvFaceIndices[scvfCounter],
659 neighborScvfIndices_.push_back(scvFaceIndices[scvfCounter]);
667 handledScvf[intersection.indexInInside()] =
true;
674 else if (intersection.boundary())
677 handledScvf[intersection.indexInInside()] =
true;
686 scvfIndices_.clear();
688 flippedScvfIndices_.clear();
690 neighborScvIndices_.clear();
691 neighborScvfIndices_.clear();
692 neighborScvs_.clear();
693 neighborScvfs_.clear();
694 flippedNeighborScvfIndices_.clear();
696 hasBoundaryScvf_ =
false;
699 std::optional<Element> element_;
700 const GridGeometry* gridGeometryPtr_;
703 std::array<GridIndexType, 1> scvIndices_;
704 std::array<SubControlVolume, 1> scvs_;
706 std::vector<GridIndexType> scvfIndices_;
707 std::vector<SubControlVolumeFace> scvfs_;
708 std::vector<std::vector<GridIndexType>> flippedScvfIndices_;
710 std::vector<GridIndexType> neighborScvIndices_;
711 std::vector<SubControlVolume> neighborScvs_;
713 std::vector<GridIndexType> neighborScvfIndices_;
714 std::vector<SubControlVolumeFace> neighborScvfs_;
715 std::vector<std::vector<GridIndexType>> flippedNeighborScvfIndices_;
717 bool hasBoundaryScvf_ =
false;
Stencil-local finite volume geometry (scvs and scvfs) for cell-centered TPFA models Specialization fo...
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:251
bool isBound() const
Returns true if bind/bindElement has already been called.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:397
friend Dune::IteratorRange< typename std::vector< SubControlVolumeFace >::const_iterator > scvfs(const ThisType &g)
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:350
const Element & element() const
The bound element.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:401
typename GG::SubControlVolumeFace SubControlVolumeFace
export type of subcontrol volume face
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:266
const SubControlVolume & scv(GridIndexType scvIdx) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:280
Element::Geometry geometry(const SubControlVolume &scv) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:412
std::size_t numScv() const
number of sub control volumes in this fv element geometry
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:357
CCTpfaFVElementGeometry(const GridGeometry &gridGeometry)
Constructor.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:275
GridView::Intersection::Geometry geometry(const SubControlVolumeFace &scvf) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:415
std::size_t numScvf() const
number of sub control volumes in this fv element geometry
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:361
void bindElement(const Element &element) &
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:391
typename GridView::template Codim< 0 >::Entity Element
export type of the element
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:262
CCTpfaFVElementGeometry bind(const Element &element) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:369
friend auto ipData(const ThisType &fvGeometry, const LocalDof &localDof)
Interpolation point data for a localDof.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:334
const GridGeometry & gridGeometry() const
The global finite volume geometry we are a restriction of.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:405
void bind(const Element &element) &
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:375
const SubControlVolumeFace & flipScvf(GridIndexType scvfIdx, unsigned int outsideScvIdx=0) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:301
const SubControlVolumeFace & scvf(GridIndexType scvfIdx) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:290
typename GG::SubControlVolume SubControlVolume
export type of subcontrol volume
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:264
friend Dune::IteratorRange< typename std::array< SubControlVolume, 1 >::const_iterator > scvs(const ThisType &g)
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:326
CCTpfaFVElementGeometry bindElement(const Element &element) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:385
GG GridGeometry
export type of finite volume grid geometry
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:268
bool hasBoundaryScvf() const
Returns whether one of the geometry's scvfs lies on a boundary.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:409
Stencil-local finite volume geometry (scvs and scvfs) for cell-centered TPFA models Specialization fo...
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:65
GridView::Intersection::Geometry geometry(const SubControlVolumeFace &scvf) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:217
CCTpfaFVElementGeometry bindElement(const Element &element) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:185
Element::Geometry geometry(const SubControlVolume &scv) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:214
typename GridView::template Codim< 0 >::Entity Element
export type of the element
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:73
typename GG::SubControlVolumeFace SubControlVolumeFace
export type of subcontrol volume face
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:77
const Element & element() const
The bound element.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:203
void bind(const Element &element) &
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:175
CCTpfaFVElementGeometry(const GridGeometry &gridGeometry)
Constructor.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:87
friend auto ipData(const CCTpfaFVElementGeometry &fvGeometry, const LocalDof &localDof)
Interpolation point data for a localDof.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:126
friend Dune::IteratorRange< ScvfIterator< SubControlVolumeFace, std::vector< GridIndexType >, ThisType > > scvfs(const CCTpfaFVElementGeometry &fvGeometry)
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:143
std::size_t numScv() const
number of sub control volumes in this fv element geometry
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:153
bool hasBoundaryScvf() const
Returns whether one of the geometry's scvfs lies on a boundary.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:211
GG GridGeometry
export type of finite volume grid geometry
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:79
const GridGeometry & gridGeometry() const
The global finite volume geometry we are a restriction of.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:207
std::size_t numScvf() const
number of sub control volumes in this fv element geometry
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:159
bool isBound() const
Returns true if bind/bindElement has already been called.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:199
CCTpfaFVElementGeometry bind(const Element &element) &&
bind the local view (r-value overload) This overload is called when an instance of this class is a te...
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:169
const SubControlVolume & scv(GridIndexType scvIdx) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:92
const SubControlVolumeFace & scvf(GridIndexType scvfIdx) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:99
const SubControlVolumeFace & flipScvf(GridIndexType scvfIdx, unsigned int outsideScvIdx=0) const
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:106
typename GG::SubControlVolume SubControlVolume
export type of subcontrol volume
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:75
void bindElement(const Element &element) &
Bind only element-local.
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:192
friend Dune::IteratorRange< ScvIterator< SubControlVolume, std::array< GridIndexType, 1 >, ThisType > > scvs(const CCTpfaFVElementGeometry &fvGeometry)
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:117
Stencil-local finite volume geometry (scvs and scvfs) for cell-centered TPFA models This builds up th...
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:55
An interpolation point related to a localDof of an element, giving its global and local positions.
Definition: cvfe/interpolationpointdata.hh:60
Iterators over sub control volumes.
Definition: scvandscvfiterators.hh:30
Iterators over sub control volume faces of an fv geometry.
Definition: scvandscvfiterators.hh:70
Classes representing interpolation point data for control-volume finite element schemes.
static ctype distance(const Dune::FieldVector< ctype, dimWorld > &a, const Dune::FieldVector< ctype, dimWorld > &b)
Compute the shortest distance between two points.
Definition: distance.hh:282
auto findLocalIndex(const GridIndexType idx, const std::vector< GridIndexType > &indices)
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:35
Class providing iterators over sub control volumes and sub control volume faces of an element.
typename GridView::IndexSet::IndexType GridIndex
Definition: indextraits.hh:27
unsigned int LocalIndex
Definition: indextraits.hh:28