14#ifndef DUMUX_DISCRETIZATION_PQ2_GRID_GEOMETRY_HH
15#define DUMUX_DISCRETIZATION_PQ2_GRID_GEOMETRY_HH
22#include <unordered_map>
27#include <dune/grid/common/mcmgmapper.hh>
28#include <dune/geometry/type.hh>
29#include <dune/localfunctions/lagrange/lagrangelfecache.hh>
55template<
class GV,
class T>
57 std::conditional_t<enablesHybridCVFE<T>,
66template <
class Gr
idView>
69 using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
77 return [](Dune::GeometryType gt,
int dimgrid) {
78 return (gt.dim() == 0) || (gt.dim() == 1)
79 || (gt.dim() == dimgrid && gt == Dune::GeometryTypes::cube(dimgrid))
80 || (dimgrid == 3 && gt == Dune::GeometryTypes::cube(dimgrid-1));
89template<
class GridView,
103template<
class Gr
idView,
class MapperTraits = PQ2MapperTraits<Gr
idView>,
class QuadratureTraits = PQ2QuadratureTraits<Gr
idView>>
105:
public MapperTraits,
public QuadratureTraits
110 template<
class Gr
idGeometry,
bool enableCache>
119 if constexpr (GridView::dimension == 1)
121 else if constexpr (GridView::dimension == 2)
123 else if constexpr (GridView::dimension == 3)
134template<
class Scalar,
136 bool enableCaching =
true,
137 class Traits = PQ2DefaultGridGeometryTraits<GV>>
146 using Element =
typename GV::template Codim<0>::Entity;
147 using CoordScalar =
typename GV::ctype;
148 static const int dim = GV::dimension;
149 static const int dimWorld = GV::dimensionworld;
176 using FeCache = Dune::LagrangeLocalFiniteElementCache<CoordScalar, Scalar, dim, 2>;
194 : ParentType(std::move(gg))
195 , dofMapper_(this->
gridView(), Traits::layout())
197 , periodicGridTraits_(this->
gridView().grid())
209 {
return dofMapper_; }
221 {
return numBoundaryScvf_; }
247 {
return boundaryDofIndices_[dofIdx]; }
251 {
return periodicDofMap_.count(dofIdx); }
254 [[deprecated(
"Will be removed after release 3.11. Use periodicallyMappedDofs, returning a range of dofs")]]
256 {
return periodicDofMap_.at(dofIdx)[0]; }
260 {
return std::views::all(periodicDofMap_.at(dofIdx)); }
263 const std::unordered_map<GridIndexType, std::vector<GridIndexType>>&
periodicDofMap()
const
264 {
return periodicDofMap_; }
268 {
return { gg.cache_ }; }
272 class PQ2GridGeometryCache
279 using DofHelper =
typename GeometryHelper::DofHelper;
285 const PQ2FVGridGeometry& gridGeometry()
const
286 {
return *gridGeometry_; }
289 const std::vector<SubControlVolume>& scvs(GridIndexType eIdx)
const
290 {
return scvs_[eIdx]; }
293 const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx)
const
294 {
return scvfs_[eIdx]; }
297 bool hasBoundaryScvf(GridIndexType eIdx)
const
298 {
return hasBoundaryScvf_[eIdx]; }
301 const std::vector<std::array<LocalIndexType, 2>>& scvfBoundaryGeometryKeys(GridIndexType eIdx)
const
302 {
return scvfBoundaryGeometryKeys_.at(eIdx); }
305 auto boundaryFaces(GridIndexType eIdx)
const -> std::span<const BoundaryFace>
307 if (
auto it = boundaryFaces_.find(eIdx); it != boundaryFaces_.end())
313 const auto& boundaryFaceScvfRanges(GridIndexType eIdx)
const
314 {
return boundaryFaceScvfRanges_.at(eIdx); }
321 hasBoundaryScvf_.clear();
322 scvfBoundaryGeometryKeys_.clear();
323 boundaryFaces_.clear();
324 boundaryFaceScvfRanges_.clear();
327 std::vector<std::vector<SubControlVolume>> scvs_;
328 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
329 std::vector<bool> hasBoundaryScvf_;
330 std::unordered_map<GridIndexType, std::vector<std::array<LocalIndexType, 2>>> scvfBoundaryGeometryKeys_;
331 std::unordered_map<GridIndexType, Dune::ReservedVector<typename PQ2FVGridGeometry::BoundaryFace, 2*dim>> boundaryFaces_;
332 std::unordered_map<GridIndexType, Dune::ReservedVector<std::array<LocalIndexType, 2>, 2*dim>> boundaryFaceScvfRanges_;
334 const PQ2FVGridGeometry* gridGeometry_;
343 using GeometryHelper =
typename Cache::GeometryHelper;
344 using DofHelper =
typename GeometryHelper::DofHelper;
349 dofMapper_.update(this->
gridView());
351 auto numElements = this->
gridView().size(0);
352 cache_.scvs_.resize(numElements);
353 cache_.scvfs_.resize(numElements);
354 cache_.hasBoundaryScvf_.resize(numElements,
false);
356 boundaryDofIndices_.assign(
numDofs(),
false);
357 periodicDofMap_.clear();
361 numBoundaryScvf_ = 0;
369 auto elementGeometry =
element.geometry();
371 const auto& localCoefficients = this->
feCache().get(
element.type()).localCoefficients();
374 GeometryHelper geometryHelper(elementGeometry);
376 numScv_ += geometryHelper.numScv();
378 cache_.scvs_[eIdx].resize(geometryHelper.numScv());
380 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
382 const auto& localKey = localCoefficients.localKey(keyIdx);
384 if(localKey.codim() == dim)
386 const auto localIdx = localKey.subEntity();
388 auto corners = geometryHelper.getScvCorners(localIdx);
390 geometryHelper.scvVolume(localIdx, corners),
391 DofHelper::dofPosition(elementGeometry, localKey),
396 DofHelper::dofIndex(this->dofMapper(),
element, localKey),
403 const auto numInteriorScvfs = GeometryHelper::numInteriorScvf(elementGeometry.type());
404 numScvf_ += numInteriorScvfs;
405 cache_.scvfs_[eIdx].resize(numInteriorScvfs);
406 LocalIndexType scvfLocalIdx = 0;
407 for (; scvfLocalIdx < numInteriorScvfs; ++scvfLocalIdx)
409 const auto scvPair = geometryHelper.getScvPairForScvf(scvfLocalIdx);
410 const auto corners = geometryHelper.getScvfCorners(scvfLocalIdx);
412 geometryHelper.getInteriorScvfGeometryType(scvfLocalIdx),
413 [&](
unsigned int i){
return corners[i]; }
419 geometryHelper.normal(corners, scvPair),
422 geometryHelper.isOverlappingScvf(scvfLocalIdx)
427 LocalIndexType numBoundaryFaces = 0;
428 for (
const auto& intersection : intersections(this->
gridView(),
element))
430 if (intersection.boundary() && !intersection.neighbor())
432 cache_.hasBoundaryScvf_[eIdx] =
true;
435 const auto isGeometry = intersection.geometry();
439 intersection.centerUnitOuterNormal(),
441 static_cast<LocalIndexType
>(intersection.indexInInside()),
442 typename BoundaryFace::Traits::BoundaryFlag{intersection}
445 const auto localFacetIndex = intersection.indexInInside();
446 const auto numBoundaryScvf = GeometryHelper::numBoundaryScvf(elementGeometry.type(), localFacetIndex);
451 cache_.boundaryFaceScvfRanges_[eIdx].push_back(std::array<LocalIndexType, 2>{{
456 for (
unsigned int isScvfLocalIdx = 0; isScvfLocalIdx <
numBoundaryScvf; ++isScvfLocalIdx)
459 const auto scvPair = geometryHelper.getScvPairForBoundaryScvf(localFacetIndex, isScvfLocalIdx);
460 const auto corners = geometryHelper.getBoundaryScvfCorners(localFacetIndex, isScvfLocalIdx);
462 geometryHelper.getBoundaryScvfGeometryType(isScvfLocalIdx),
463 [&](
unsigned int i){
return corners[i]; }
465 cache_.scvfs_[eIdx].emplace_back(
468 intersection.centerUnitOuterNormal(),
471 typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection },
472 geometryHelper.isOverlappingBoundaryScvf(localFacetIndex)
476 cache_.scvfBoundaryGeometryKeys_[eIdx].emplace_back(std::array<LocalIndexType, 2>{{
477 static_cast<LocalIndexType
>(localFacetIndex),
478 static_cast<LocalIndexType
>(isScvfLocalIdx)
485 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
487 if(DofHelper::localDofOnIntersection(elementGeometry.type(), intersection.indexInInside(), localCoefficients.localKey(keyIdx)))
489 const auto dofIdxGlobal = DofHelper::dofIndex(this->
dofMapper(),
element, localCoefficients.localKey(keyIdx));
490 boundaryDofIndices_[dofIdxGlobal] =
true;
496 else if (periodicGridTraits_.isPeriodic(intersection))
501 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
502 for (
int localDofIdx = 0; localDofIdx < localCoefficients.size(); ++localDofIdx)
504 if(!DofHelper::localDofOnIntersection(elementGeometry.type(), intersection.indexInInside(), localCoefficients.localKey(localDofIdx)))
507 const auto dofIdxGlobal = DofHelper::dofIndex(this->
dofMapper(),
element, localCoefficients.localKey(localDofIdx));
508 const auto dofPos = DofHelper::dofPosition(elementGeometry, localCoefficients.localKey(localDofIdx));
510 const auto& outside = intersection.outside();
511 const auto outsideGeometry = outside.geometry();
512 const auto& localCoefficientsOut = this->
feCache().get(outsideGeometry.type()).localCoefficients();
513 for (
const auto& isOutside : intersections(this->
gridView(), outside))
516 if (periodicGridTraits_.isPeriodic(isOutside))
518 for (
int localDofIdxOut = 0; localDofIdxOut < localCoefficientsOut.size(); ++localDofIdxOut)
520 const auto& localKeyOut = localCoefficientsOut.localKey(localDofIdxOut);
521 if(!DofHelper::localDofOnIntersection(outsideGeometry.type(), isOutside.indexInInside(), localKeyOut))
524 const auto dofIdxGlobalOut = DofHelper::dofIndex(this->
dofMapper(), outside, localKeyOut);
525 const auto dofPosOutside = DofHelper::dofPosition(outsideGeometry, localKeyOut);
526 const auto shift = std::abs((this->
bBoxMax()-this->
bBoxMin())*intersection.centerUnitOuterNormal());
527 if ((dofPosOutside - dofPos + shift*intersection.centerUnitOuterNormal()).two_norm() < eps)
541 DUNE_THROW(Dune::NotImplemented,
"Periodic boundaries for pq2 method for parallel simulations!");
549 std::size_t numScvf_;
550 std::size_t numBoundaryScvf_;
553 std::vector<bool> boundaryDofIndices_;
556 std::unordered_map<GridIndexType, std::vector<GridIndexType>> periodicDofMap_;
Base class for grid geometries.
Implementation of a boundary face related to primary grid elements (dune intersections).
Compute the center point of a convex polytope geometry or a random-access container of corner points.
const ElementMapper & elementMapper() const
Returns the mapper for elements to indices for constant grids.
Definition basegridgeometry.hh:112
void setPeriodic(bool value=true)
Set the periodicity of the grid geometry.
Definition basegridgeometry.hh:169
const GlobalCoordinate & bBoxMax() const
The coordinate of the corner of the GridView's bounding box with the largest values.
Definition basegridgeometry.hh:156
Element element(GridIndexType eIdx) const
Definition basegridgeometry.hh:142
const GridView & gridView() const
Definition basegridgeometry.hh:100
void update(const GridView &gridView)
Update all fvElementGeometries (call this after grid adaption).
Definition basegridgeometry.hh:88
const GlobalCoordinate & bBoxMin() const
The coordinate of the corner of the GridView's bounding box with the smallest values.
Definition basegridgeometry.hh:149
bool isPeriodic() const
Returns if the grid geometry is periodic (at all).
Definition basegridgeometry.hh:162
Class for a boundary face related to primary grid elements (dune intersections).
Definition boundaryface.hh:69
A class to create sub control volume and sub control volume face geometries per element.
Definition discretization/pq2/geometryhelper.hh:56
Base class for the finite volume geometry vector for pq2 models This builds up the sub control volume...
Definition discretization/pq2/fvelementgeometry.hh:49
Base class for the finite volume geometry vector for pq2 schemes This builds up the sub control volum...
Definition discretization/pq2/fvgridgeometry.hh:140
Dune::LagrangeLocalFiniteElementCache< CoordScalar, Scalar, dim, 2 > FeCache
Definition discretization/pq2/fvgridgeometry.hh:176
typename PQ2DefaultGridGeometryTraits< GridView >::DofMapper DofMapper
Definition discretization/pq2/fvgridgeometry.hh:174
PQ2FVGridGeometry(const GridView &gridView)
Constructor.
Definition discretization/pq2/fvgridgeometry.hh:203
std::size_t numScvf() const
The total number of sub control volume faces.
Definition discretization/pq2/fvgridgeometry.hh:216
const DofMapper & dofMapper() const
The dofMapper.
Definition discretization/pq2/fvgridgeometry.hh:208
typename PQ2DefaultGridGeometryTraits< GridView >::IntersectionQuadratureRule IntersectionQuadratureRule
Definition discretization/pq2/fvgridgeometry.hh:188
const std::unordered_map< GridIndexType, std::vector< GridIndexType > > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition discretization/pq2/fvgridgeometry.hh:263
bool dofOnBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on the boundary.
Definition discretization/pq2/fvgridgeometry.hh:246
typename PQ2DefaultGridGeometryTraits< GridView >::BoundaryFaceQuadratureRule BoundaryFaceQuadratureRule
Definition discretization/pq2/fvgridgeometry.hh:190
typename PQ2DefaultGridGeometryTraits< GridView >::ScvQuadratureRule ScvQuadratureRule
Definition discretization/pq2/fvgridgeometry.hh:182
const std::ranges::range auto periodicallyMappedDofs(GridIndexType dofIdx) const
The indices of the vertices / d.o.f.s on the other side of the periodic boundaries.
Definition discretization/pq2/fvgridgeometry.hh:259
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition discretization/pq2/fvgridgeometry.hh:242
Experimental::BoundaryFace< GridView > BoundaryFace
Definition discretization/pq2/fvgridgeometry.hh:170
void update(const GridView &gridView)
update all geometries (call this after grid adaption)
Definition discretization/pq2/fvgridgeometry.hh:228
friend LocalView localView(const PQ2FVGridGeometry &gg)
local view of this object (constructed with the internal cache)
Definition discretization/pq2/fvgridgeometry.hh:267
typename PQ2DefaultGridGeometryTraits< GridView >::ElementQuadratureRule ElementQuadratureRule
Definition discretization/pq2/fvgridgeometry.hh:186
static constexpr bool enableHybridCVFE
Definition discretization/pq2/fvgridgeometry.hh:156
std::size_t numBoundaryScvf() const
The total number of boundary sub control volume faces.
Definition discretization/pq2/fvgridgeometry.hh:220
std::size_t numScv() const
The total number of sub control volumes.
Definition discretization/pq2/fvgridgeometry.hh:212
PQ2GridGeometryCache Cache
Definition discretization/pq2/fvgridgeometry.hh:340
PQ2FVGridGeometry(std::shared_ptr< BasicGridGeometry > gg)
Constructor with basic grid geometry used to share state with another grid geometry on the same grid ...
Definition discretization/pq2/fvgridgeometry.hh:193
typename PQ2DefaultGridGeometryTraits< GridView >::ScvfQuadratureRule ScvfQuadratureRule
Definition discretization/pq2/fvgridgeometry.hh:184
typename PQ2DefaultGridGeometryTraits< GridView >::SubControlVolumeFace SubControlVolumeFace
Definition discretization/pq2/fvgridgeometry.hh:168
void update(GridView &&gridView)
update all geometries (call this after grid adaption)
Definition discretization/pq2/fvgridgeometry.hh:235
typename PQ2DefaultGridGeometryTraits< GridView >::template LocalView< ThisType, true > LocalView
Definition discretization/pq2/fvgridgeometry.hh:164
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the vertex / d.o.f. on the other side of the periodic boundary.
Definition discretization/pq2/fvgridgeometry.hh:255
static constexpr std::size_t maxNumElementDofs
Definition discretization/pq2/fvgridgeometry.hh:159
static constexpr DiscretizationMethod discMethod
Definition discretization/pq2/fvgridgeometry.hh:154
BasicGridGeometry_t< GridView, PQ2DefaultGridGeometryTraits< GridView > > BasicGridGeometry
Definition discretization/pq2/fvgridgeometry.hh:162
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on a periodic boundary.
Definition discretization/pq2/fvgridgeometry.hh:250
GridView GridView
Definition discretization/pq2/fvgridgeometry.hh:178
typename PeriodicGridTraits< typename GridView::Grid >::SupportsPeriodicity SupportsPeriodicity
Definition discretization/pq2/fvgridgeometry.hh:180
typename PQ2DefaultGridGeometryTraits< GridView >::SubControlVolume SubControlVolume
Definition discretization/pq2/fvgridgeometry.hh:166
DiscretizationMethods::PQ2 DiscretizationMethod
Definition discretization/pq2/fvgridgeometry.hh:153
std::size_t numDofs() const
The total number of degrees of freedom.
Definition discretization/pq2/fvgridgeometry.hh:224
Extrusion_t< PQ2DefaultGridGeometryTraits< GridView > > Extrusion
Definition discretization/pq2/fvgridgeometry.hh:172
Class for a sub control volume face in the cvfe method, i.e a part of the boundary of a sub control v...
Definition discretization/pq2/subcontrolvolumeface.hh:58
the sub control volume for the pq2 scheme
Definition discretization/pq2/subcontrolvolume.hh:55
Defines the default element and vertex mapper types.
Base class for the finite volume geometry vector for the pq1bubble method This builds up the sub cont...
Base class for the local finite volume geometry for the pq2 method This builds up the sub control vol...
Helper class constructing the dual grid finite volume geometries for the cvfe discretizazion method.
the sub control volume for the cvfe scheme
Base class for a sub control volume face.
Helper classes to compute the integration elements.
void closePeriodicDofMap(std::unordered_map< Index, std::vector< Index > > &periodicDofMap)
Map every degree of freedom to all others it is identified with.
Definition periodicdofmap.hh:48
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:38
void addPeriodicallyMappedDof(std::unordered_map< Index, std::vector< Index > > &periodicDofMap, std::type_identity_t< Index > dofIdx, std::type_identity_t< Index > periodicDofIdx)
Register a degree of freedom as periodically mapped to another one.
Definition periodicdofmap.hh:29
BaseGridGeometry(std::shared_ptr< BaseImplementation > impl)
Constructor from a BaseImplementation.
Definition basegridgeometry.hh:72
auto convexPolytopeVolume(Dune::GeometryType type, const CornerF &c)
Compute the volume of several common geometry types.
Definition volume.hh:41
Corners::value_type center(const Corners &corners)
The center of a given list of corners.
Definition center.hh:24
CVFE::DefaultQuadratureTraits< GridView, ScvRule, ScvfRule, ElementRule, IntersectionRule, BoundaryFaceRule > PQ2QuadratureTraits
Quadrature rule traits for PQ2 discretization.
Definition discretization/pq2/fvgridgeometry.hh:95
The available discretization methods in Dumux.
Definition cvfelocalresidual.hh:25
static constexpr bool enablesHybridCVFE
Definition discretization/pq1bubble/fvgridgeometry.hh:53
typename T::GeometryHelper SpecifiesGeometryHelper
Definition basegridgeometry.hh:30
Dune::Std::detected_or_t< std::conditional_t< enablesHybridCVFE< T >, Dumux::HybridPQ2GeometryHelper< GV, typename T::SubControlVolume, typename T::SubControlVolumeFace >, void >, SpecifiesGeometryHelper, T > PQ2GeometryHelper_t
Definition discretization/pq2/fvgridgeometry.hh:56
CVFE< CVFEMethods::PQ2 > PQ2
Definition method.hh:132
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:257
Helpers for maps between degrees of freedom identified across periodic boundaries.
Grid properties related to periodicity.
Quadrature rule traits for discretization schemes.
Definition quadraturerules.hh:86
Definition defaultmappertraits.hh:23
typename GridView::IndexSet::IndexType GridIndex
Definition indextraits.hh:27
unsigned int LocalIndex
Definition indextraits.hh:28
The default traits for the pq2 finite volume grid geometry Defines the scv and scvf types and the map...
Definition discretization/pq2/fvgridgeometry.hh:106
PQ2FVElementGeometry< GridGeometry, enableCache > LocalView
Definition discretization/pq2/fvgridgeometry.hh:111
PQ2SubControlVolumeFace< GridView > SubControlVolumeFace
Definition discretization/pq2/fvgridgeometry.hh:108
PQ2SubControlVolume< GridView > SubControlVolume
Definition discretization/pq2/fvgridgeometry.hh:107
static constexpr std::size_t maxNumElementDofs
Definition discretization/pq2/fvgridgeometry.hh:117
std::true_type EnableHybridCVFE
Definition discretization/pq2/fvgridgeometry.hh:113
Definition discretization/pq2/fvgridgeometry.hh:68
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > DofMapper
Definition discretization/pq2/fvgridgeometry.hh:69
static Dune::MCMGLayout layout()
layout for vertices and edges and elements (and faces in 3D) for the case of cubes
Definition discretization/pq2/fvgridgeometry.hh:75
Definition periodicgridtraits.hh:24
Definition periodicgridtraits.hh:23
Dune-based quadrature rule with specified order.
Definition quadraturerules.hh:67
Midpoint quadrature rule that uses scv/scvf centers.
Definition quadraturerules.hh:59
Compute the volume of several common geometry types.