14#ifndef DUMUX_DISCRETIZATION_BOX_GRID_FVGEOMETRY_HH
15#define DUMUX_DISCRETIZATION_BOX_GRID_FVGEOMETRY_HH
18#include <unordered_map>
23#include <dune/localfunctions/lagrange/lagrangelfecache.hh>
41template<
class GV,
class T>
53template<
class Gr
idView,
class ScvRule = Dumux::QuadratureRules::M
idpo
intQuadrature,
class ScvfRule = Dumux::QuadratureRules::M
idpo
intQuadrature>
62template<
class Gr
idView,
class MapperTraits = DefaultMapperTraits<Gr
idView>,
class QuadratureTraits = BoxQuadratureTraits<Gr
idView>>
64:
public MapperTraits,
public QuadratureTraits
69 template<
class Gr
idGeometry,
bool enableCache>
81 bool enableGridGeometryCache =
false,
91template<
class Scalar,
class GV,
class Traits>
100 using Element =
typename GV::template Codim<0>::Entity;
101 using CoordScalar =
typename GV::ctype;
102 static const int dim = GV::dimension;
103 static const int dimWorld = GV::dimensionworld;
125 using FeCache = Dune::LagrangeLocalFiniteElementCache<CoordScalar, Scalar, dim, 1>;
139 , periodicGridTraits_(this->gridView().grid())
152 {
return this->vertexMapper(); }
165 {
return numBoundaryScvf_; }
169 {
return this->vertexMapper().size(); }
175 ParentType::update(gridView);
182 ParentType::update(std::move(gridView));
192 {
return boundaryDofIndices_[dofIdx]; }
196 {
return periodicDofMap_.count(dofIdx); }
200 {
return periodicDofMap_.at(dofIdx); }
204 {
return periodicDofMap_; }
208 {
return { gg.cache_ }; }
212 class BoxGridGeometryCache
223 const BoxFVGridGeometry& gridGeometry()
const
224 {
return *gridGeometry_; }
227 const std::vector<SubControlVolume>&
scvs(GridIndexType eIdx)
const
228 {
return scvs_[eIdx]; }
231 const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx)
const
232 {
return scvfs_[eIdx]; }
235 bool hasBoundaryScvf(GridIndexType eIdx)
const
236 {
return hasBoundaryScvf_[eIdx]; }
239 const std::vector<std::array<LocalIndexType, 2>>& scvfBoundaryGeometryKeys(GridIndexType eIdx)
const
240 {
return scvfBoundaryGeometryKeys_.at(eIdx); }
243 auto boundaryFaces(GridIndexType eIdx)
const -> std::span<const BoundaryFace>
245 if (
auto it = boundaryFaces_.find(eIdx); it != boundaryFaces_.end())
255 hasBoundaryScvf_.clear();
256 scvfBoundaryGeometryKeys_.clear();
257 boundaryFaces_.clear();
260 std::vector<std::vector<SubControlVolume>> scvs_;
261 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
262 std::vector<bool> hasBoundaryScvf_;
263 std::unordered_map<GridIndexType, std::vector<std::array<LocalIndexType, 2>>> scvfBoundaryGeometryKeys_;
264 std::unordered_map<GridIndexType, Dune::ReservedVector<typename BoxFVGridGeometry::BoundaryFace, 2*dim>> boundaryFaces_;
266 const BoxFVGridGeometry* gridGeometry_;
275 using GeometryHelper =
typename Cache::GeometryHelper;
281 const auto numElements = this->gridView().size(0);
282 cache_.scvs_.resize(numElements);
283 cache_.scvfs_.resize(numElements);
284 cache_.hasBoundaryScvf_.resize(numElements,
false);
286 boundaryDofIndices_.assign(numDofs(),
false);
290 numBoundaryScvf_ = 0;
292 for (
const auto& element : elements(this->gridView()))
295 const auto eIdx = this->elementMapper().index(element);
298 numScv_ += element.subEntities(dim);
299 numScvf_ += element.subEntities(dim-1);
302 auto elementGeometry = element.geometry();
303 const auto refElement = referenceElement(elementGeometry);
306 GeometryHelper geometryHelper(elementGeometry);
309 cache_.scvs_[eIdx].resize(elementGeometry.corners());
310 for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < elementGeometry.corners(); ++scvLocalIdx)
312 const auto dofIdxGlobal = this->vertexMapper().subIndex(element, scvLocalIdx, dim);
315 geometryHelper.getScvCorners(scvLocalIdx),
323 LocalIndexType scvfLocalIdx = 0;
324 cache_.scvfs_[eIdx].resize(element.subEntities(dim-1));
325 for (; scvfLocalIdx < element.subEntities(dim-1); ++scvfLocalIdx)
328 std::array<LocalIndexType, 2> localScvIndices{{
329 static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 0, dim)),
330 static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 1, dim))
333 const auto& corners = geometryHelper.getScvfCorners(scvfLocalIdx);
336 geometryHelper.normal(corners, localScvIndices),
339 std::move(localScvIndices)
344 LocalIndexType numBoundaryFaces = 0;
345 for (
const auto& intersection : intersections(this->gridView(), element))
347 if (intersection.boundary() && !intersection.neighbor())
349 const auto isGeometry = intersection.geometry();
350 cache_.hasBoundaryScvf_[eIdx] =
true;
356 intersection.centerUnitOuterNormal(),
358 static_cast<LocalIndexType
>(intersection.indexInInside()),
359 typename BoundaryFace::Traits::BoundaryFlag{intersection}
363 numScvf_ += isGeometry.corners();
364 numBoundaryScvf_ += isGeometry.corners();
366 for (
unsigned int isScvfLocalIdx = 0; isScvfLocalIdx < isGeometry.corners(); ++isScvfLocalIdx)
369 const LocalIndexType insideScvIdx =
static_cast<LocalIndexType
>(refElement.subEntity(intersection.indexInInside(), 1, isScvfLocalIdx, dim));
370 std::array<LocalIndexType, 2> localScvIndices{{insideScvIdx, insideScvIdx}};
372 cache_.scvfs_[eIdx].emplace_back(
373 geometryHelper.getBoundaryScvfCorners(intersection.indexInInside(), isScvfLocalIdx),
374 intersection.centerUnitOuterNormal(),
378 std::move(localScvIndices)
381 cache_.scvfBoundaryGeometryKeys_[eIdx].emplace_back(std::array<LocalIndexType, 2>{{
382 static_cast<LocalIndexType
>(intersection.indexInInside()),
383 static_cast<LocalIndexType
>(isScvfLocalIdx)
392 const auto fIdx = intersection.indexInInside();
393 const auto numFaceVerts = refElement.size(fIdx, 1, dim);
394 for (
int localVIdx = 0; localVIdx < numFaceVerts; ++localVIdx)
396 const auto vIdx = refElement.subEntity(fIdx, 1, localVIdx, dim);
397 const auto vIdxGlobal = this->vertexMapper().subIndex(element, vIdx, dim);
398 boundaryDofIndices_[vIdxGlobal] =
true;
403 else if (periodicGridTraits_.isPeriodic(intersection))
408 const auto fIdx = intersection.indexInInside();
409 const auto numFaceVerts = refElement.size(fIdx, 1, dim);
410 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
411 for (
int localVIdx = 0; localVIdx < numFaceVerts; ++localVIdx)
413 const auto vIdx = refElement.subEntity(fIdx, 1, localVIdx, dim);
414 const auto vIdxGlobal = this->vertexMapper().subIndex(element, vIdx, dim);
415 const auto vPos = elementGeometry.corner(vIdx);
417 const auto& outside = intersection.outside();
418 const auto outsideGeometry = outside.geometry();
419 for (
const auto& isOutside : intersections(this->gridView(), outside))
422 if (periodicGridTraits_.isPeriodic(isOutside))
424 const auto fIdxOutside = isOutside.indexInInside();
425 const auto numFaceVertsOutside = refElement.size(fIdxOutside, 1, dim);
426 for (
int localVIdxOutside = 0; localVIdxOutside < numFaceVertsOutside; ++localVIdxOutside)
428 const auto vIdxOutside = refElement.subEntity(fIdxOutside, 1, localVIdxOutside, dim);
429 const auto vPosOutside = outsideGeometry.corner(vIdxOutside);
430 const auto shift = std::abs((this->bBoxMax()-this->bBoxMin())*intersection.centerUnitOuterNormal());
431 if (std::abs((vPosOutside-vPos).two_norm() - shift) < eps)
432 periodicDofMap_[vIdxGlobal] = this->vertexMapper().subIndex(outside, vIdxOutside, dim);
442 if (this->isPeriodic() && this->gridView().comm().size() > 1)
443 DUNE_THROW(Dune::NotImplemented,
"Periodic boundaries for box method for parallel simulations!");
446 const FeCache feCache_;
449 std::size_t numScvf_;
450 std::size_t numBoundaryScvf_;
453 std::vector<bool> boundaryDofIndices_;
456 std::unordered_map<GridIndexType, GridIndexType> periodicDofMap_;
470template<
class Scalar,
class GV,
class Traits>
478 static const int dim = GV::dimension;
479 static const int dimWorld = GV::dimensionworld;
481 using Element =
typename GV::template Codim<0>::Entity;
482 using CoordScalar =
typename GV::ctype;
504 using FeCache = Dune::LagrangeLocalFiniteElementCache<CoordScalar, Scalar, dim, 1>;
518 , periodicGridTraits_(this->gridView().grid())
531 {
return this->vertexMapper(); }
544 {
return numBoundaryScvf_; }
548 {
return this->vertexMapper().size(); }
554 ParentType::update(gridView);
561 ParentType::update(std::move(gridView));
571 {
return boundaryDofIndices_[dofIdx]; }
575 {
return periodicDofMap_.count(dofIdx); }
579 {
return periodicDofMap_.at(dofIdx); }
583 {
return periodicDofMap_; }
587 {
return { gg.cache_ }; }
591 class BoxGridGeometryCache
602 const BoxFVGridGeometry& gridGeometry()
const
603 {
return *gridGeometry_; }
606 const BoxFVGridGeometry* gridGeometry_;
618 boundaryDofIndices_.assign(numDofs(),
false);
624 numBoundaryScvf_ = 0;
625 for (
const auto& element : elements(this->gridView()))
627 numScv_ += element.subEntities(dim);
628 numScvf_ += element.subEntities(dim-1);
630 const auto elementGeometry = element.geometry();
631 const auto refElement = referenceElement(elementGeometry);
634 for (
const auto& intersection : intersections(this->gridView(), element))
636 if (intersection.boundary() && !intersection.neighbor())
638 const auto isGeometry = intersection.geometry();
639 numScvf_ += isGeometry.corners();
640 numBoundaryScvf_ += isGeometry.corners();
644 const auto fIdx = intersection.indexInInside();
645 const auto numFaceVerts = refElement.size(fIdx, 1, dim);
646 for (
int localVIdx = 0; localVIdx < numFaceVerts; ++localVIdx)
648 const auto vIdx = refElement.subEntity(fIdx, 1, localVIdx, dim);
649 const auto vIdxGlobal = this->vertexMapper().subIndex(element, vIdx, dim);
650 boundaryDofIndices_[vIdxGlobal] =
true;
655 else if (periodicGridTraits_.isPeriodic(intersection))
660 const auto fIdx = intersection.indexInInside();
661 const auto numFaceVerts = refElement.size(fIdx, 1, dim);
662 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
663 for (
int localVIdx = 0; localVIdx < numFaceVerts; ++localVIdx)
665 const auto vIdx = refElement.subEntity(fIdx, 1, localVIdx, dim);
666 const auto vIdxGlobal = this->vertexMapper().subIndex(element, vIdx, dim);
667 const auto vPos = elementGeometry.corner(vIdx);
669 const auto& outside = intersection.outside();
670 const auto outsideGeometry = outside.geometry();
671 for (
const auto& isOutside : intersections(this->gridView(), outside))
674 if (periodicGridTraits_.isPeriodic(isOutside))
676 const auto fIdxOutside = isOutside.indexInInside();
677 const auto numFaceVertsOutside = refElement.size(fIdxOutside, 1, dim);
678 for (
int localVIdxOutside = 0; localVIdxOutside < numFaceVertsOutside; ++localVIdxOutside)
680 const auto vIdxOutside = refElement.subEntity(fIdxOutside, 1, localVIdxOutside, dim);
681 const auto vPosOutside = outsideGeometry.corner(vIdxOutside);
682 const auto shift = std::abs((this->bBoxMax()-this->bBoxMin())*intersection.centerUnitOuterNormal());
683 if (std::abs((vPosOutside-vPos).two_norm() - shift) < eps)
684 periodicDofMap_[vIdxGlobal] = this->vertexMapper().subIndex(outside, vIdxOutside, dim);
694 if (this->isPeriodic() && this->gridView().comm().size() > 1)
695 DUNE_THROW(Dune::NotImplemented,
"Periodic boundaries for box method for parallel simulations!");
698 const FeCache feCache_;
703 std::size_t numScvf_;
704 std::size_t numBoundaryScvf_;
707 std::vector<bool> boundaryDofIndices_;
710 std::unordered_map<GridIndexType, GridIndexType> periodicDofMap_;
Base class for grid geometries.
Implementation of a boundary face related to primary grid elements (dune intersections)
Helper class constructing the dual grid finite volume geometries for the box discretizazion method.
Base class for all grid geometries.
Definition: basegridgeometry.hh:52
typename BaseImplementation::GridView GridView
export the grid view type
Definition: basegridgeometry.hh:60
Base class for the finite volume geometry vector for box models This builds up the sub control volume...
Definition: discretization/box/fvelementgeometry.hh:46
Base class for the finite volume geometry vector for box schemes This builds up the sub control volum...
Definition: discretization/box/fvgridgeometry.hh:473
std::size_t numBoundaryScvf() const
Definition: discretization/box/fvgridgeometry.hh:543
friend LocalView localView(const BoxFVGridGeometry &gg)
local view of this object (constructed with the internal cache)
Definition: discretization/box/fvgridgeometry.hh:586
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on a periodic boundary.
Definition: discretization/box/fvgridgeometry.hh:574
typename Traits::template LocalView< ThisType, false > LocalView
export the type of the fv element geometry (the local view type)
Definition: discretization/box/fvgridgeometry.hh:492
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition: discretization/box/fvgridgeometry.hh:496
BoxFVGridGeometry(const GridView &gridView)
Constructor.
Definition: discretization/box/fvgridgeometry.hh:524
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition: discretization/box/fvgridgeometry.hh:494
typename Traits::ScvQuadratureRule ScvQuadratureRule
export the scv interpolation point data type
Definition: discretization/box/fvgridgeometry.hh:510
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the vertex / d.o.f. on the other side of the periodic boundary.
Definition: discretization/box/fvgridgeometry.hh:578
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition: discretization/box/fvgridgeometry.hh:566
BoxGridGeometryCache Cache
Definition: discretization/box/fvgridgeometry.hh:612
std::size_t numScvf() const
The total number of sun control volume faces.
Definition: discretization/box/fvgridgeometry.hh:538
typename Traits::VertexMapper DofMapper
export dof mapper type
Definition: discretization/box/fvgridgeometry.hh:502
BasicGridGeometry_t< GV, Traits > BasicGridGeometry
export basic grid geometry type for the alternative constructor
Definition: discretization/box/fvgridgeometry.hh:490
bool dofOnBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on the boundary.
Definition: discretization/box/fvgridgeometry.hh:570
typename Traits::ScvfQuadratureRule ScvfQuadratureRule
the quadrature rule type for scvfs
Definition: discretization/box/fvgridgeometry.hh:512
const DofMapper & dofMapper() const
Definition: discretization/box/fvgridgeometry.hh:530
typename PeriodicGridTraits< typename GV::Grid >::SupportsPeriodicity SupportsPeriodicity
export whether the grid(geometry) supports periodicity
Definition: discretization/box/fvgridgeometry.hh:508
void update(GridView &&gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/box/fvgridgeometry.hh:559
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition: discretization/box/fvgridgeometry.hh:500
std::size_t numDofs() const
The total number of degrees of freedom.
Definition: discretization/box/fvgridgeometry.hh:547
BoxFVGridGeometry(std::shared_ptr< BasicGridGeometry > gg)
Constructor with basic grid geometry used to share state with another grid geometry on the same grid ...
Definition: discretization/box/fvgridgeometry.hh:515
std::size_t numScv() const
The total number of sub control volumes.
Definition: discretization/box/fvgridgeometry.hh:534
void update(const GridView &gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/box/fvgridgeometry.hh:552
Dune::LagrangeLocalFiniteElementCache< CoordScalar, Scalar, dim, 1 > FeCache
export the finite element cache type
Definition: discretization/box/fvgridgeometry.hh:504
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition: discretization/box/fvgridgeometry.hh:582
Base class for the finite volume geometry vector for box schemes This builds up the sub control volum...
Definition: discretization/box/fvgridgeometry.hh:94
friend LocalView localView(const BoxFVGridGeometry &gg)
local view of this object (constructed with the internal cache)
Definition: discretization/box/fvgridgeometry.hh:207
BoxGridGeometryCache Cache
Definition: discretization/box/fvgridgeometry.hh:272
void update(const GridView &gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/box/fvgridgeometry.hh:173
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the vertex / d.o.f. on the other side of the periodic boundary.
Definition: discretization/box/fvgridgeometry.hh:199
std::size_t numDofs() const
The total number of degrees of freedom.
Definition: discretization/box/fvgridgeometry.hh:168
std::size_t numScv() const
The total number of sub control volumes.
Definition: discretization/box/fvgridgeometry.hh:155
BasicGridGeometry_t< GV, Traits > BasicGridGeometry
export basic grid geometry type for the alternative constructor
Definition: discretization/box/fvgridgeometry.hh:111
typename Traits::ScvQuadratureRule ScvQuadratureRule
export the scv interpolation point data type
Definition: discretization/box/fvgridgeometry.hh:131
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition: discretization/box/fvgridgeometry.hh:187
std::size_t numBoundaryScvf() const
Definition: discretization/box/fvgridgeometry.hh:164
typename Traits::ScvfQuadratureRule ScvfQuadratureRule
the quadrature rule type for scvfs
Definition: discretization/box/fvgridgeometry.hh:133
Dune::LagrangeLocalFiniteElementCache< CoordScalar, Scalar, dim, 1 > FeCache
export the finite element cache type
Definition: discretization/box/fvgridgeometry.hh:125
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition: discretization/box/fvgridgeometry.hh:117
const DofMapper & dofMapper() const
Definition: discretization/box/fvgridgeometry.hh:151
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition: discretization/box/fvgridgeometry.hh:203
BoxFVGridGeometry(const GridView &gridView)
Constructor.
Definition: discretization/box/fvgridgeometry.hh:145
BoxFVGridGeometry(std::shared_ptr< BasicGridGeometry > gg)
Constructor with basic grid geometry used to share state with another grid geometry on the same grid ...
Definition: discretization/box/fvgridgeometry.hh:136
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition: discretization/box/fvgridgeometry.hh:121
typename PeriodicGridTraits< typename GV::Grid >::SupportsPeriodicity SupportsPeriodicity
export whether the grid(geometry) supports periodicity
Definition: discretization/box/fvgridgeometry.hh:129
typename Traits::template LocalView< ThisType, true > LocalView
export the type of the fv element geometry (the local view type)
Definition: discretization/box/fvgridgeometry.hh:113
bool dofOnBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on the boundary.
Definition: discretization/box/fvgridgeometry.hh:191
std::size_t numScvf() const
The total number of sun control volume faces.
Definition: discretization/box/fvgridgeometry.hh:159
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on a periodic boundary.
Definition: discretization/box/fvgridgeometry.hh:195
void update(GridView &&gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/box/fvgridgeometry.hh:180
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition: discretization/box/fvgridgeometry.hh:115
typename Traits::VertexMapper DofMapper
export dof mapper type
Definition: discretization/box/fvgridgeometry.hh:123
Base class for the finite volume geometry vector for box schemes This builds up the sub control volum...
Definition: discretization/box/fvgridgeometry.hh:83
Create sub control volumes and sub control volume face geometries.
Definition: boxgeometryhelper.hh:257
Class for a sub control volume face in the box method, i.e a part of the boundary of a sub control vo...
Definition: discretization/box/subcontrolvolumeface.hh:60
the sub control volume for the box scheme
Definition: discretization/box/subcontrolvolume.hh:58
Class for a boundary face related to primary grid elements (dune intersections)
Definition: boundaryface.hh:69
const GlobalPosition & center() const
The center of the face.
Definition: boundaryface.hh:103
Defines the default element and vertex mapper types.
Base class for the local finite volume geometry for box models This builds up the sub control volumes...
the sub control volume for the box scheme
Base class for a sub control volume face.
Helper classes to compute the integration elements.
Dune::Std::detected_or_t< Dumux::BasicGridGeometry< GV, typename T::ElementMapper, typename T::VertexMapper >, Detail::SpecifiesBaseGridGeometry, T > BasicGridGeometry_t
Type of the basic grid geometry implementation used as backend.
Definition: basegridgeometry.hh:42
The available discretization methods in Dumux.
Dune::Std::detected_or_t< Dumux::BoxGeometryHelper< GV, GV::dimension, typename T::SubControlVolume, typename T::SubControlVolumeFace >, SpecifiesGeometryHelper, T > BoxGeometryHelper_t
Definition: discretization/box/fvgridgeometry.hh:46
typename T::GeometryHelper SpecifiesGeometryHelper
Definition: basegridgeometry.hh:30
CVFE< CVFEMethods::PQ1 > Box
Definition: method.hh:98
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:236
std::ranges::range auto scvs(const FVElementGeometry &fvGeometry, const LocalDof &localDof)
Definition: localdof.hh:79
Grid properties related to periodicity.
The default traits for the box finite volume grid geometry Defines the scv and scvf types and the map...
Definition: discretization/box/fvgridgeometry.hh:65
Quadrature rule traits for discretization schemes.
Definition: quadraturerules.hh:85
Structure to define the index types used for grid and local indices.
Definition: indextraits.hh:26
Definition: periodicgridtraits.hh:24