17#ifndef DUMUX_POROUSMEDIUMFLOW_BOXDFM_FV_ELEMENT_GEOMETRY_HH
18#define DUMUX_POROUSMEDIUMFLOW_BOXDFM_FV_ELEMENT_GEOMETRY_HH
24#include <dune/geometry/type.hh>
25#include <dune/localfunctions/lagrange/pqkfactory.hh>
43template<
class GG,
bool enableGr
idGeometryCache>
50 using GridView =
typename GG::GridView;
51 static constexpr int dim = GridView::dimension;
52 static constexpr int dimWorld = GridView::dimensionworld;
55 using CoordScalar =
typename GridView::ctype;
56 using FeLocalBasis =
typename GG::FeCache::FiniteElementType::Traits::LocalBasisType;
57 using GGCache =
typename GG::Cache;
58 using GeometryHelper =
typename GGCache::GeometryHelper;
61 using Element =
typename GridView::template Codim<0>::Entity;
71 static constexpr std::size_t maxNumElementScvs = (1<<dim)*3;
74 [[deprecated(
"This Constructor is deprecated and will be removed after release 3.11. Always use localView(gridGeometry).")]]
80 : ggCache_(&ggCache) {}
84 {
return ggCache_->scvs(eIdx_)[scvIdx]; }
88 {
return ggCache_->scvfs(eIdx_)[scvfIdx]; }
98 friend inline Dune::IteratorRange<typename std::vector<SubControlVolume>::const_iterator>
101 using Iter =
typename std::vector<SubControlVolume>::const_iterator;
102 const auto& s = fvGeometry.ggCache_->scvs(fvGeometry.eIdx_);
103 return Dune::IteratorRange<Iter>(s.begin(), s.end());
107 template<
class LocalDof>
108 friend inline std::ranges::range
auto
111 return std::views::iota(0u, fvGeometry.numScv())
112 | std::views::filter([&](std::size_t i) {
return fvGeometry.scv(i).localDofIndex() == localDof.index(); })
113 | std::views::transform([&](std::size_t i) ->
const SubControlVolume& {
return fvGeometry.scv(i); });
119 return Dune::transformedRangeView(
120 Dune::range(fvGeometry.numLocalDofs()),
121 [&](
const auto i) { return CVFE::LocalDof
123 static_cast<LocalIndexType>(fvGeometry.scv(i).localDofIndex()),
124 static_cast<GridIndexType>(fvGeometry.scv(i).dofIndex()),
125 static_cast<GridIndexType>(fvGeometry.scv(i).elementIndex())
145 friend inline Dune::IteratorRange<typename std::vector<SubControlVolumeFace>::const_iterator>
148 using Iter =
typename std::vector<SubControlVolumeFace>::const_iterator;
149 const auto& s = fvGeometry.ggCache_->scvfs(fvGeometry.eIdx_);
150 return Dune::IteratorRange<Iter>(s.begin(), s.end());
155 {
return gridGeometry().feCache().get(element_->type()).localBasis(); }
159 {
return ggCache_->scvs(eIdx_).size(); }
163 {
return element().geometry().corners(); }
167 {
return ggCache_->scvfs(eIdx_).size(); }
176 this->bindElement(element);
177 return std::move(*
this);
183 { this->bindElement(element); }
192 this->bindElement(element);
193 return std::move(*
this);
205 eIdx_ = gridGeometry().elementMapper().index(element);
210 {
return ggCache_->gridGeometry(); }
214 {
return static_cast<bool>(element_); }
218 {
return *element_; }
223 if (scv.isOnFracture())
224 DUNE_THROW(Dune::InvalidStateException,
"The geometry object cannot be defined for fracture scvs "
225 "because the number of known corners is insufficient. "
226 "You can do this manually by extracting the corners from this scv "
227 "and extruding them by the corresponding aperture. ");
229 const GeometryHelper geometryHelper(element().geometry());
230 const auto corners = geometryHelper.getScvCorners(scv.index());
231 using ScvGeometry =
typename SubControlVolume::Traits::Geometry;
232 return { Dune::GeometryTypes::cube(ScvGeometry::mydimension), corners };
238 if (scvf.isOnFracture())
239 DUNE_THROW(Dune::InvalidStateException,
"The geometry object cannot be defined for fracture scvs "
240 "because the number of known corners is insufficient. "
241 "You can do this manually by extracting the corners from this scv "
242 "and extruding them by the corresponding aperture. ");
243 const GeometryHelper geometryHelper(element().geometry());
244 const auto corners = geometryHelper.getScvfCorners(scvf.indexInElement());
245 using ScvfGeometry =
typename SubControlVolumeFace::Traits::Geometry;
246 return { Dune::GeometryTypes::cube(ScvfGeometry::mydimension), corners };
250 const GGCache* ggCache_;
252 std::optional<Element> element_;
260 using GridView =
typename GG::GridView;
261 static constexpr int dim = GridView::dimension;
262 static constexpr int dimWorld = GridView::dimensionworld;
267 using CoordScalar =
typename GridView::ctype;
268 using FeLocalBasis =
typename GG::FeCache::FiniteElementType::Traits::LocalBasisType;
269 using GGCache =
typename GG::Cache;
270 using GeometryHelper =
typename GGCache::GeometryHelper;
273 using Element =
typename GridView::template Codim<0>::Entity;
282 static constexpr std::size_t maxNumElementScvs = (1<<dim)*3;
285 [[deprecated(
"This Constructor is deprecated and will be removed after release 3.11. Always use localView(gridGeometry).")]]
291 : ggCache_(&ggCache) {}
295 {
return scvs_[scvIdx]; }
299 {
return scvfs_[scvfIdx]; }
309 friend inline Dune::IteratorRange<typename std::vector<SubControlVolume>::const_iterator>
312 using Iter =
typename std::vector<SubControlVolume>::const_iterator;
313 return Dune::IteratorRange<Iter>(fvGeometry.scvs_.begin(), fvGeometry.scvs_.end());
317 template<
class LocalDof>
318 friend inline std::ranges::range
auto
321 return std::views::iota(0u, fvGeometry.numScv())
322 | std::views::filter([&](std::size_t i) {
return fvGeometry.scv(i).localDofIndex() == localDof.index(); })
323 | std::views::transform([&](std::size_t i) ->
const SubControlVolume& {
return fvGeometry.scv(i); });
329 return Dune::transformedRangeView(
330 Dune::range(fvGeometry.numLocalDofs()),
331 [&](
const auto i) { return CVFE::LocalDof
333 static_cast<LocalIndexType>(fvGeometry.scv(i).localDofIndex()),
334 static_cast<GridIndexType>(fvGeometry.scv(i).dofIndex()),
335 static_cast<GridIndexType>(fvGeometry.scv(i).elementIndex())
355 friend inline Dune::IteratorRange<typename std::vector<SubControlVolumeFace>::const_iterator>
358 using Iter =
typename std::vector<SubControlVolumeFace>::const_iterator;
359 return Dune::IteratorRange<Iter>(fvGeometry.scvfs_.begin(), fvGeometry.scvfs_.end());
364 {
return gridGeometry().feCache().get(element_->type()).localBasis(); }
368 {
return scvs_.size(); }
372 {
return element().geometry().corners(); }
376 {
return scvfs_.size(); }
385 this->bindElement(element);
386 return std::move(*
this);
396 { this->bindElement(element); }
405 this->bindElement(element);
406 return std::move(*
this);
416 eIdx_ = gridGeometry().elementMapper().index(element);
417 makeElementGeometries_();
422 {
return ggCache_->gridGeometry(); }
426 {
return static_cast<bool>(element_); }
430 {
return *element_; }
435 if (scv.isOnFracture())
436 DUNE_THROW(Dune::InvalidStateException,
"The geometry object cannot be defined for fracture scvs "
437 "because the number of known corners is insufficient. "
438 "You can do this manually by extracting the corners from this scv "
439 "and extruding them by the corresponding aperture. ");
441 const GeometryHelper geometryHelper(element().geometry());
442 const auto corners = geometryHelper.getScvCorners(scv.index());
443 using ScvGeometry =
typename SubControlVolume::Traits::Geometry;
444 return { Dune::GeometryTypes::cube(ScvGeometry::mydimension), corners };
450 if (scvf.isOnFracture())
451 DUNE_THROW(Dune::InvalidStateException,
"The geometry object cannot be defined for fracture scvs "
452 "because the number of known corners is insufficient. "
453 "You can do this manually by extracting the corners from this scv "
454 "and extruding them by the corresponding aperture. ");
455 const GeometryHelper geometryHelper(element().geometry());
456 const auto corners = geometryHelper.getScvfCorners(scvf.indexInElement());
457 using ScvfGeometry =
typename SubControlVolumeFace::Traits::Geometry;
458 return { Dune::GeometryTypes::cube(ScvfGeometry::mydimension), corners };
463 void makeElementGeometries_()
466 const auto& element = *element_;
467 const auto elementGeometry = element.geometry();
468 const auto refElement = referenceElement(element);
471 GeometryHelper geometryHelper(elementGeometry);
474 scvs_.resize(elementGeometry.corners());
475 for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < elementGeometry.corners(); ++scvLocalIdx)
478 const auto dofIdxGlobal = gridGeometry().vertexMapper().subIndex(element, scvLocalIdx, dim);
481 scvs_[scvLocalIdx] = SubControlVolume(geometryHelper,
488 const auto numInnerScvf = (dim==1) ? 1 : element.subEntities(dim-1);
489 scvfs_.resize(numInnerScvf);
491 LocalIndexType scvfLocalIdx = 0;
492 for (; scvfLocalIdx < numInnerScvf; ++scvfLocalIdx)
495 std::array<LocalIndexType, 2> localScvIndices{{
496 static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 0, dim)),
497 static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 1, dim))
500 scvfs_[scvfLocalIdx] = SubControlVolumeFace(geometryHelper,
503 std::move(localScvIndices));
517 LocalIndexType scvLocalIdx =
element.subEntities(dim);
518 for (
const auto& intersection : intersections(gridGeometry().gridView(), element))
521 const auto& isGeometry = intersection.geometry();
523 const auto idxInInside = intersection.indexInInside();
525 std::vector<GridIndexType> isVertexIndices(
numCorners);
526 for (
unsigned int vIdxLocal = 0; vIdxLocal <
numCorners; ++vIdxLocal)
527 isVertexIndices[vIdxLocal] = gridGeometry().vertexMapper().subIndex(element,
528 refElement.subEntity(idxInInside, 1, vIdxLocal, dim),
531 if (intersection.boundary())
533 for (
unsigned int isScvfLocalIdx = 0; isScvfLocalIdx <
numCorners; ++isScvfLocalIdx)
536 const LocalIndexType insideScvIdx =
static_cast<LocalIndexType
>(refElement.subEntity(idxInInside, 1, isScvfLocalIdx, dim));
537 std::array<LocalIndexType, 2> localScvIndices{{insideScvIdx, insideScvIdx}};
539 scvfs_.emplace_back(geometryHelper,
543 std::move(localScvIndices));
551 if (this->gridGeometry().isOnFracture(element, intersection))
554 const auto curNumScvs = scvs_.size();
556 for (
unsigned int vIdxLocal = 0; vIdxLocal <
numCorners; ++vIdxLocal)
557 scvs_.emplace_back(geometryHelper,
561 static_cast<LocalIndexType
>(refElement.subEntity(idxInInside, 1, vIdxLocal, dim)),
565 isVertexIndices[vIdxLocal]);
570 const auto& faceRefElement = referenceElement(isGeometry);
571 for (
unsigned int edgeIdx = 0; edgeIdx < faceRefElement.size(1); ++edgeIdx)
574 std::array<LocalIndexType, 2> localScvIndices{{
575 static_cast<LocalIndexType
>(faceRefElement.subEntity(edgeIdx, 1, 0, dim-1)),
576 static_cast<LocalIndexType
>(faceRefElement.subEntity(edgeIdx, 1, 1, dim-1))
580 std::for_each( localScvIndices.begin(),
581 localScvIndices.end(),
582 [curNumScvs] (
auto& elemLocalIdx) { elemLocalIdx += curNumScvs; } );
585 scvfs_.emplace_back(geometryHelper,
589 std::move(localScvIndices),
590 intersection.boundary());
598 std::array<LocalIndexType, 2> localScvIndices{{0, 1}};
601 std::for_each( localScvIndices.begin(),
602 localScvIndices.end(),
603 [curNumScvs] (
auto& elemLocalIdx) { elemLocalIdx += curNumScvs; } );
606 scvfs_.emplace_back(geometryHelper,
610 std::move(localScvIndices),
611 intersection.boundary());
618 std::optional<Element> element_;
622 const GGCache* ggCache_;
625 std::vector<SubControlVolume> scvs_;
626 std::vector<SubControlVolumeFace> scvfs_;
friend auto localDofs(const BoxDfmFVElementGeometry &fvGeometry)
range over local dofs
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:327
SubControlVolume::Traits::Geometry geometry(const SubControlVolume &scv) const
Create the geometry of a given sub control volume.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:433
const FeLocalBasis & feLocalBasis() const
Get a local finite element basis.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:363
const GridGeometry & gridGeometry() const
The global finite volume geometry we are a restriction of.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:421
BoxDfmFVElementGeometry(const GGCache &ggCache)
Constructor.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:290
std::size_t numLocalDofs() const
The total number of element-local dofs.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:371
BoxDfmFVElementGeometry 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: porousmediumflow/boxdfm/fvelementgeometry.hh:403
typename GridView::template Codim< 0 >::Entity Element
export type of the element
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:273
std::size_t numScvf() const
The total number of sub control volume faces.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:375
friend auto cvLocalDofs(const BoxDfmFVElementGeometry &fvGeometry)
range over control-volume local dofs
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:341
void bind(const Element &element) &
Binding of an element, has to be called before using the fvgeometries Prepares all the volume variabl...
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:395
const SubControlVolume & scv(LocalIndexType scvIdx) const
Get a sub control volume with a local scv index.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:294
BoxDfmFVElementGeometry 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: porousmediumflow/boxdfm/fvelementgeometry.hh:383
const Element & element() const
The bound element.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:429
SubControlVolumeFace::Traits::Geometry geometry(const SubControlVolumeFace &scvf) const
Create the geometry of a given sub control volume face.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:448
BoxDfmFVElementGeometry(const GridGeometry &gridGeometry)
Constructor.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:286
std::size_t numScv() const
The total number of sub control volumes.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:367
bool isBound() const
Returns true if bind/bindElement has already been called.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:425
friend Dune::IteratorRange< typename std::vector< SubControlVolume >::const_iterator > scvs(const BoxDfmFVElementGeometry &fvGeometry)
Iterator range for sub control volumes.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:310
friend std::ranges::range auto scvs(const BoxDfmFVElementGeometry &fvGeometry, const LocalDof &localDof)
range over sub control volumes related to a local dof.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:319
GG GridGeometry
Export type of finite volume grid geometry.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:279
typename GG::SubControlVolumeFace SubControlVolumeFace
Export type of subcontrol volume face.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:277
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:356
const SubControlVolumeFace & scvf(LocalIndexType scvfIdx) const
Get a sub control volume face with a local scvf index.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:298
typename GG::SubControlVolume SubControlVolume
Export type of subcontrol volume.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:275
void bindElement(const Element &element) &
Binding of an element, has to be called before using the fvgeometries Prepares all the volume variabl...
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:413
typename GG::SubControlVolumeFace SubControlVolumeFace
Export type of subcontrol volume face.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:65
void bindElement(const Element &element) &
Binding of an element, has to be called before using the fvgeometries.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:202
friend auto localDofs(const BoxDfmFVElementGeometry &fvGeometry)
range over local dofs
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:117
std::size_t numScv() const
The total number of sub control volumes.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:158
GG GridGeometry
Export type of finite volume grid geometry.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:67
const Element & element() const
The bound element.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:217
void bind(const Element &element) &
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:182
BoxDfmFVElementGeometry(const GridGeometry &gridGeometry)
Constructor.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:75
std::size_t numLocalDofs() const
The total number of element-local dofs.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:162
std::size_t numScvf() const
The total number of sub control volume faces.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:166
const FeLocalBasis & feLocalBasis() const
Get a local finite element basis.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:154
typename GridView::template Codim< 0 >::Entity Element
export type of the element
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:61
typename GG::SubControlVolume SubControlVolume
Export type of subcontrol volume.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:63
SubControlVolumeFace::Traits::Geometry geometry(const SubControlVolumeFace &scvf) const
Create the geometry of a given sub control volume face.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:236
friend auto cvLocalDofs(const BoxDfmFVElementGeometry &fvGeometry)
range over control-volume local dofs
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:131
const SubControlVolumeFace & scvf(LocalIndexType scvfIdx) const
Get a sub control volume face with a local scvf index.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:87
BoxDfmFVElementGeometry(const GGCache &ggCache)
Constructor.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:79
const SubControlVolume & scv(LocalIndexType scvIdx) const
Get a sub control volume with a local scv index.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:83
BoxDfmFVElementGeometry 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: porousmediumflow/boxdfm/fvelementgeometry.hh:174
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
friend std::ranges::range auto scvs(const BoxDfmFVElementGeometry &fvGeometry, const LocalDof &localDof)
range over sub control volumes related to a local dof.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:109
const GridGeometry & gridGeometry() const
The global finite volume geometry we are a restriction of.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:209
bool isBound() const
Returns true if bind/bindElement has already been called.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:213
SubControlVolume::Traits::Geometry geometry(const SubControlVolume &scv) const
Create the geometry of a given sub control volume.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:221
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:146
BoxDfmFVElementGeometry 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: porousmediumflow/boxdfm/fvelementgeometry.hh:190
Base class for the finite volume geometry vector for box discrete fracture model.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:44
std::size_t numCorners(Shape shape)
Returns the number of corners of a given geometry.
Definition: throatproperties.hh:220
auto localDofs(const FVElementGeometry &fvGeometry)
range over local dofs
Definition: localdof.hh:50
Helper class constructing the dual grid finite volume geometries for the box discrete fracture model.
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