29#ifndef DUMUX_POROUSMEDIUMFLOW_BOXDFM_FV_ELEMENT_GEOMETRY_HH
30#define DUMUX_POROUSMEDIUMFLOW_BOXDFM_FV_ELEMENT_GEOMETRY_HH
32#include <dune/common/version.hh>
33#include <dune/geometry/type.hh>
34#include <dune/geometry/referenceelements.hh>
35#include <dune/localfunctions/lagrange/pqkfactory.hh>
51template<
class GG,
bool enableGr
idGeometryCache>
58 using GridView =
typename GG::GridView;
59 static constexpr int dim = GridView::dimension;
60 static constexpr int dimWorld = GridView::dimensionworld;
61 using GridIndexType =
typename GridView::IndexSet::IndexType;
62 using Element =
typename GridView::template Codim<0>::Entity;
63 using CoordScalar =
typename GridView::ctype;
64 using FeLocalBasis =
typename GG::FeCache::FiniteElementType::Traits::LocalBasisType;
65 using ReferenceElements =
typename Dune::ReferenceElements<CoordScalar, dim>;
76 static constexpr std::size_t maxNumElementScvs = (1<<dim)*3;
80 : gridGeometryPtr_(&gridGeometry) {}
84 {
return gridGeometry().scvs(eIdx_)[scvIdx]; }
88 {
return gridGeometry().scvfs(eIdx_)[scvfIdx]; }
98 friend inline Dune::IteratorRange<typename std::vector<SubControlVolume>::const_iterator>
101 const auto& g = fvGeometry.gridGeometry();
102 using Iter =
typename std::vector<SubControlVolume>::const_iterator;
103 return Dune::IteratorRange<Iter>(g.scvs(fvGeometry.eIdx_).begin(), g.scvs(fvGeometry.eIdx_).end());
114 friend inline Dune::IteratorRange<typename std::vector<SubControlVolumeFace>::const_iterator>
117 const auto& g = fvGeometry.gridGeometry();
118 using Iter =
typename std::vector<SubControlVolumeFace>::const_iterator;
119 return Dune::IteratorRange<Iter>(g.scvfs(fvGeometry.eIdx_).begin(), g.scvfs(fvGeometry.eIdx_).end());
124 {
return gridGeometry().feCache().get(elemGeometryType_).localBasis(); }
128 {
return gridGeometry().scvs(eIdx_).size(); }
132 {
return gridGeometry().scvfs(eIdx_).size(); }
136 void bind(
const Element& element)
138 this->bindElement(element);
149 elemGeometryType_ = element.type();
150 eIdx_ = gridGeometry().elementMapper().index(element);
155 {
return *gridGeometryPtr_; }
158 Dune::GeometryType elemGeometryType_;
159 const GridGeometry* gridGeometryPtr_;
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>;
191 static constexpr std::size_t maxNumElementScvs = (1<<dim)*3;
195 : gridGeometryPtr_(&gridGeometry) {}
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)
251 this->bindElement(element);
262 eIdx_ = gridGeometry().elementMapper().index(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_;
Class providing iterators over sub control volumes and sub control volume faces of an element.
Helper class constructing the dual grid finite volume geometries for the box discrete fracture model.
Base class for the finite volume geometry vector for box discrete fracture model.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:52
typename GG::SubControlVolumeFace SubControlVolumeFace
Export type of subcontrol volume face.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:70
std::size_t numScv() const
The total number of sub control volumes.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:127
void bind(const Element &element)
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:136
void bindElement(const Element &element)
Binding of an element, has to be called before using the fvgeometries.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:147
const SubControlVolumeFace & scvf(std::size_t scvfIdx) const
Get a sub control volume face with a local scvf index.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:87
GG GridGeometry
Export type of finite volume grid geometry.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:72
BoxDfmFVElementGeometry(const GridGeometry &gridGeometry)
Constructor.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:79
std::size_t numScvf() const
The total number of sub control volume faces.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:131
const FeLocalBasis & feLocalBasis() const
Get a local finite element basis.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:123
typename GG::SubControlVolume SubControlVolume
Export type of subcontrol volume.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:68
const SubControlVolume & scv(std::size_t scvIdx) const
Get a sub control volume with a local scv index.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:83
friend Dune::IteratorRange< typename std::vector< SubControlVolume >::const_iterator > scvs(const BoxDfmFVElementGeometry &fvGeometry)
Iterator range for sub control volumes.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:99
const GridGeometry & gridGeometry() const
The global finite volume geometry we are a restriction of.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:154
friend Dune::IteratorRange< typename std::vector< SubControlVolumeFace >::const_iterator > scvfs(const BoxDfmFVElementGeometry &fvGeometry)
Iterator range for sub control volumes faces.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:115
void bindElement(const Element &element)
Binding of an element, has to be called before using the fvgeometries.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:260
const FeLocalBasis & feLocalBasis() const
Get a local finite element basis.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:236
const SubControlVolumeFace & scvf(std::size_t scvfIdx) const
Get a sub control volume face with a local scvf index.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:202
const GridGeometry & gridGeometry() const
The global finite volume geometry we are a restriction of.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:267
void bind(const Element &element)
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:249
std::size_t numScvf() const
The total number of sub control volume faces.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:244
BoxDfmFVElementGeometry(const GridGeometry &gridGeometry)
Constructor.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:194
std::size_t numScv() const
The total number of sub control volumes.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:240
const SubControlVolume & scv(std::size_t scvIdx) const
Get a sub control volume with a local scv index.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:198
friend Dune::IteratorRange< typename std::vector< SubControlVolume >::const_iterator > scvs(const BoxDfmFVElementGeometry &fvGeometry)
Iterator range for sub control volumes.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:214
GG GridGeometry
Export type of finite volume grid geometry.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:188
typename GG::SubControlVolumeFace SubControlVolumeFace
Export type of subcontrol volume face.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:186
friend Dune::IteratorRange< typename std::vector< SubControlVolumeFace >::const_iterator > scvfs(const BoxDfmFVElementGeometry &fvGeometry)
Iterator range for sub control volumes faces.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:229
typename GG::SubControlVolume SubControlVolume
Export type of subcontrol volume.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:184
Create sub control volumes and sub control volume face geometries.
Definition: geometryhelper.hh:35