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;
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(0
u, 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(); }
177 return std::move(*
this);
193 return std::move(*
this);
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. ");
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. ");
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;
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(0
u, 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(); }
386 return std::move(*
this);
406 return std::move(*
this);
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. ");
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. ");
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();
555 scvs_.reserve(curNumScvs+numCorners);
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
static constexpr std::size_t maxNumElementScvs
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:282
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
static constexpr std::size_t maxNumElementScvs
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:71
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
const Scalar PengRobinsonMixture< Scalar, StaticParameters >::u
Definition pengrobinsonmixture.hh:138
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