12#ifndef DUMUX_DISCRETIZATION_FACECENTERED_DIAMOND_FV_ELEMENT_GEOMETRY_HH
13#define DUMUX_DISCRETIZATION_FACECENTERED_DIAMOND_FV_ELEMENT_GEOMETRY_HH
18#include <dune/common/reservedvector.hh>
19#include <dune/common/iteratorrange.hh>
31template<
class GG,
bool cachingEnabled>
42 using GridView =
typename GG::GridView;
45 using FeLocalBasis =
typename GG::FeCache::FiniteElementType::Traits::LocalBasisType;
46 using GGCache =
typename GG::Cache;
47 using GeometryHelper =
typename GGCache::GeometryHelper;
51 using SubControlVolume =
typename GG::SubControlVolume;
52 using SubControlVolumeFace =
typename GG::SubControlVolumeFace;
53 using Element =
typename GridView::template Codim<0>::Entity;
54 using GridGeometry = GG;
57 static constexpr std::size_t maxNumElementScvs = 2*GridView::dimension;
64 const SubControlVolume& scv(LocalIndexType scvIdx)
const
65 {
return ggCache_->scvs(eIdx_)[scvIdx]; }
68 const SubControlVolumeFace& scvf(LocalIndexType scvfIdx)
const
69 {
return ggCache_->scvf(eIdx_)[scvfIdx]; }
77 scvs(
const FaceCenteredDiamondFVElementGeometry& fvGeometry)
79 using Iter =
typename std::vector<SubControlVolume>::const_iterator;
80 const auto& s = fvGeometry.ggCache_->scvs(fvGeometry.eIdx_);
81 return Dune::IteratorRange<Iter>(s.begin(), s.end());
90 scvfs(
const FaceCenteredDiamondFVElementGeometry& fvGeometry)
92 using Iter =
typename std::vector<SubControlVolumeFace>::const_iterator;
93 const auto& s = fvGeometry.ggCache_->scvfs(fvGeometry.eIdx_);
94 return Dune::IteratorRange<Iter>(s.begin(), s.end());
98 const FeLocalBasis& feLocalBasis()
const
100 return gridGeometry().feCache().get(
element().type()).localBasis();
104 std::size_t numScv()
const
106 return ggCache_->scvs(eIdx_).size();
110 std::size_t numScvf()
const
112 return ggCache_->scvfs(eIdx_).size();
116 bool hasBoundaryScvf()
const
117 {
return ggCache_->hasBoundaryScvf(eIdx_); }
124 FaceCenteredDiamondFVElementGeometry bind(
const Element& element) &&
126 this->bindElement(element);
127 return std::move(*
this);
130 void bind(
const Element& element) &
132 this->bindElement(element);
140 FaceCenteredDiamondFVElementGeometry bindElement(
const Element& element) &&
142 this->bindElement(element);
143 return std::move(*
this);
147 void bindElement(
const Element& element) &
150 eIdx_ = gridGeometry().elementMapper().index(element);
155 {
return static_cast<bool>(element_); }
159 {
return *element_; }
162 const GridGeometry& gridGeometry()
const
163 {
return ggCache_->gridGeometry(); }
166 std::size_t elementIndex()
const
170 typename SubControlVolume::Traits::Geometry geometry(
const SubControlVolume& scv)
const
173 const auto geo =
element().geometry();
175 SubControlVolume::Traits::geometryType(geo.type()),
176 GeometryHelper(geo).getScvCorners(scv.indexInElement())
181 typename SubControlVolumeFace::Traits::Geometry geometry(
const SubControlVolumeFace& scvf)
const
184 const auto geo =
element().geometry();
188 const auto localFacetIndex = scvf.insideScvIdx();
190 referenceElement(geo).type(localFacetIndex, 1),
191 GeometryHelper(geo).getBoundaryScvfCorners(localFacetIndex)
197 SubControlVolumeFace::Traits::interiorGeometryType(geo.type()),
198 GeometryHelper(geo).getScvfCorners(scvf.index())
204 std::optional<Element> element_;
206 const GGCache* ggCache_;
Element-wise grid geometry (local view)
Definition discretization/facecentered/diamond/fvelementgeometry.hh:32
Helper class to construct SCVs and SCVFs for the diamond scheme.
Class providing iterators over sub control volumes and sub control volume faces of an element.
typename GridView::IndexSet::IndexType GridIndex
Definition indextraits.hh:27
std::uint_least8_t SmallLocalIndex
Definition indextraits.hh:29