14#ifndef DUMUX_DISCRETIZATION_PQ1BUBBLE_GRID_GEOMETRY_HH
15#define DUMUX_DISCRETIZATION_PQ1BUBBLE_GRID_GEOMETRY_HH
18#include <unordered_map>
20#include <dune/grid/common/mcmgmapper.hh>
41template<
class GV,
class T>
49template <
class Gr
idView>
52 using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
60 return [](Dune::GeometryType gt,
int dimgrid) {
61 return (gt.dim() == dimgrid) || (gt.dim() == 0);
72template<
class Gr
idView,
class MapperTraits = PQ1BubbleMapperTraits<Gr
idView>>
79 template<
class Gr
idGeometry,
bool enableCache>
91 bool enableCaching =
true,
101 using Element =
typename GV::template Codim<0>::Entity;
102 using CoordScalar =
typename GV::ctype;
103 static const int dim = GV::dimension;
104 static const int dimWorld = GV::dimensionworld;
106 static_assert(dim > 1,
"Only implemented for dim > 1");
131 , dofMapper_(
gridView, Traits::layout())
139 {
return dofMapper_; }
151 {
return numBoundaryScvf_; }
177 {
return boundaryDofIndices_[dofIdx]; }
181 {
return periodicVertexMap_.count(dofIdx); }
185 {
return periodicVertexMap_.at(dofIdx); }
189 {
return periodicVertexMap_; }
193 {
return { gg.cache_ }; }
197 class PQ1BubbleGridGeometryCache
208 const PQ1BubbleFVGridGeometry& gridGeometry()
const
209 {
return *gridGeometry_; }
212 const std::vector<SubControlVolume>& scvs(GridIndexType eIdx)
const
213 {
return scvs_[eIdx]; }
216 const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx)
const
217 {
return scvfs_[eIdx]; }
220 bool hasBoundaryScvf(GridIndexType eIdx)
const
221 {
return hasBoundaryScvf_[eIdx]; }
224 const std::vector<std::array<LocalIndexType, 2>>& scvfBoundaryGeometryKeys(GridIndexType eIdx)
const
225 {
return scvfBoundaryGeometryKeys_.at(eIdx); }
232 hasBoundaryScvf_.clear();
233 scvfBoundaryGeometryKeys_.clear();
236 std::vector<std::vector<SubControlVolume>> scvs_;
237 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
238 std::vector<bool> hasBoundaryScvf_;
239 std::unordered_map<GridIndexType, std::vector<std::array<LocalIndexType, 2>>> scvfBoundaryGeometryKeys_;
241 const PQ1BubbleFVGridGeometry* gridGeometry_;
247 using Cache = PQ1BubbleGridGeometryCache;
250 using GeometryHelper =
typename Cache::GeometryHelper;
255 dofMapper_.update(this->
gridView());
257 auto numElements = this->
gridView().size(0);
258 cache_.scvs_.resize(numElements);
259 cache_.scvfs_.resize(numElements);
260 cache_.hasBoundaryScvf_.resize(numElements,
false);
262 boundaryDofIndices_.assign(
numDofs(),
false);
266 numBoundaryScvf_ = 0;
274 auto elementGeometry =
element.geometry();
275 const auto refElement = referenceElement(elementGeometry);
278 GeometryHelper geometryHelper(elementGeometry);
280 numScv_ += geometryHelper.numScv();
282 cache_.scvs_[eIdx].resize(geometryHelper.numScv());
283 for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < geometryHelper.numScv(); ++scvLocalIdx)
285 auto corners = geometryHelper.getScvCorners(scvLocalIdx);
287 geometryHelper.scvVolume(scvLocalIdx, corners),
288 geometryHelper.dofPosition(scvLocalIdx),
292 geometryHelper.dofIndex(this->dofMapper(),
element, scvLocalIdx),
293 geometryHelper.isOverlappingScv(scvLocalIdx)
298 numScvf_ += geometryHelper.numInteriorScvf();
299 cache_.scvfs_[eIdx].resize(geometryHelper.numInteriorScvf());
300 LocalIndexType scvfLocalIdx = 0;
301 for (; scvfLocalIdx < geometryHelper.numInteriorScvf(); ++scvfLocalIdx)
303 const auto scvPair = geometryHelper.getScvPairForScvf(scvfLocalIdx);
304 const auto corners = geometryHelper.getScvfCorners(scvfLocalIdx);
306 geometryHelper.getInteriorScvfGeometryType(scvfLocalIdx),
307 [&](
unsigned int i){
return corners[i]; }
313 geometryHelper.normal(corners, scvPair),
316 geometryHelper.isOverlappingScvf(scvfLocalIdx)
321 for (
const auto& intersection : intersections(this->
gridView(),
element))
323 if (intersection.boundary() && !intersection.neighbor())
325 cache_.hasBoundaryScvf_[eIdx] =
true;
327 const auto localFacetIndex = intersection.indexInInside();
328 const auto numBoundaryScvf = geometryHelper.numBoundaryScvf(localFacetIndex);
332 for (
unsigned int isScvfLocalIdx = 0; isScvfLocalIdx <
numBoundaryScvf; ++isScvfLocalIdx)
335 const auto scvPair = geometryHelper.getScvPairForBoundaryScvf(localFacetIndex, isScvfLocalIdx);
336 const auto corners = geometryHelper.getBoundaryScvfCorners(localFacetIndex, isScvfLocalIdx);
338 Dune::GeometryTypes::cube(dim-1),
339 [&](
unsigned int i){
return corners[i]; }
341 cache_.scvfs_[eIdx].emplace_back(
344 intersection.centerUnitOuterNormal(),
347 typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection }
351 cache_.scvfBoundaryGeometryKeys_[eIdx].emplace_back(std::array<LocalIndexType, 2>{{
352 static_cast<LocalIndexType
>(localFacetIndex),
353 static_cast<LocalIndexType
>(isScvfLocalIdx)
365 const auto vIdx = refElement.subEntity(localFacetIndex, 1, localVIdx, dim);
367 boundaryDofIndices_[vIdxGlobal] =
true;
372 else if (intersection.boundary() && intersection.neighbor())
377 const auto fIdx = intersection.indexInInside();
378 const auto numFaceVerts = refElement.size(fIdx, 1, dim);
379 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
380 for (
int localVIdx = 0; localVIdx < numFaceVerts; ++localVIdx)
382 const auto vIdx = refElement.subEntity(fIdx, 1, localVIdx, dim);
384 const auto vPos = elementGeometry.corner(vIdx);
386 const auto& outside = intersection.outside();
387 const auto outsideGeometry = outside.geometry();
388 for (
const auto& isOutside : intersections(this->
gridView(), outside))
391 if (isOutside.boundary() && isOutside.neighbor())
393 const auto fIdxOutside = isOutside.indexInInside();
394 const auto numFaceVertsOutside = refElement.size(fIdxOutside, 1, dim);
395 for (
int localVIdxOutside = 0; localVIdxOutside < numFaceVertsOutside; ++localVIdxOutside)
397 const auto vIdxOutside = refElement.subEntity(fIdxOutside, 1, localVIdxOutside, dim);
398 const auto vPosOutside = outsideGeometry.corner(vIdxOutside);
399 const auto shift = std::abs((this->
bBoxMax()-this->
bBoxMin())*intersection.centerUnitOuterNormal());
400 if (std::abs((vPosOutside-vPos).two_norm() - shift) < eps)
401 periodicVertexMap_[vIdxGlobal] = this->
dofMapper().subIndex(outside, vIdxOutside, dim);
412 DUNE_THROW(Dune::NotImplemented,
"Periodic boundaries for pq1bubble method for parallel simulations!");
420 std::size_t numScvf_;
421 std::size_t numBoundaryScvf_;
424 std::vector<bool> boundaryDofIndices_;
427 std::unordered_map<GridIndexType, GridIndexType> periodicVertexMap_;
Base class for grid geometries.
Compute the center point of a convex polytope geometry or a random-access container of corner points.
Base class for all grid geometries.
Definition basegridgeometry.hh:52
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
Get an element from a global element index.
Definition basegridgeometry.hh:142
const GridView & gridView() const
Return the gridView this grid geometry object lives on.
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
Definition pq1bubblefecache.hh:29
Base class for the finite volume geometry vector for pq1bubble models This builds up the sub control ...
Definition discretization/pq1bubble/fvelementgeometry.hh:40
Base class for the finite volume geometry vector for pq1bubble schemes This builds up the sub control...
Definition discretization/pq1bubble/fvgridgeometry.hh:95
void update(const GridView &gridView)
update all geometries (call this after grid adaption)
Definition discretization/pq1bubble/fvgridgeometry.hh:158
friend LocalView localView(const PQ1BubbleFVGridGeometry &gg)
local view of this object (constructed with the internal cache)
Definition discretization/pq1bubble/fvgridgeometry.hh:192
PQ1BubbleGridGeometryCache Cache
Definition discretization/pq1bubble/fvgridgeometry.hh:247
static constexpr DiscretizationMethod discMethod
Definition discretization/pq1bubble/fvgridgeometry.hh:111
std::size_t numBoundaryScvf() const
The total number of boundary sub control volume faces.
Definition discretization/pq1bubble/fvgridgeometry.hh:150
std::size_t numScv() const
The total number of sub control volumes.
Definition discretization/pq1bubble/fvgridgeometry.hh:142
std::size_t numScvf() const
The total number of sub control volume faces.
Definition discretization/pq1bubble/fvgridgeometry.hh:146
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition discretization/pq1bubble/fvgridgeometry.hh:172
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the vertex / d.o.f. on the other side of the periodic boundary.
Definition discretization/pq1bubble/fvgridgeometry.hh:184
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition discretization/pq1bubble/fvgridgeometry.hh:120
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition discretization/pq1bubble/fvgridgeometry.hh:118
std::size_t numDofs() const
The total number of degrees of freedom.
Definition discretization/pq1bubble/fvgridgeometry.hh:154
const std::unordered_map< GridIndexType, GridIndexType > & periodicVertexMap() const
Returns the map between dofs across periodic boundaries.
Definition discretization/pq1bubble/fvgridgeometry.hh:188
bool dofOnBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on the boundary.
Definition discretization/pq1bubble/fvgridgeometry.hh:176
typename Traits::DofMapper DofMapper
export dof mapper type
Definition discretization/pq1bubble/fvgridgeometry.hh:122
const DofMapper & dofMapper() const
The dofMapper.
Definition discretization/pq1bubble/fvgridgeometry.hh:138
GV GridView
export the grid view type
Definition discretization/pq1bubble/fvgridgeometry.hh:126
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on a periodic boundary.
Definition discretization/pq1bubble/fvgridgeometry.hh:180
typename Traits::template LocalView< ThisType, true > LocalView
export the type of the fv element geometry (the local view type)
Definition discretization/pq1bubble/fvgridgeometry.hh:114
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition discretization/pq1bubble/fvgridgeometry.hh:116
PQ1BubbleFVGridGeometry(const GridView gridView)
Constructor.
Definition discretization/pq1bubble/fvgridgeometry.hh:129
void update(GridView &&gridView)
update all geometries (call this after grid adaption)
Definition discretization/pq1bubble/fvgridgeometry.hh:165
Dumux::PQ1BubbleFECache< CoordScalar, Scalar, dim > FeCache
export the finite element cache type
Definition discretization/pq1bubble/fvgridgeometry.hh:124
A class to create sub control volume and sub control volume face geometries per element.
Definition discretization/pq1bubble/geometryhelper.hh:166
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/pq1bubble/subcontrolvolumeface.hh:60
the sub control volume for the pq1bubble scheme
Definition discretization/pq1bubble/subcontrolvolume.hh:56
Defines the default element and vertex mapper types.
Base class for the local finite volume geometry for the pq1bubble method This builds up the sub contr...
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.
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
The available discretization methods in Dumux.
Dune::Std::detected_or_t< Dumux::PQ1BubbleGeometryHelper< GV, typename T::SubControlVolume, typename T::SubControlVolumeFace >, SpecifiesGeometryHelper, T > PQ1BubbleGeometryHelper_t
Definition discretization/pq1bubble/fvgridgeometry.hh:46
typename T::GeometryHelper SpecifiesGeometryHelper
Definition basegridgeometry.hh:30
CVFE< CVFEMethods::PQ1Bubble > PQ1Bubble
Definition method.hh:108
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:166
A finite element cache for P1/Q1 function with bubble.
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 pq1bubble finite volume grid geometry Defines the scv and scvf types and t...
Definition discretization/pq1bubble/fvgridgeometry.hh:75
Definition discretization/pq1bubble/fvgridgeometry.hh:51
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > DofMapper
Definition discretization/pq1bubble/fvgridgeometry.hh:52
static Dune::MCMGLayout layout()
layout for elements and vertices
Definition discretization/pq1bubble/fvgridgeometry.hh:58
Compute the volume of several common geometry types.