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);
205 elementGeometry_.emplace(
element.geometry());
211 {
return ggCache_->gridGeometry(); }
215 {
return static_cast<bool>(element_); }
219 {
return *element_; }
223 {
return *elementGeometry_; }
228 if (
scv.isOnFracture())
229 DUNE_THROW(Dune::InvalidStateException,
"The geometry object cannot be defined for fracture scvs "
230 "because the number of known corners is insufficient. "
231 "You can do this manually by extracting the corners from this scv "
232 "and extruding them by the corresponding aperture. ");
235 const auto corners = geometryHelper.getScvCorners(
scv.index());
236 using ScvGeometry =
typename SubControlVolume::Traits::Geometry;
237 return { Dune::GeometryTypes::cube(ScvGeometry::mydimension), corners };
243 if (
scvf.isOnFracture())
244 DUNE_THROW(Dune::InvalidStateException,
"The geometry object cannot be defined for fracture scvs "
245 "because the number of known corners is insufficient. "
246 "You can do this manually by extracting the corners from this scv "
247 "and extruding them by the corresponding aperture. ");
249 const auto corners = geometryHelper.getScvfCorners(
scvf.indexInElement());
250 using ScvfGeometry =
typename SubControlVolumeFace::Traits::Geometry;
251 return { Dune::GeometryTypes::cube(ScvfGeometry::mydimension), corners };
255 const GGCache* ggCache_;
257 std::optional<Element> element_;
258 std::optional<typename Element::Geometry> elementGeometry_;
266 using GridView =
typename GG::GridView;
267 static constexpr int dim = GridView::dimension;
268 static constexpr int dimWorld = GridView::dimensionworld;
273 using CoordScalar =
typename GridView::ctype;
274 using FeLocalBasis =
typename GG::FeCache::FiniteElementType::Traits::LocalBasisType;
275 using GGCache =
typename GG::Cache;
276 using GeometryHelper =
typename GGCache::GeometryHelper;
279 using Element =
typename GridView::template Codim<0>::Entity;
291 [[deprecated(
"This Constructor is deprecated and will be removed after release 3.11. Always use localView(gridGeometry).")]]
297 : ggCache_(&ggCache) {}
301 {
return scvs_[scvIdx]; }
305 {
return scvfs_[scvfIdx]; }
315 friend inline Dune::IteratorRange<typename std::vector<SubControlVolume>::const_iterator>
318 using Iter =
typename std::vector<SubControlVolume>::const_iterator;
319 return Dune::IteratorRange<Iter>(fvGeometry.scvs_.begin(), fvGeometry.scvs_.end());
323 template<
class LocalDof>
324 friend inline std::ranges::range
auto
327 return std::views::iota(0
u, fvGeometry.numScv())
328 | std::views::filter([&](std::size_t i) {
return fvGeometry.scv(i).localDofIndex() == localDof.index(); })
329 | std::views::transform([&](std::size_t i) ->
const SubControlVolume& {
return fvGeometry.scv(i); });
335 return Dune::transformedRangeView(
336 Dune::range(fvGeometry.numLocalDofs()),
337 [&](
const auto i) { return CVFE::LocalDof
339 static_cast<LocalIndexType>(fvGeometry.scv(i).localDofIndex()),
340 static_cast<GridIndexType>(fvGeometry.scv(i).dofIndex()),
341 static_cast<GridIndexType>(fvGeometry.scv(i).elementIndex())
361 friend inline Dune::IteratorRange<typename std::vector<SubControlVolumeFace>::const_iterator>
364 using Iter =
typename std::vector<SubControlVolumeFace>::const_iterator;
365 return Dune::IteratorRange<Iter>(fvGeometry.scvfs_.begin(), fvGeometry.scvfs_.end());
370 {
return gridGeometry().feCache().get(element_->type()).localBasis(); }
374 {
return scvs_.size(); }
378 {
return element().geometry().corners(); }
382 {
return scvfs_.size(); }
392 return std::move(*
this);
412 return std::move(*
this);
422 elementGeometry_.emplace(
element.geometry());
424 makeElementGeometries_();
429 {
return ggCache_->gridGeometry(); }
433 {
return static_cast<bool>(element_); }
437 {
return *element_; }
441 {
return *elementGeometry_; }
446 if (
scv.isOnFracture())
447 DUNE_THROW(Dune::InvalidStateException,
"The geometry object cannot be defined for fracture scvs "
448 "because the number of known corners is insufficient. "
449 "You can do this manually by extracting the corners from this scv "
450 "and extruding them by the corresponding aperture. ");
453 const auto corners = geometryHelper.getScvCorners(
scv.index());
454 using ScvGeometry =
typename SubControlVolume::Traits::Geometry;
455 return { Dune::GeometryTypes::cube(ScvGeometry::mydimension), corners };
461 if (
scvf.isOnFracture())
462 DUNE_THROW(Dune::InvalidStateException,
"The geometry object cannot be defined for fracture scvs "
463 "because the number of known corners is insufficient. "
464 "You can do this manually by extracting the corners from this scv "
465 "and extruding them by the corresponding aperture. ");
467 const auto corners = geometryHelper.getScvfCorners(
scvf.indexInElement());
468 using ScvfGeometry =
typename SubControlVolumeFace::Traits::Geometry;
469 return { Dune::GeometryTypes::cube(ScvfGeometry::mydimension), corners };
474 void makeElementGeometries_()
477 const auto& element = *element_;
478 const auto elementGeometry = element.geometry();
479 const auto refElement = referenceElement(element);
482 GeometryHelper geometryHelper(elementGeometry);
485 scvs_.resize(elementGeometry.corners());
486 for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < elementGeometry.corners(); ++scvLocalIdx)
489 const auto dofIdxGlobal = gridGeometry().vertexMapper().subIndex(element, scvLocalIdx, dim);
492 scvs_[scvLocalIdx] = SubControlVolume(geometryHelper,
499 const auto numInnerScvf = (dim==1) ? 1 : element.subEntities(dim-1);
500 scvfs_.resize(numInnerScvf);
502 LocalIndexType scvfLocalIdx = 0;
503 for (; scvfLocalIdx < numInnerScvf; ++scvfLocalIdx)
506 std::array<LocalIndexType, 2> localScvIndices{{
507 static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 0, dim)),
508 static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 1, dim))
511 scvfs_[scvfLocalIdx] = SubControlVolumeFace(geometryHelper,
514 std::move(localScvIndices));
528 LocalIndexType scvLocalIdx =
element.subEntities(dim);
529 for (
const auto& intersection : intersections(gridGeometry().gridView(), element))
532 const auto& isGeometry = intersection.geometry();
534 const auto idxInInside = intersection.indexInInside();
536 std::vector<GridIndexType> isVertexIndices(numCorners);
537 for (
unsigned int vIdxLocal = 0; vIdxLocal <
numCorners; ++vIdxLocal)
538 isVertexIndices[vIdxLocal] = gridGeometry().vertexMapper().subIndex(element,
539 refElement.subEntity(idxInInside, 1, vIdxLocal, dim),
542 if (intersection.boundary())
544 for (
unsigned int isScvfLocalIdx = 0; isScvfLocalIdx <
numCorners; ++isScvfLocalIdx)
547 const LocalIndexType insideScvIdx =
static_cast<LocalIndexType
>(refElement.subEntity(idxInInside, 1, isScvfLocalIdx, dim));
548 std::array<LocalIndexType, 2> localScvIndices{{insideScvIdx, insideScvIdx}};
550 scvfs_.emplace_back(geometryHelper,
554 std::move(localScvIndices));
562 if (this->gridGeometry().isOnFracture(element, intersection))
565 const auto curNumScvs = scvs_.size();
566 scvs_.reserve(curNumScvs+numCorners);
567 for (
unsigned int vIdxLocal = 0; vIdxLocal <
numCorners; ++vIdxLocal)
568 scvs_.emplace_back(geometryHelper,
572 static_cast<LocalIndexType
>(refElement.subEntity(idxInInside, 1, vIdxLocal, dim)),
576 isVertexIndices[vIdxLocal]);
581 const auto& faceRefElement = referenceElement(isGeometry);
582 for (
unsigned int edgeIdx = 0; edgeIdx < faceRefElement.size(1); ++edgeIdx)
585 std::array<LocalIndexType, 2> localScvIndices{{
586 static_cast<LocalIndexType
>(faceRefElement.subEntity(edgeIdx, 1, 0, dim-1)),
587 static_cast<LocalIndexType
>(faceRefElement.subEntity(edgeIdx, 1, 1, dim-1))
591 std::for_each( localScvIndices.begin(),
592 localScvIndices.end(),
593 [curNumScvs] (
auto& elemLocalIdx) { elemLocalIdx += curNumScvs; } );
596 scvfs_.emplace_back(geometryHelper,
600 std::move(localScvIndices),
601 intersection.boundary());
609 std::array<LocalIndexType, 2> localScvIndices{{0, 1}};
612 std::for_each( localScvIndices.begin(),
613 localScvIndices.end(),
614 [curNumScvs] (
auto& elemLocalIdx) { elemLocalIdx += curNumScvs; } );
617 scvfs_.emplace_back(geometryHelper,
621 std::move(localScvIndices),
622 intersection.boundary());
629 std::optional<Element> element_;
630 std::optional<typename Element::Geometry> elementGeometry_;
634 const GGCache* ggCache_;
637 std::vector<SubControlVolume> scvs_;
638 std::vector<SubControlVolumeFace> scvfs_;
friend auto localDofs(const BoxDfmFVElementGeometry &fvGeometry)
range over local dofs
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:333
SubControlVolume::Traits::Geometry geometry(const SubControlVolume &scv) const
Create the geometry of a given sub control volume.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:444
const Element::Geometry & elementGeometry() const
The geometry of the bound element.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:440
const FeLocalBasis & feLocalBasis() const
Get a local finite element basis.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:369
const GridGeometry & gridGeometry() const
The global finite volume geometry we are a restriction of.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:428
BoxDfmFVElementGeometry(const GGCache &ggCache)
Constructor.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:296
static constexpr std::size_t maxNumElementScvs
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:288
std::size_t numLocalDofs() const
The total number of element-local dofs.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:377
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:409
typename GridView::template Codim< 0 >::Entity Element
export type of the element
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:279
std::size_t numScvf() const
The total number of sub control volume faces.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:381
friend auto cvLocalDofs(const BoxDfmFVElementGeometry &fvGeometry)
range over control-volume local dofs
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:347
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:401
const SubControlVolume & scv(LocalIndexType scvIdx) const
Get a sub control volume with a local scv index.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:300
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:389
const Element & element() const
The bound element.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:436
SubControlVolumeFace::Traits::Geometry geometry(const SubControlVolumeFace &scvf) const
Create the geometry of a given sub control volume face.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:459
BoxDfmFVElementGeometry(const GridGeometry &gridGeometry)
Constructor.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:292
std::size_t numScv() const
The total number of sub control volumes.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:373
bool isBound() const
Returns true if bind/bindElement has already been called.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:432
friend Dune::IteratorRange< typename std::vector< SubControlVolume >::const_iterator > scvs(const BoxDfmFVElementGeometry &fvGeometry)
Iterator range for sub control volumes.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:316
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:325
GG GridGeometry
Export type of finite volume grid geometry.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:285
typename GG::SubControlVolumeFace SubControlVolumeFace
Export type of subcontrol volume face.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:283
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:362
const SubControlVolumeFace & scvf(LocalIndexType scvfIdx) const
Get a sub control volume face with a local scvf index.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:304
typename GG::SubControlVolume SubControlVolume
Export type of subcontrol volume.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:281
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:419
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:218
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:241
const Element::Geometry & elementGeometry() const
The geometry of the bound element.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:222
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:210
bool isBound() const
Returns true if bind/bindElement has already been called.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:214
SubControlVolume::Traits::Geometry geometry(const SubControlVolume &scv) const
Create the geometry of a given sub control volume.
Definition porousmediumflow/boxdfm/fvelementgeometry.hh:226
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