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>;
274 using DofHelper = typename GeometryHelper::DofHelper;
275
276 explicit PQ2GridGeometryCache(const PQ2FVGridGeometry& gg)
277 : gridGeometry_(&gg)
278 {}
279
280 const PQ2FVGridGeometry& gridGeometry() const
281 { return *gridGeometry_; }
282
284 const std::vector<SubControlVolume>& scvs(GridIndexType eIdx) const
285 { return scvs_[eIdx]; }
286
288 const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx) const
289 { return scvfs_[eIdx]; }
290
292 bool hasBoundaryScvf(GridIndexType eIdx) const
293 { return hasBoundaryScvf_[eIdx]; }
294
296 const std::vector<std::array<LocalIndexType, 2>>& scvfBoundaryGeometryKeys(GridIndexType eIdx) const
297 { return scvfBoundaryGeometryKeys_.at(eIdx); }
298
300 auto boundaryFaces(GridIndexType eIdx) const -> std::span<const BoundaryFace>
301 {
302 if (auto it = boundaryFaces_.find(eIdx); it != boundaryFaces_.end())
303 return {it->second};
304 return {};
305 }
306
308 const auto& boundaryFaceScvfRanges(GridIndexType eIdx) const
309 { return boundaryFaceScvfRanges_.at(eIdx); }
310
311 private:
312 void clear_()
313 {
314 scvs_.clear();
315 scvfs_.clear();
316 hasBoundaryScvf_.clear();
317 scvfBoundaryGeometryKeys_.clear();
318 boundaryFaces_.clear();
319 boundaryFaceScvfRanges_.clear();
320 }
321
322 std::vector<std::vector<SubControlVolume>> scvs_;
323 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
324 std::vector<bool> hasBoundaryScvf_;
325 std::unordered_map<GridIndexType, std::vector<std::array<LocalIndexType, 2>>> scvfBoundaryGeometryKeys_;
326 std::unordered_map<GridIndexType, Dune::ReservedVector<typename PQ2FVGridGeometry::BoundaryFace, 2*dim>> boundaryFaces_;
327 std::unordered_map<GridIndexType, Dune::ReservedVector<std::array<LocalIndexType, 2>, 2*dim>> boundaryFaceScvfRanges_;
328
329 const PQ2FVGridGeometry* gridGeometry_;
330 };
331
332public:
335 using Cache = PQ2GridGeometryCache;
336
337private:
338 using GeometryHelper = typename Cache::GeometryHelper;
339 using DofHelper = typename GeometryHelper::DofHelper;
340
341 void update_()
342 {
343 cache_.clear_();
344 dofMapper_.update(this->gridView());
345
346 auto numElements = this->gridView().size(0);
347 cache_.scvs_.resize(numElements);
348 cache_.scvfs_.resize(numElements);
349 cache_.hasBoundaryScvf_.resize(numElements, false);
350
351 boundaryDofIndices_.assign(numDofs(), false);
352
353 numScv_ = 0;
354 numScvf_ = 0;
355 numBoundaryScvf_ = 0;
356
357 // Build the scvs and scv faces
358 for (const auto& element : elements(this->gridView()))
359 {
360 auto eIdx = this->elementMapper().index(element);
361
362 // get the element geometry
363 auto elementGeometry = element.geometry();
364
365 const auto& localCoefficients = this->feCache().get(element.type()).localCoefficients();
366
367 // instantiate the geometry helper
368 GeometryHelper geometryHelper(elementGeometry);
369
370 numScv_ += geometryHelper.numScv();
371 // construct the sub control volumes
372 cache_.scvs_[eIdx].resize(geometryHelper.numScv());
373
374 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
375 {
376 const auto& localKey = localCoefficients.localKey(keyIdx);
377 // If the dof is a vertex, we construct scvs
378 if(localKey.codim() == dim)
379 {
380 const auto localIdx = localKey.subEntity();
381 // With the new localIdx, scvs can be constructed as for the Box method
382 auto corners = geometryHelper.getScvCorners(localIdx);
383 cache_.scvs_[eIdx][localIdx] = SubControlVolume(
384 geometryHelper.scvVolume(localIdx, corners),
385 DofHelper::dofPosition(elementGeometry, localKey),
386 Dumux::center(corners),
387 localIdx,
388 keyIdx,
389 eIdx,
390 DofHelper::dofIndex(this->dofMapper(), element, localKey),
391 false
392 );
393 }
394 }
395
396 // construct the sub control volume faces, this is the same as for the Box method
397 const auto numInteriorScvfs = GeometryHelper::numInteriorScvf(elementGeometry.type());
398 numScvf_ += numInteriorScvfs;
399 cache_.scvfs_[eIdx].resize(numInteriorScvfs);
400 LocalIndexType scvfLocalIdx = 0;
401 for (; scvfLocalIdx < numInteriorScvfs; ++scvfLocalIdx)
402 {
403 const auto scvPair = geometryHelper.getScvPairForScvf(scvfLocalIdx);
404 const auto corners = geometryHelper.getScvfCorners(scvfLocalIdx);
405 const auto area = Dumux::convexPolytopeVolume<dim-1>(
406 geometryHelper.getInteriorScvfGeometryType(scvfLocalIdx),
407 [&](unsigned int i){ return corners[i]; }
408 );
409
410 cache_.scvfs_[eIdx][scvfLocalIdx] = SubControlVolumeFace(
411 Dumux::center(corners),
412 area,
413 geometryHelper.normal(corners, scvPair),
414 std::move(scvPair),
415 scvfLocalIdx,
416 geometryHelper.isOverlappingScvf(scvfLocalIdx)
417 );
418 }
419
420 // construct the sub control volume faces on the domain boundary
421 LocalIndexType numBoundaryFaces = 0;
422 for (const auto& intersection : intersections(this->gridView(), element))
423 {
424 if (intersection.boundary() && !intersection.neighbor())
425 {
426 cache_.hasBoundaryScvf_[eIdx] = true;
427
428 // add one boundary face per boundary intersection
429 const auto isGeometry = intersection.geometry();
430 cache_.boundaryFaces_[eIdx].push_back(BoundaryFace{
431 isGeometry.center(),
432 isGeometry.volume(),
433 intersection.centerUnitOuterNormal(),
434 numBoundaryFaces++,
435 static_cast<LocalIndexType>(intersection.indexInInside()),
436 typename BoundaryFace::Traits::BoundaryFlag{intersection}
437 });
438
439 const auto localFacetIndex = intersection.indexInInside();
440 const auto numBoundaryScvf = GeometryHelper::numBoundaryScvf(elementGeometry.type(), localFacetIndex);
441 numScvf_ += numBoundaryScvf;
442 numBoundaryScvf_ += numBoundaryScvf;
443
444 // record the scvf subrange for this boundary face: {offset, count}
445 cache_.boundaryFaceScvfRanges_[eIdx].push_back(std::array<LocalIndexType, 2>{{
446 scvfLocalIdx,
447 static_cast<LocalIndexType>(numBoundaryScvf)
448 }});
449
450 for (unsigned int isScvfLocalIdx = 0; isScvfLocalIdx < numBoundaryScvf; ++isScvfLocalIdx)
451 {
452 // find the scvs this scvf is belonging to
453 const auto scvPair = geometryHelper.getScvPairForBoundaryScvf(localFacetIndex, isScvfLocalIdx);
454 const auto corners = geometryHelper.getBoundaryScvfCorners(localFacetIndex, isScvfLocalIdx);
455 const auto area = Dumux::convexPolytopeVolume<dim-1>(
456 geometryHelper.getBoundaryScvfGeometryType(isScvfLocalIdx),
457 [&](unsigned int i){ return corners[i]; }
458 );
459 cache_.scvfs_[eIdx].emplace_back(
460 Dumux::center(corners),
461 area,
462 intersection.centerUnitOuterNormal(),
463 std::move(scvPair),
464 scvfLocalIdx,
465 typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection },
466 geometryHelper.isOverlappingBoundaryScvf(localFacetIndex)
467 );
468
469 // store look-up map to construct boundary scvf geometries
470 cache_.scvfBoundaryGeometryKeys_[eIdx].emplace_back(std::array<LocalIndexType, 2>{{
471 static_cast<LocalIndexType>(localFacetIndex),
472 static_cast<LocalIndexType>(isScvfLocalIdx)
473 }});
474
475 // increment local counter
476 scvfLocalIdx++;
477 }
478
479 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
480 {
481 if(DofHelper::localDofOnIntersection(elementGeometry.type(), intersection.indexInInside(), localCoefficients.localKey(keyIdx)))
482 {
483 const auto dofIdxGlobal = DofHelper::dofIndex(this->dofMapper(), element, localCoefficients.localKey(keyIdx));
484 boundaryDofIndices_[dofIdxGlobal] = true;
485 }
486 }
487 }
488
489 // inform the grid geometry if we have periodic boundaries
490 else if (periodicGridTraits_.isPeriodic(intersection))
491 {
492 this->setPeriodic();
493
494 // find the mapped periodic vertex of all vertices on periodic boundaries
495 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
496 for (int localDofIdx = 0; localDofIdx < localCoefficients.size(); ++localDofIdx)
497 {
498 if(!DofHelper::localDofOnIntersection(elementGeometry.type(), intersection.indexInInside(), localCoefficients.localKey(localDofIdx)))
499 continue;
500
501 const auto dofIdxGlobal = DofHelper::dofIndex(this->dofMapper(), element, localCoefficients.localKey(localDofIdx));
502 const auto dofPos = DofHelper::dofPosition(elementGeometry, localCoefficients.localKey(localDofIdx));
503
504 const auto& outside = intersection.outside();
505 const auto outsideGeometry = outside.geometry();
506 const auto& localCoefficientsOut = this->feCache().get(outsideGeometry.type()).localCoefficients();
507 for (const auto& isOutside : intersections(this->gridView(), outside))
508 {
509 // only check periodic vertices of the periodic neighbor
510 if (isOutside.boundary() && isOutside.neighbor())
511 {
512 for (int localDofIdxOut = 0; localDofIdxOut < localCoefficientsOut.size(); ++localDofIdxOut)
513 {
514 const auto& localKeyOut = localCoefficientsOut.localKey(localDofIdxOut);
515 if(!DofHelper::localDofOnIntersection(outsideGeometry.type(), isOutside.indexInInside(), localKeyOut))
516 continue;
517
518 const auto dofIdxGlobalOut = DofHelper::dofIndex(this->dofMapper(), outside, localKeyOut);
519 const auto dofPosOutside = DofHelper::dofPosition(outsideGeometry, localKeyOut);
520 const auto shift = std::abs((this->bBoxMax()-this->bBoxMin())*intersection.centerUnitOuterNormal());
521 if (std::abs((dofPosOutside-dofPos).two_norm() - shift) < eps)
522 periodicDofMap_[dofIdxGlobal] = dofIdxGlobalOut;
523 }
524 }
525 }
526 }
527 }
528 }
529 }
530
531 // error check: periodic boundaries currently don't work for pq2 in parallel
532 if (this->isPeriodic() && this->gridView().comm().size() > 1)
533 DUNE_THROW(Dune::NotImplemented, "Periodic boundaries for pq2 method for parallel simulations!");
534 }
535
536 DofMapper dofMapper_;
537
538 const FeCache feCache_;
539
540 std::size_t numScv_;
541 std::size_t numScvf_;
542 std::size_t numBoundaryScvf_;
543
544 // dofs on the boundary
545 std::vector<bool> boundaryDofIndices_;
546
547 // a map for periodic boundary dofs
548 std::unordered_map<GridIndexType, GridIndexType> periodicDofMap_;
549
550 Cache cache_;
551
553};
554
555} // end namespace Dumux
556
557#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:55
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:335
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:132
Definition adapt.hh:17
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:257
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.