version 3.11-dev
discretization/pq1bubble/fvgridgeometry.hh
Go to the documentation of this file.
1// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2// vi: set et ts=4 sw=4 sts=4:
3//
4// SPDX-FileCopyrightText: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
14#ifndef DUMUX_DISCRETIZATION_PQ1BUBBLE_GRID_GEOMETRY_HH
15#define DUMUX_DISCRETIZATION_PQ1BUBBLE_GRID_GEOMETRY_HH
16
17#include <utility>
18#include <unordered_map>
19#include <type_traits>
20
21#include <dune/grid/common/mcmgmapper.hh>
22
24
27
30
38
40
41namespace Dumux {
42
43namespace Detail {
44template<class T>
46 = typename T::EnableHybridCVFE;
47
48template<class T>
49static constexpr bool enablesHybridCVFE
50 = Dune::Std::detected_or_t<std::false_type, EnableHybridCVFE, T>{};
51
52template<class GV, class T>
53using PQ1BubbleGeometryHelper_t = Dune::Std::detected_or_t<
54 std::conditional_t<enablesHybridCVFE<T>,
57 >,
59 T
60>;
61} // end namespace Detail
62
63template <class GridView, std::size_t numCubeBubbles = 1>
65{
66 using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
67 static_assert(numCubeBubbles == 1 || numCubeBubbles == 2,
68 "PQ1BubbleMapperTraits supports numCubeBubbles = 1 or 2");
69 static constexpr std::size_t numCubeBubbleDofs = numCubeBubbles;
70
74 static Dune::MCMGLayout layout()
75 {
76 return [](Dune::GeometryType gt, int dimgrid) {
77 if (gt.dim() == 0)
78 return int(1);
79
80 if (gt.dim() == dimgrid)
81 return gt.isCube() ? int(numCubeBubbleDofs) : int(1);
82
83 return int(0);
84 };
85 }
86};
87
92template<class GridView,
96 class IntersectionRule = Dumux::QuadratureRules::MidpointQuadrature>
98
105template<class GridView, class MapperTraits = PQ1BubbleMapperTraits<GridView>, class QuadratureTraits = PQ1BubbleQuadratureTraits<GridView>>
107: public MapperTraits, public QuadratureTraits
108{
111
112 template<class GridGeometry, bool enableCache>
114
115 static constexpr std::size_t maxNumElementDofs = (1<<GridView::dimension)
116 + MapperTraits::numCubeBubbleDofs;
117};
118
125template<class BaseTraits>
127: public BaseTraits
128{ using EnableHybridCVFE = std::true_type; };
129
136template<class Scalar,
137 class GV,
138 bool enableCaching = true,
141: public BaseGridGeometry<GV, Traits>
142{
145 using GridIndexType = typename IndexTraits<GV>::GridIndex;
146 using LocalIndexType = typename IndexTraits<GV>::LocalIndex;
147
148 using Element = typename GV::template Codim<0>::Entity;
149 using CoordScalar = typename GV::ctype;
150 static const int dim = GV::dimension;
151 static const int dimWorld = GV::dimensionworld;
152
153 static_assert(dim > 1, "Only implemented for dim > 1");
154
155public:
159
160 static constexpr bool enableHybridCVFE = Detail::enablesHybridCVFE<Traits>;
161
162 static constexpr std::size_t maxNumElementDofs = Traits::maxNumElementDofs;
163
167 using LocalView = typename Traits::template LocalView<ThisType, true>;
169 using SubControlVolume = typename Traits::SubControlVolume;
171 using SubControlVolumeFace = typename Traits::SubControlVolumeFace;
175 using DofMapper = typename Traits::DofMapper;
179 using GridView = GV;
183 using ScvQuadratureRule = typename Traits::ScvQuadratureRule;
185 using ScvfQuadratureRule = typename Traits::ScvfQuadratureRule;
187 using ElementQuadratureRule = typename Traits::ElementQuadratureRule;
189 using IntersectionQuadratureRule = typename Traits::IntersectionQuadratureRule;
190
192 PQ1BubbleFVGridGeometry(std::shared_ptr<BasicGridGeometry> gg)
193 : ParentType(std::move(gg))
194 , dofMapper_(this->gridView(), Traits::layout())
195 , cache_(*this)
196 , periodicGridTraits_(this->gridView().grid())
197 {
198 update_();
199 }
200
204 {}
205
207 const DofMapper& dofMapper() const
208 { return dofMapper_; }
209
211 std::size_t numScv() const
212 { return numScv_; }
213
215 std::size_t numScvf() const
216 { return numScvf_; }
217
219 std::size_t numBoundaryScvf() const
220 { return numBoundaryScvf_; }
221
223 std::size_t numDofs() const
224 { return this->dofMapper().size(); }
225
228 {
230 update_();
231 }
232
235 {
236 ParentType::update(std::move(gridView));
237 update_();
238 }
239
241 const FeCache& feCache() const
242 { return feCache_; }
243
245 bool dofOnBoundary(GridIndexType dofIdx) const
246 { return boundaryDofIndices_[dofIdx]; }
247
249 bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
250 { return periodicDofMap_.count(dofIdx); }
251
253 GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
254 { return periodicDofMap_.at(dofIdx); }
255
257 const std::unordered_map<GridIndexType, GridIndexType>& periodicDofMap() const
258 { return periodicDofMap_; }
259
262 { return { gg.cache_ }; }
263
264private:
265 class PQ1BubbleGridGeometryCache
266 {
267 friend class PQ1BubbleFVGridGeometry;
268 public:
271
272 explicit PQ1BubbleGridGeometryCache(const PQ1BubbleFVGridGeometry& gg)
273 : gridGeometry_(&gg)
274 {}
275
276 const PQ1BubbleFVGridGeometry& gridGeometry() const
277 { return *gridGeometry_; }
278
280 const std::vector<SubControlVolume>& scvs(GridIndexType eIdx) const
281 { return scvs_[eIdx]; }
282
284 const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx) const
285 { return scvfs_[eIdx]; }
286
288 bool hasBoundaryScvf(GridIndexType eIdx) const
289 { return hasBoundaryScvf_[eIdx]; }
290
292 const std::vector<std::array<LocalIndexType, 2>>& scvfBoundaryGeometryKeys(GridIndexType eIdx) const
293 { return scvfBoundaryGeometryKeys_.at(eIdx); }
294
295 private:
296 void clear_()
297 {
298 scvs_.clear();
299 scvfs_.clear();
300 hasBoundaryScvf_.clear();
301 scvfBoundaryGeometryKeys_.clear();
302 }
303
304 std::vector<std::vector<SubControlVolume>> scvs_;
305 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
306 std::vector<bool> hasBoundaryScvf_;
307 std::unordered_map<GridIndexType, std::vector<std::array<LocalIndexType, 2>>> scvfBoundaryGeometryKeys_;
308
309 const PQ1BubbleFVGridGeometry* gridGeometry_;
310 };
311
312public:
315 using Cache = PQ1BubbleGridGeometryCache;
316
317private:
318 using GeometryHelper = typename Cache::GeometryHelper;
319
320 void update_()
321 {
322 cache_.clear_();
323 dofMapper_.update(this->gridView());
324
325 auto numElements = this->gridView().size(0);
326 cache_.scvs_.resize(numElements);
327 cache_.scvfs_.resize(numElements);
328 cache_.hasBoundaryScvf_.resize(numElements, false);
329
330 boundaryDofIndices_.assign(numDofs(), false);
331
332 numScv_ = 0;
333 numScvf_ = 0;
334 numBoundaryScvf_ = 0;
335
336 // Build the scvs and scv faces
337 for (const auto& element : elements(this->gridView()))
338 {
339 auto eIdx = this->elementMapper().index(element);
340
341 // get the element geometry
342 auto elementGeometry = element.geometry();
343 if (!enableHybridCVFE && elementGeometry.type().isCube() && Traits::numCubeBubbleDofs > 1)
344 DUNE_THROW(Dune::NotImplemented, "Multiple bubble dofs for cube elements only for hybrid scheme.");
345
346 const auto refElement = referenceElement(elementGeometry);
347 const auto& localCoefficients = this->feCache().get(element.type()).localCoefficients();
348
349 // instantiate the geometry helper
350 GeometryHelper geometryHelper(elementGeometry);
351
352 numScv_ += geometryHelper.numScv();
353 // construct the sub control volumes
354 cache_.scvs_[eIdx].resize(geometryHelper.numScv());
355
356 // Scvs related to control volumes
357 for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < geometryHelper.numScv(); ++scvLocalIdx)
358 {
359 auto corners = geometryHelper.getScvCorners(scvLocalIdx);
360 cache_.scvs_[eIdx][scvLocalIdx] = SubControlVolume(
361 geometryHelper.scvVolume(scvLocalIdx, corners),
362 geometryHelper.dofPosition(scvLocalIdx),
363 Dumux::center(corners),
364 scvLocalIdx,
365 eIdx,
366 GeometryHelper::dofIndex(this->dofMapper(), element, localCoefficients.localKey(scvLocalIdx)),
367 geometryHelper.isOverlappingScv(scvLocalIdx)
368 );
369 }
370
371 // construct the sub control volume faces
372 const auto numInteriorScvfs = GeometryHelper::numInteriorScvf(elementGeometry.type());
373 numScvf_ += numInteriorScvfs;
374 cache_.scvfs_[eIdx].resize(numInteriorScvfs);
375 LocalIndexType scvfLocalIdx = 0;
376 for (; scvfLocalIdx < numInteriorScvfs; ++scvfLocalIdx)
377 {
378 const auto scvPair = geometryHelper.getScvPairForScvf(scvfLocalIdx);
379 const auto corners = geometryHelper.getScvfCorners(scvfLocalIdx);
380 const auto area = Dumux::convexPolytopeVolume<dim-1>(
381 geometryHelper.getInteriorScvfGeometryType(scvfLocalIdx),
382 [&](unsigned int i){ return corners[i]; }
383 );
384
385 cache_.scvfs_[eIdx][scvfLocalIdx] = SubControlVolumeFace(
386 Dumux::center(corners),
387 area,
388 geometryHelper.normal(corners, scvPair),
389 std::move(scvPair),
390 scvfLocalIdx,
391 geometryHelper.isOverlappingScvf(scvfLocalIdx)
392 );
393 }
394
395 // construct the sub control volume faces on the domain boundary
396 for (const auto& intersection : intersections(this->gridView(), element))
397 {
398 if (intersection.boundary() && !intersection.neighbor())
399 {
400 cache_.hasBoundaryScvf_[eIdx] = true;
401
402 const auto localFacetIndex = intersection.indexInInside();
403 const auto numBoundaryScvf = GeometryHelper::numBoundaryScvf(elementGeometry.type(), localFacetIndex);
404 numScvf_ += numBoundaryScvf;
405 numBoundaryScvf_ += numBoundaryScvf;
406
407 for (unsigned int isScvfLocalIdx = 0; isScvfLocalIdx < numBoundaryScvf; ++isScvfLocalIdx)
408 {
409 // find the scvs this scvf is belonging to
410 const auto scvPair = geometryHelper.getScvPairForBoundaryScvf(localFacetIndex, isScvfLocalIdx);
411 const auto corners = geometryHelper.getBoundaryScvfCorners(localFacetIndex, isScvfLocalIdx);
412 const auto area = Dumux::convexPolytopeVolume<dim-1>(
413 geometryHelper.getBoundaryScvfGeometryType(isScvfLocalIdx),
414 [&](unsigned int i){ return corners[i]; }
415 );
416 cache_.scvfs_[eIdx].emplace_back(
417 Dumux::center(corners),
418 area,
419 intersection.centerUnitOuterNormal(),
420 std::move(scvPair),
421 scvfLocalIdx,
422 typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection },
423 geometryHelper.isOverlappingBoundaryScvf(localFacetIndex)
424 );
425
426 // store look-up map to construct boundary scvf geometries
427 cache_.scvfBoundaryGeometryKeys_[eIdx].emplace_back(std::array<LocalIndexType, 2>{{
428 static_cast<LocalIndexType>(localFacetIndex),
429 static_cast<LocalIndexType>(isScvfLocalIdx)
430 }});
431
432 // increment local counter
433 scvfLocalIdx++;
434 }
435
436 const auto numDofsIntersection = GeometryHelper::numLocalDofsIntersection(elementGeometry.type(), localFacetIndex);
437 // TODO also move this to helper class
438 // add all dofs on the intersection to the set of boundary dofs
439 for (int ilocalDofIdx = 0; ilocalDofIdx < numDofsIntersection; ++ilocalDofIdx)
440 {
441 auto localDofIdx = GeometryHelper::localDofIndexIntersection(elementGeometry.type(), localFacetIndex, ilocalDofIdx);
442 const auto vIdxGlobal = GeometryHelper::dofIndex(this->dofMapper(), element, localCoefficients.localKey(localDofIdx));
443 boundaryDofIndices_[vIdxGlobal] = true;
444 }
445 }
446
447 // inform the grid geometry if we have periodic boundaries
448 else if (periodicGridTraits_.isPeriodic(intersection))
449 {
450 this->setPeriodic();
451
452 // find the mapped periodic vertex of all vertices on periodic boundaries
453 const auto fIdx = intersection.indexInInside();
454 const auto numFaceVerts = refElement.size(fIdx, 1, dim);
455 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
456 for (int localVIdx = 0; localVIdx < numFaceVerts; ++localVIdx)
457 {
458 const auto vIdx = refElement.subEntity(fIdx, 1, localVIdx, dim);
459 const auto vIdxGlobal = this->dofMapper().subIndex(element, vIdx, dim);
460 const auto vPos = elementGeometry.corner(vIdx);
461
462 const auto& outside = intersection.outside();
463 const auto outsideGeometry = outside.geometry();
464 for (const auto& isOutside : intersections(this->gridView(), outside))
465 {
466 // only check periodic vertices of the periodic neighbor
467 if (periodicGridTraits_.isPeriodic(isOutside))
468 {
469 const auto fIdxOutside = isOutside.indexInInside();
470 const auto numFaceVertsOutside = refElement.size(fIdxOutside, 1, dim);
471 for (int localVIdxOutside = 0; localVIdxOutside < numFaceVertsOutside; ++localVIdxOutside)
472 {
473 const auto vIdxOutside = refElement.subEntity(fIdxOutside, 1, localVIdxOutside, dim);
474 const auto vPosOutside = outsideGeometry.corner(vIdxOutside);
475 const auto shift = std::abs((this->bBoxMax()-this->bBoxMin())*intersection.centerUnitOuterNormal());
476 if (std::abs((vPosOutside-vPos).two_norm() - shift) < eps)
477 periodicDofMap_[vIdxGlobal] = this->dofMapper().subIndex(outside, vIdxOutside, dim);
478 }
479 }
480 }
481 }
482 }
483 }
484 }
485
486 // error check: periodic boundaries currently don't work for pq1bubble in parallel
487 if (this->isPeriodic() && this->gridView().comm().size() > 1)
488 DUNE_THROW(Dune::NotImplemented, "Periodic boundaries for pq1bubble method for parallel simulations!");
489 }
490
491 DofMapper dofMapper_;
492
493 const FeCache feCache_;
494
495 std::size_t numScv_;
496 std::size_t numScvf_;
497 std::size_t numBoundaryScvf_;
498
499 // vertices on the boundary
500 std::vector<bool> boundaryDofIndices_;
501
502 // a map for periodic boundary vertices
503 std::unordered_map<GridIndexType, GridIndexType> periodicDofMap_;
504
505 Cache cache_;
506
508};
509
510} // end namespace Dumux
511
512#endif
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: discretization/pq1bubble/geometryhelper.hh:500
Definition: pq1bubblefecache.hh:29
const FiniteElementType & get(const Dune::GeometryType &gt) const
Get local finite element for given GeometryType.
Definition: pq1bubblefecache.hh:48
Base class for the finite volume geometry vector for pq1bubble models This builds up the sub control ...
Definition: discretization/pq1bubble/fvelementgeometry.hh:42
Base class for the finite volume geometry vector for pq1bubble schemes This builds up the sub control...
Definition: discretization/pq1bubble/fvgridgeometry.hh:142
void update(const GridView &gridView)
update all geometries (call this after grid adaption)
Definition: discretization/pq1bubble/fvgridgeometry.hh:227
friend LocalView localView(const PQ1BubbleFVGridGeometry &gg)
local view of this object (constructed with the internal cache)
Definition: discretization/pq1bubble/fvgridgeometry.hh:261
PQ1BubbleGridGeometryCache Cache
Definition: discretization/pq1bubble/fvgridgeometry.hh:315
PQ1BubbleFVGridGeometry(std::shared_ptr< BasicGridGeometry > gg)
Constructor with basic grid geometry used to share state with another grid geometry on the same grid ...
Definition: discretization/pq1bubble/fvgridgeometry.hh:192
static constexpr DiscretizationMethod discMethod
Definition: discretization/pq1bubble/fvgridgeometry.hh:158
std::size_t numBoundaryScvf() const
The total number of boundary sub control volume faces.
Definition: discretization/pq1bubble/fvgridgeometry.hh:219
Dumux::PQ1BubbleFECache< CoordScalar, Scalar, dim, Traits::numCubeBubbleDofs > FeCache
export the finite element cache type
Definition: discretization/pq1bubble/fvgridgeometry.hh:177
typename Traits::ElementQuadratureRule ElementQuadratureRule
the quadrature rule type for elements
Definition: discretization/pq1bubble/fvgridgeometry.hh:187
PQ1BubbleFVGridGeometry(const GridView &gridView)
Constructor.
Definition: discretization/pq1bubble/fvgridgeometry.hh:202
BasicGridGeometry_t< GV, Traits > BasicGridGeometry
export basic grid geometry type for the alternative constructor
Definition: discretization/pq1bubble/fvgridgeometry.hh:165
std::size_t numScv() const
The total number of sub control volumes.
Definition: discretization/pq1bubble/fvgridgeometry.hh:211
std::size_t numScvf() const
The total number of sub control volume faces.
Definition: discretization/pq1bubble/fvgridgeometry.hh:215
static constexpr std::size_t maxNumElementDofs
Definition: discretization/pq1bubble/fvgridgeometry.hh:162
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition: discretization/pq1bubble/fvgridgeometry.hh:241
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:253
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition: discretization/pq1bubble/fvgridgeometry.hh:173
static constexpr bool enableHybridCVFE
Definition: discretization/pq1bubble/fvgridgeometry.hh:160
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition: discretization/pq1bubble/fvgridgeometry.hh:171
std::size_t numDofs() const
The total number of degrees of freedom.
Definition: discretization/pq1bubble/fvgridgeometry.hh:223
bool dofOnBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on the boundary.
Definition: discretization/pq1bubble/fvgridgeometry.hh:245
typename Traits::DofMapper DofMapper
export dof mapper type
Definition: discretization/pq1bubble/fvgridgeometry.hh:175
const DofMapper & dofMapper() const
The dofMapper.
Definition: discretization/pq1bubble/fvgridgeometry.hh:207
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition: discretization/pq1bubble/fvgridgeometry.hh:257
typename Traits::ScvfQuadratureRule ScvfQuadratureRule
the quadrature rule type for scvfs
Definition: discretization/pq1bubble/fvgridgeometry.hh:185
GV GridView
export the grid view type
Definition: discretization/pq1bubble/fvgridgeometry.hh:179
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on a periodic boundary.
Definition: discretization/pq1bubble/fvgridgeometry.hh:249
typename Traits::template LocalView< ThisType, true > LocalView
export the type of the fv element geometry (the local view type)
Definition: discretization/pq1bubble/fvgridgeometry.hh:167
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition: discretization/pq1bubble/fvgridgeometry.hh:169
typename Traits::ScvQuadratureRule ScvQuadratureRule
the quadrature rule type for scvs
Definition: discretization/pq1bubble/fvgridgeometry.hh:183
typename PeriodicGridTraits< typename GV::Grid >::SupportsPeriodicity SupportsPeriodicity
export whether the grid(geometry) supports periodicity
Definition: discretization/pq1bubble/fvgridgeometry.hh:181
void update(GridView &&gridView)
update all geometries (call this after grid adaption)
Definition: discretization/pq1bubble/fvgridgeometry.hh:234
typename Traits::IntersectionQuadratureRule IntersectionQuadratureRule
the quadrature rule type for intersections
Definition: discretization/pq1bubble/fvgridgeometry.hh:189
A class to create sub control volume and sub control volume face geometries per element.
Definition: discretization/pq1bubble/geometryhelper.hh:167
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:58
the sub control volume for the pq1bubble scheme
Definition: discretization/pq1bubble/subcontrolvolume.hh:55
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.
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
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
Defines the index types used for grid and local indices.
The available discretization methods in Dumux.
Dune::Std::detected_or_t< std::conditional_t< enablesHybridCVFE< T >, Dumux::HybridPQ1BubbleGeometryHelper< GV, typename T::SubControlVolume, typename T::SubControlVolumeFace, T::numCubeBubbleDofs >, Dumux::PQ1BubbleGeometryHelper< GV, typename T::SubControlVolume, typename T::SubControlVolumeFace > >, SpecifiesGeometryHelper, T > PQ1BubbleGeometryHelper_t
Definition: discretization/pq1bubble/fvgridgeometry.hh:60
typename T::EnableHybridCVFE EnableHybridCVFE
Definition: discretization/pq1bubble/fvgridgeometry.hh:46
static constexpr bool enablesHybridCVFE
Definition: discretization/pq1bubble/fvgridgeometry.hh:50
typename T::GeometryHelper SpecifiesGeometryHelper
Definition: basegridgeometry.hh:30
CVFE< CVFEMethods::PQ1Bubble > PQ1Bubble
Definition: method.hh:112
Definition: adapt.hh:17
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:166
std::ranges::range auto scvs(const FVElementGeometry &fvGeometry, const LocalDof &localDof)
Definition: localdof.hh:79
Grid properties related to periodicity.
A finite element cache for P1/Q1 function with bubble.
Quadrature rule traits for discretization schemes.
Definition: quadraturerules.hh:84
Definition: defaultmappertraits.hh:23
Definition: method.hh:46
The default traits for the hybrid pq1bubble finite volume grid geometry Defines the scv and scvf type...
Definition: discretization/pq1bubble/fvgridgeometry.hh:128
std::true_type EnableHybridCVFE
Definition: discretization/pq1bubble/fvgridgeometry.hh:128
Structure to define the index types used for grid and local indices.
Definition: indextraits.hh:26
The default traits for the pq1bubble finite volume grid geometry Defines the scv and scvf types and t...
Definition: discretization/pq1bubble/fvgridgeometry.hh:108
static constexpr std::size_t maxNumElementDofs
Definition: discretization/pq1bubble/fvgridgeometry.hh:115
Definition: discretization/pq1bubble/fvgridgeometry.hh:65
static constexpr std::size_t numCubeBubbleDofs
Definition: discretization/pq1bubble/fvgridgeometry.hh:69
static Dune::MCMGLayout layout()
Layout for elements (numCubeBubbleDofs) and vertices.
Definition: discretization/pq1bubble/fvgridgeometry.hh:74
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > DofMapper
Definition: discretization/pq1bubble/fvgridgeometry.hh:66
Definition: periodicgridtraits.hh:24
bool isPeriodic(const typename Grid::LeafIntersection &intersection) const
Definition: periodicgridtraits.hh:28
Dune-based quadrature rule with specified order.
Definition: quadraturerules.hh:66
Midpoint quadrature rule that uses scv/scvf centers.
Definition: quadraturerules.hh:58
Compute the volume of several common geometry types.