version 3.11-dev
Loading...
Searching...
No Matches
discretization/pq2/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_PQ2_GRID_GEOMETRY_HH
15#define DUMUX_DISCRETIZATION_PQ2_GRID_GEOMETRY_HH
16
17#include <array>
18#include <cstddef>
19#include <memory>
20#include <vector>
21#include <utility>
22#include <unordered_map>
23#include <type_traits>
24#include <span>
25
26#include <dune/grid/common/mcmgmapper.hh>
27#include <dune/geometry/type.hh>
28#include <dune/localfunctions/lagrange/lagrangelfecache.hh>
29
31
34
37
46
48
49namespace Dumux {
50
51namespace Detail {
52
53template<class GV, class T>
54using PQ2GeometryHelper_t = Dune::Std::detected_or_t<
55 std::conditional_t<enablesHybridCVFE<T>,
57 void // we currently only support hybrid schemes
58 >,
60 T
61>;
62} // end namespace Detail
63
64template <class GridView>
65struct PQ2MapperTraits :public DefaultMapperTraits<GridView>
66{
67 using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
68
73 static Dune::MCMGLayout layout()
74 {
75 return [](Dune::GeometryType gt, int dimgrid) {
76 return (gt.dim() == 0) || (gt.dim() == 1)
77 || (gt.dim() == dimgrid && gt == Dune::GeometryTypes::cube(dimgrid))
78 || (dimgrid == 3 && gt == Dune::GeometryTypes::cube(dimgrid-1));
79 };
80 }
81};
82
87template<class GridView,
91 class IntersectionRule = Dumux::QuadratureRules::DuneQuadrature<4>,
92 class BoundaryFaceRule = Dumux::QuadratureRules::DuneQuadrature<4>>
94
101template<class GridView, class MapperTraits = PQ2MapperTraits<GridView>, class QuadratureTraits = PQ2QuadratureTraits<GridView>>
103: public MapperTraits, public QuadratureTraits
104{
107
108 template<class GridGeometry, bool enableCache>
110
111 using EnableHybridCVFE = std::true_type;
112
113 // The maximum values correspond to cubes
114 // This can be overwritten by the user when knowing the grid entity types
115 static constexpr std::size_t maxNumElementDofs = []()
116 {
117 if constexpr (GridView::dimension == 1)
118 return 3;
119 else if constexpr (GridView::dimension == 2)
120 return 9;
121 else if constexpr (GridView::dimension == 3)
122 return 27;
123 }();
124};
125
132template<class Scalar,
133 class GV,
134 bool enableCaching = true,
135 class Traits = PQ2DefaultGridGeometryTraits<GV>>
137: public BaseGridGeometry<GV, Traits>
138{
140 using ParentType = BaseGridGeometry<GV, Traits>;
141 using GridIndexType = typename IndexTraits<GV>::GridIndex;
142 using LocalIndexType = typename IndexTraits<GV>::LocalIndex;
143
144 using Element = typename GV::template Codim<0>::Entity;
145 using CoordScalar = typename GV::ctype;
146 static const int dim = GV::dimension;
147 static const int dimWorld = GV::dimensionworld;
148
149 static_assert(dim > 1, "Only implemented for dim > 1");
150
151public:
155
157 static_assert(enableHybridCVFE, "Only hybrid scheme implemented for pq2");
158
159 static constexpr std::size_t maxNumElementDofs = Traits::maxNumElementDofs;
160
164 using LocalView = typename Traits::template LocalView<ThisType, true>;
166 using SubControlVolume = typename Traits::SubControlVolume;
168 using SubControlVolumeFace = typename Traits::SubControlVolumeFace;
174 using DofMapper = typename Traits::DofMapper;
176 using FeCache = Dune::LagrangeLocalFiniteElementCache<CoordScalar, Scalar, dim, 2>;
178 using GridView = GV;
182 using ScvQuadratureRule = typename Traits::ScvQuadratureRule;
184 using ScvfQuadratureRule = typename Traits::ScvfQuadratureRule;
186 using ElementQuadratureRule = typename Traits::ElementQuadratureRule;
188 using IntersectionQuadratureRule = typename Traits::IntersectionQuadratureRule;
190 using BoundaryFaceQuadratureRule = typename Traits::BoundaryFaceQuadratureRule;
191
193 PQ2FVGridGeometry(std::shared_ptr<BasicGridGeometry> gg)
194 : ParentType(std::move(gg))
195 , dofMapper_(this->gridView(), Traits::layout())
196 , cache_(*this)
197 , periodicGridTraits_(this->gridView().grid())
198 {
199 update_();
200 }
201
206
208 const DofMapper& dofMapper() const
209 { return dofMapper_; }
210
212 std::size_t numScv() const
213 { return numScv_; }
214
216 std::size_t numScvf() const
217 { return numScvf_; }
218
220 std::size_t numBoundaryScvf() const
221 { return numBoundaryScvf_; }
222
224 std::size_t numDofs() const
225 { return this->dofMapper().size(); }
226
229 {
231 update_();
232 }
233
236 {
237 ParentType::update(std::move(gridView));
238 update_();
239 }
240
242 const FeCache& feCache() const
243 { return feCache_; }
244
246 bool dofOnBoundary(GridIndexType dofIdx) const
247 { return boundaryDofIndices_[dofIdx]; }
248
250 bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
251 { return periodicDofMap_.count(dofIdx); }
252
254 GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
255 { return periodicDofMap_.at(dofIdx); }
256
258 const std::unordered_map<GridIndexType, GridIndexType>& periodicDofMap() const
259 { return periodicDofMap_; }
260
262 friend inline LocalView localView(const PQ2FVGridGeometry& gg)
263 { return { gg.cache_ }; }
264
265private:
266
267 class PQ2GridGeometryCache
268 {
269 friend class PQ2FVGridGeometry;
270 public:
272 using GeometryHelper = Detail::PQ2GeometryHelper_t<GV, Traits>;
273
274 explicit PQ2GridGeometryCache(const PQ2FVGridGeometry& gg)
275 : gridGeometry_(&gg)
276 {}
277
278 const PQ2FVGridGeometry& gridGeometry() const
279 { return *gridGeometry_; }
280
282 const std::vector<SubControlVolume>& scvs(GridIndexType eIdx) const
283 { return scvs_[eIdx]; }
284
286 const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx) const
287 { return scvfs_[eIdx]; }
288
290 bool hasBoundaryScvf(GridIndexType eIdx) const
291 { return hasBoundaryScvf_[eIdx]; }
292
294 const std::vector<std::array<LocalIndexType, 2>>& scvfBoundaryGeometryKeys(GridIndexType eIdx) const
295 { return scvfBoundaryGeometryKeys_.at(eIdx); }
296
298 auto boundaryFaces(GridIndexType eIdx) const -> std::span<const BoundaryFace>
299 {
300 if (auto it = boundaryFaces_.find(eIdx); it != boundaryFaces_.end())
301 return {it->second};
302 return {};
303 }
304
306 const auto& boundaryFaceScvfRanges(GridIndexType eIdx) const
307 { return boundaryFaceScvfRanges_.at(eIdx); }
308
309 private:
310 void clear_()
311 {
312 scvs_.clear();
313 scvfs_.clear();
314 hasBoundaryScvf_.clear();
315 scvfBoundaryGeometryKeys_.clear();
316 boundaryFaces_.clear();
317 boundaryFaceScvfRanges_.clear();
318 }
319
320 std::vector<std::vector<SubControlVolume>> scvs_;
321 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
322 std::vector<bool> hasBoundaryScvf_;
323 std::unordered_map<GridIndexType, std::vector<std::array<LocalIndexType, 2>>> scvfBoundaryGeometryKeys_;
324 std::unordered_map<GridIndexType, Dune::ReservedVector<typename PQ2FVGridGeometry::BoundaryFace, 2*dim>> boundaryFaces_;
325 std::unordered_map<GridIndexType, Dune::ReservedVector<std::array<LocalIndexType, 2>, 2*dim>> boundaryFaceScvfRanges_;
326
327 const PQ2FVGridGeometry* gridGeometry_;
328 };
329
330public:
333 using Cache = PQ2GridGeometryCache;
334
335private:
336 using GeometryHelper = typename Cache::GeometryHelper;
337
338 void update_()
339 {
340 cache_.clear_();
341 dofMapper_.update(this->gridView());
342
343 auto numElements = this->gridView().size(0);
344 cache_.scvs_.resize(numElements);
345 cache_.scvfs_.resize(numElements);
346 cache_.hasBoundaryScvf_.resize(numElements, false);
347
348 boundaryDofIndices_.assign(numDofs(), false);
349
350 numScv_ = 0;
351 numScvf_ = 0;
352 numBoundaryScvf_ = 0;
353
354 // Build the scvs and scv faces
355 for (const auto& element : elements(this->gridView()))
356 {
357 auto eIdx = this->elementMapper().index(element);
358
359 // get the element geometry
360 auto elementGeometry = element.geometry();
361
362 const auto& localCoefficients = this->feCache().get(element.type()).localCoefficients();
363
364 // instantiate the geometry helper
365 GeometryHelper geometryHelper(elementGeometry);
366
367 numScv_ += geometryHelper.numScv();
368 // construct the sub control volumes
369 cache_.scvs_[eIdx].resize(geometryHelper.numScv());
370
371 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
372 {
373 const auto& localKey = localCoefficients.localKey(keyIdx);
374 // If the dof is a vertex, we construct scvs
375 if(localKey.codim() == dim)
376 {
377 const auto localIdx = localKey.subEntity();
378 // With the new localIdx, scvs can be constructed as for the Box method
379 auto corners = geometryHelper.getScvCorners(localIdx);
380 cache_.scvs_[eIdx][localIdx] = SubControlVolume(
381 geometryHelper.scvVolume(localIdx, corners),
382 geometryHelper.dofPosition(localKey),
383 Dumux::center(corners),
384 localIdx,
385 keyIdx,
386 eIdx,
387 geometryHelper.dofIndex(this->dofMapper(), element, localKey),
388 false
389 );
390 }
391 }
392
393 // construct the sub control volume faces, this is the same as for the Box method
394 const auto numInteriorScvfs = GeometryHelper::numInteriorScvf(elementGeometry.type());
395 numScvf_ += numInteriorScvfs;
396 cache_.scvfs_[eIdx].resize(numInteriorScvfs);
397 LocalIndexType scvfLocalIdx = 0;
398 for (; scvfLocalIdx < numInteriorScvfs; ++scvfLocalIdx)
399 {
400 const auto scvPair = geometryHelper.getScvPairForScvf(scvfLocalIdx);
401 const auto corners = geometryHelper.getScvfCorners(scvfLocalIdx);
402 const auto area = Dumux::convexPolytopeVolume<dim-1>(
403 geometryHelper.getInteriorScvfGeometryType(scvfLocalIdx),
404 [&](unsigned int i){ return corners[i]; }
405 );
406
407 cache_.scvfs_[eIdx][scvfLocalIdx] = SubControlVolumeFace(
408 Dumux::center(corners),
409 area,
410 geometryHelper.normal(corners, scvPair),
411 std::move(scvPair),
412 scvfLocalIdx,
413 geometryHelper.isOverlappingScvf(scvfLocalIdx)
414 );
415 }
416
417 // construct the sub control volume faces on the domain boundary
418 LocalIndexType numBoundaryFaces = 0;
419 for (const auto& intersection : intersections(this->gridView(), element))
420 {
421 if (intersection.boundary() && !intersection.neighbor())
422 {
423 cache_.hasBoundaryScvf_[eIdx] = true;
424
425 // add one boundary face per boundary intersection
426 const auto isGeometry = intersection.geometry();
427 cache_.boundaryFaces_[eIdx].push_back(BoundaryFace{
428 isGeometry.center(),
429 isGeometry.volume(),
430 intersection.centerUnitOuterNormal(),
431 numBoundaryFaces++,
432 static_cast<LocalIndexType>(intersection.indexInInside()),
433 typename BoundaryFace::Traits::BoundaryFlag{intersection}
434 });
435
436 const auto localFacetIndex = intersection.indexInInside();
437 const auto numBoundaryScvf = GeometryHelper::numBoundaryScvf(elementGeometry.type(), localFacetIndex);
438 numScvf_ += numBoundaryScvf;
439 numBoundaryScvf_ += numBoundaryScvf;
440
441 // record the scvf subrange for this boundary face: {offset, count}
442 cache_.boundaryFaceScvfRanges_[eIdx].push_back(std::array<LocalIndexType, 2>{{
443 scvfLocalIdx,
444 static_cast<LocalIndexType>(numBoundaryScvf)
445 }});
446
447 for (unsigned int isScvfLocalIdx = 0; isScvfLocalIdx < numBoundaryScvf; ++isScvfLocalIdx)
448 {
449 // find the scvs this scvf is belonging to
450 const auto scvPair = geometryHelper.getScvPairForBoundaryScvf(localFacetIndex, isScvfLocalIdx);
451 const auto corners = geometryHelper.getBoundaryScvfCorners(localFacetIndex, isScvfLocalIdx);
452 const auto area = Dumux::convexPolytopeVolume<dim-1>(
453 geometryHelper.getBoundaryScvfGeometryType(isScvfLocalIdx),
454 [&](unsigned int i){ return corners[i]; }
455 );
456 cache_.scvfs_[eIdx].emplace_back(
457 Dumux::center(corners),
458 area,
459 intersection.centerUnitOuterNormal(),
460 std::move(scvPair),
461 scvfLocalIdx,
462 typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection },
463 geometryHelper.isOverlappingBoundaryScvf(localFacetIndex)
464 );
465
466 // store look-up map to construct boundary scvf geometries
467 cache_.scvfBoundaryGeometryKeys_[eIdx].emplace_back(std::array<LocalIndexType, 2>{{
468 static_cast<LocalIndexType>(localFacetIndex),
469 static_cast<LocalIndexType>(isScvfLocalIdx)
470 }});
471
472 // increment local counter
473 scvfLocalIdx++;
474 }
475
476 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
477 {
478 if(GeometryHelper::localDofOnIntersection(elementGeometry.type(), intersection.indexInInside(), localCoefficients.localKey(keyIdx)))
479 {
480 const auto dofIdxGlobal = GeometryHelper::dofIndex(this->dofMapper(), element, localCoefficients.localKey(keyIdx));
481 boundaryDofIndices_[dofIdxGlobal] = true;
482 }
483 }
484 }
485
486 // inform the grid geometry if we have periodic boundaries
487 else if (periodicGridTraits_.isPeriodic(intersection))
488 {
489 this->setPeriodic();
490
491 // find the mapped periodic vertex of all vertices on periodic boundaries
492 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
493 for (int localDofIdx = 0; localDofIdx < localCoefficients.size(); ++localDofIdx)
494 {
495 if(!GeometryHelper::localDofOnIntersection(elementGeometry.type(), intersection.indexInInside(), localCoefficients.localKey(localDofIdx)))
496 continue;
497
498 const auto dofIdxGlobal = GeometryHelper::dofIndex(this->dofMapper(), element, localCoefficients.localKey(localDofIdx));
499 const auto dofPos = geometryHelper.dofPosition(localCoefficients.localKey(localDofIdx));
500
501 const auto& outside = intersection.outside();
502 const auto outsideGeometry = outside.geometry();
503 const auto& localCoefficientsOut = this->feCache().get(outsideGeometry.type()).localCoefficients();
504 for (const auto& isOutside : intersections(this->gridView(), outside))
505 {
506 // only check periodic vertices of the periodic neighbor
507 if (isOutside.boundary() && isOutside.neighbor())
508 {
509 for (int localDofIdxOut = 0; localDofIdxOut < localCoefficientsOut.size(); ++localDofIdxOut)
510 {
511 const auto& localKeyOut = localCoefficientsOut.localKey(localDofIdxOut);
512 if(!GeometryHelper::localDofOnIntersection(outsideGeometry.type(), isOutside.indexInInside(), localKeyOut))
513 continue;
514
515 const auto dofIdxGlobalOut = GeometryHelper::dofIndex(this->dofMapper(), outside, localKeyOut);
516 const auto dofPosOutside = GeometryHelper::dofPosition(outsideGeometry, localKeyOut);
517 const auto shift = std::abs((this->bBoxMax()-this->bBoxMin())*intersection.centerUnitOuterNormal());
518 if (std::abs((dofPosOutside-dofPos).two_norm() - shift) < eps)
519 periodicDofMap_[dofIdxGlobal] = dofIdxGlobalOut;
520 }
521 }
522 }
523 }
524 }
525 }
526 }
527
528 // error check: periodic boundaries currently don't work for pq2 in parallel
529 if (this->isPeriodic() && this->gridView().comm().size() > 1)
530 DUNE_THROW(Dune::NotImplemented, "Periodic boundaries for pq2 method for parallel simulations!");
531 }
532
533 DofMapper dofMapper_;
534
535 const FeCache feCache_;
536
537 std::size_t numScv_;
538 std::size_t numScvf_;
539 std::size_t numBoundaryScvf_;
540
541 // dofs on the boundary
542 std::vector<bool> boundaryDofIndices_;
543
544 // a map for periodic boundary dofs
545 std::unordered_map<GridIndexType, GridIndexType> periodicDofMap_;
546
547 Cache cache_;
548
550};
551
552} // end namespace Dumux
553
554#endif
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:52
Base class for the finite volume geometry vector for pq2 models This builds up the sub control volume...
Definition discretization/pq2/fvelementgeometry.hh:48
Base class for the finite volume geometry vector for pq2 schemes This builds up the sub control volum...
Definition discretization/pq2/fvgridgeometry.hh:138
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
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 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:262
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:333
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:254
static constexpr std::size_t maxNumElementDofs
Definition discretization/pq2/fvgridgeometry.hh:159
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition discretization/pq2/fvgridgeometry.hh:258
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.
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
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:93
Defines the index types used for grid and local indices.
The available discretization methods in Dumux.
Definition cvfelocalresidual.hh:25
static constexpr bool enablesHybridCVFE
Definition discretization/pq1bubble/fvgridgeometry.hh:51
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:54
CVFE< CVFEMethods::PQ2 > PQ2
Definition method.hh:122
Definition adapt.hh:17
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:236
Grid properties related to periodicity.
Quadrature rule traits for discretization schemes.
Definition quadraturerules.hh:85
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:104
PQ2FVElementGeometry< GridGeometry, enableCache > LocalView
Definition discretization/pq2/fvgridgeometry.hh:109
PQ2SubControlVolumeFace< GridView > SubControlVolumeFace
Definition discretization/pq2/fvgridgeometry.hh:106
PQ2SubControlVolume< GridView > SubControlVolume
Definition discretization/pq2/fvgridgeometry.hh:105
static constexpr std::size_t maxNumElementDofs
Definition discretization/pq2/fvgridgeometry.hh:115
std::true_type EnableHybridCVFE
Definition discretization/pq2/fvgridgeometry.hh:111
Definition discretization/pq2/fvgridgeometry.hh:66
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > DofMapper
Definition discretization/pq2/fvgridgeometry.hh:67
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:73
Definition periodicgridtraits.hh:24
Definition periodicgridtraits.hh:23
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.