version 3.11-dev
Loading...
Searching...
No Matches
discretization/pq3/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_PQ3_GRID_GEOMETRY_HH
15#define DUMUX_DISCRETIZATION_PQ3_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
38// Reuse PQ2 SCV/SCVF/FVElementGeometry (all templated, work for any GG)
45
46namespace Dumux {
47
48// Reuse PQ2 SCV/SCVF types under PQ3 aliases
49template<class GV>
51
52template<class GV>
54
55// FVElementGeometry reused from PQ2 (it's fully templated on the grid geometry)
56template<class GG, bool enableCache>
58
59namespace Detail {
60
61template<class GV, class T>
62using PQ3GeometryHelper_t = Dune::Std::detected_or_t<
63 std::conditional_t<enablesHybridCVFE<T>,
65 void
66 >,
68 T
69>;
70
71} // end namespace Detail
72
79template<class GV>
81{
82 using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GV>;
83
84 static Dune::MCMGLayout layout()
85 {
86 return [](Dune::GeometryType gt, int /*dimgrid*/) -> std::size_t {
87 if (gt.dim() == 0) return 1; // vertices: 1 DOF each
88 if (gt.dim() == 1) return 2; // edges: 2 interior DOFs (order 3)
89 if (gt.dim() == 2) {
90 if (gt == Dune::GeometryTypes::cube(2)) return 4; // quad: 4 interior DOFs
91 if (gt == Dune::GeometryTypes::simplex(2)) return 1; // triangle: 1 interior DOF
92 }
93 if (gt.dim() == 3) {
94 if (gt == Dune::GeometryTypes::cube(3)) return 8; // hex: 8 interior DOFs
95 // simplex (tet): 0 interior DOFs for P3
96 }
97 return 0;
98 };
99 }
100};
101
106template<class GridView,
110 class IntersectionRule = Dumux::QuadratureRules::DuneQuadrature<6>,
111 class BoundaryFaceRule = Dumux::QuadratureRules::DuneQuadrature<6>>
113
118template<class GridView,
119 class MapperTraits = PQ3MapperTraits<GridView>,
120 class QuadratureTraits = PQ3QuadratureTraits<GridView>>
122: public MapperTraits, public QuadratureTraits
123{
126
127 template<class GridGeometry, bool enableCache>
129
130 using EnableHybridCVFE = std::true_type;
131
132 // Maximum number of element-local DOFs (for cubes, order 3)
133 static constexpr std::size_t maxNumElementDofs = []()
134 {
135 if constexpr (GridView::dimension == 1)
136 return 4; // Q3 interval: 2 vertices + 2 edge interior
137 else if constexpr (GridView::dimension == 2)
138 return 16; // Q3 quad: 4 vertices + 8 edge + 4 interior
139 else if constexpr (GridView::dimension == 3)
140 return 64; // Q3 hex: 8 vertices + 24 edge + 24 face + 8 interior
141 }();
142};
143
151template<class Scalar,
152 class GV,
153 bool enableCaching = true,
154 class Traits = PQ3DefaultGridGeometryTraits<GV>>
156: public BaseGridGeometry<GV, Traits>
157{
159 using ParentType = BaseGridGeometry<GV, Traits>;
160 using GridIndexType = typename IndexTraits<GV>::GridIndex;
161 using LocalIndexType = typename IndexTraits<GV>::LocalIndex;
162
163 using Element = typename GV::template Codim<0>::Entity;
164 using CoordScalar = typename GV::ctype;
165 static const int dim = GV::dimension;
166 static const int dimWorld = GV::dimensionworld;
167
168 static_assert(dim > 1, "Only implemented for dim > 1");
169
170public:
174
176 static_assert(enableHybridCVFE, "Only hybrid scheme implemented for pq3");
177
178 static constexpr std::size_t maxNumElementDofs = Traits::maxNumElementDofs;
179
183 using LocalView = typename Traits::template LocalView<ThisType, true>;
185 using SubControlVolume = typename Traits::SubControlVolume;
187 using SubControlVolumeFace = typename Traits::SubControlVolumeFace;
193 using DofMapper = typename Traits::DofMapper;
195 using FeCache = Dune::LagrangeLocalFiniteElementCache<CoordScalar, Scalar, dim, 3>;
197 using GridView = GV;
201 using ScvQuadratureRule = typename Traits::ScvQuadratureRule;
202 using ScvfQuadratureRule = typename Traits::ScvfQuadratureRule;
203 using ElementQuadratureRule = typename Traits::ElementQuadratureRule;
204 using IntersectionQuadratureRule = typename Traits::IntersectionQuadratureRule;
205 using BoundaryFaceQuadratureRule = typename Traits::BoundaryFaceQuadratureRule;
206
208 PQ3FVGridGeometry(std::shared_ptr<BasicGridGeometry> gg)
209 : ParentType(std::move(gg))
210 , dofMapper_(this->gridView(), Traits::layout())
211 , cache_(*this)
212 , periodicGridTraits_(this->gridView().grid())
213 {
214 update_();
215 }
216
221
222 const DofMapper& dofMapper() const
223 { return dofMapper_; }
224
225 std::size_t numScv() const
226 { return numScv_; }
227
228 std::size_t numScvf() const
229 { return numScvf_; }
230
231 std::size_t numBoundaryScvf() const
232 { return numBoundaryScvf_; }
233
234 std::size_t numDofs() const
235 { return this->dofMapper().size(); }
236
238 {
240 update_();
241 }
242
244 {
245 ParentType::update(std::move(gridView));
246 update_();
247 }
248
249 const FeCache& feCache() const
250 { return feCache_; }
251
256 template<class LocalKey>
257 auto dofIndex(const Element& element, const LocalKey& localKey) const
258 { return Detail::PQ3GeometryHelper_t<GV, Traits>::DofHelper::dofIndex(dofMapper_, element, localKey, this->gridView().grid().globalIdSet()); }
259
260 bool dofOnBoundary(GridIndexType dofIdx) const
261 { return boundaryDofIndices_[dofIdx]; }
262
263 bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
264 { return periodicDofMap_.count(dofIdx); }
265
266 GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
267 { return periodicDofMap_.at(dofIdx); }
268
269 const std::unordered_map<GridIndexType, GridIndexType>& periodicDofMap() const
270 { return periodicDofMap_; }
271
272 friend inline LocalView localView(const PQ3FVGridGeometry& gg)
273 { return { gg.cache_ }; }
274
275private:
276
277 class PQ3GridGeometryCache
278 {
279 friend class PQ3FVGridGeometry;
280 public:
281 using GeometryHelper = Detail::PQ3GeometryHelper_t<GV, Traits>;
282 using DofHelper = GeometryHelper::DofHelper;
283
284 explicit PQ3GridGeometryCache(const PQ3FVGridGeometry& gg)
285 : gridGeometry_(&gg)
286 {}
287
288 const PQ3FVGridGeometry& gridGeometry() const
289 { return *gridGeometry_; }
290
291 const std::vector<SubControlVolume>& scvs(GridIndexType eIdx) const
292 { return scvs_[eIdx]; }
293
294 const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx) const
295 { return scvfs_[eIdx]; }
296
297 bool hasBoundaryScvf(GridIndexType eIdx) const
298 { return hasBoundaryScvf_[eIdx]; }
299
300 const std::vector<std::array<LocalIndexType, 2>>& scvfBoundaryGeometryKeys(GridIndexType eIdx) const
301 { return scvfBoundaryGeometryKeys_.at(eIdx); }
302
303 auto boundaryFaces(GridIndexType eIdx) const -> std::span<const BoundaryFace>
304 {
305 if (auto it = boundaryFaces_.find(eIdx); it != boundaryFaces_.end())
306 return {it->second};
307 return {};
308 }
309
310 const auto& boundaryFaceScvfRanges(GridIndexType eIdx) const
311 { return boundaryFaceScvfRanges_.at(eIdx); }
312
313 private:
314 void clear_()
315 {
316 scvs_.clear();
317 scvfs_.clear();
318 hasBoundaryScvf_.clear();
319 scvfBoundaryGeometryKeys_.clear();
320 boundaryFaces_.clear();
321 boundaryFaceScvfRanges_.clear();
322 }
323
324 std::vector<std::vector<SubControlVolume>> scvs_;
325 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
326 std::vector<bool> hasBoundaryScvf_;
327 std::unordered_map<GridIndexType, std::vector<std::array<LocalIndexType, 2>>> scvfBoundaryGeometryKeys_;
328 std::unordered_map<GridIndexType, Dune::ReservedVector<typename PQ3FVGridGeometry::BoundaryFace, 2*dim>> boundaryFaces_;
329 std::unordered_map<GridIndexType, Dune::ReservedVector<std::array<LocalIndexType, 2>, 2*dim>> boundaryFaceScvfRanges_;
330
331 const PQ3FVGridGeometry* gridGeometry_;
332 };
333
334public:
335 using Cache = PQ3GridGeometryCache;
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 const auto& gidSet = this->gridView().grid().globalIdSet();
347
348 auto numElements = this->gridView().size(0);
349 cache_.scvs_.resize(numElements);
350 cache_.scvfs_.resize(numElements);
351 cache_.hasBoundaryScvf_.resize(numElements, false);
352
353 boundaryDofIndices_.assign(numDofs(), false);
354
355 numScv_ = 0;
356 numScvf_ = 0;
357 numBoundaryScvf_ = 0;
358
359 for (const auto& element : elements(this->gridView()))
360 {
361 auto eIdx = this->elementMapper().index(element);
362 auto elementGeometry = element.geometry();
363 const auto& localCoefficients = this->feCache().get(element.type()).localCoefficients();
364
365 GeometryHelper geometryHelper(elementGeometry);
366
367 numScv_ += geometryHelper.numScv();
368 cache_.scvs_[eIdx].resize(geometryHelper.numScv());
369
370 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
371 {
372 const auto& localKey = localCoefficients.localKey(keyIdx);
373 if (localKey.codim() == dim)
374 {
375 const auto localIdx = localKey.subEntity();
376 auto corners = geometryHelper.getScvCorners(localIdx);
377 cache_.scvs_[eIdx][localIdx] = SubControlVolume(
378 geometryHelper.scvVolume(localIdx, corners),
379 DofHelper::dofPosition(elementGeometry, localKey),
380 Dumux::center(corners),
381 localIdx,
382 keyIdx,
383 eIdx,
384 DofHelper::dofIndex(this->dofMapper(), element, localKey, gidSet),
385 false
386 );
387 }
388 }
389
390 const auto numInteriorScvfs = GeometryHelper::numInteriorScvf(elementGeometry.type());
391 numScvf_ += numInteriorScvfs;
392 cache_.scvfs_[eIdx].resize(numInteriorScvfs);
393 LocalIndexType scvfLocalIdx = 0;
394 for (; scvfLocalIdx < numInteriorScvfs; ++scvfLocalIdx)
395 {
396 const auto scvPair = geometryHelper.getScvPairForScvf(scvfLocalIdx);
397 const auto corners = geometryHelper.getScvfCorners(scvfLocalIdx);
398 const auto area = Dumux::convexPolytopeVolume<dim-1>(
399 geometryHelper.getInteriorScvfGeometryType(scvfLocalIdx),
400 [&](unsigned int i){ return corners[i]; }
401 );
402
403 cache_.scvfs_[eIdx][scvfLocalIdx] = SubControlVolumeFace(
404 Dumux::center(corners),
405 area,
406 geometryHelper.normal(corners, scvPair),
407 std::move(scvPair),
408 scvfLocalIdx,
409 geometryHelper.isOverlappingScvf(scvfLocalIdx)
410 );
411 }
412
413 LocalIndexType numBoundaryFaces = 0;
414 for (const auto& intersection : intersections(this->gridView(), element))
415 {
416 if (intersection.boundary() && !intersection.neighbor())
417 {
418 cache_.hasBoundaryScvf_[eIdx] = true;
419
420 const auto isGeometry = intersection.geometry();
421 cache_.boundaryFaces_[eIdx].push_back(BoundaryFace{
422 isGeometry.center(),
423 isGeometry.volume(),
424 intersection.centerUnitOuterNormal(),
425 numBoundaryFaces++,
426 static_cast<LocalIndexType>(intersection.indexInInside()),
427 typename BoundaryFace::Traits::BoundaryFlag{intersection}
428 });
429
430 const auto localFacetIndex = intersection.indexInInside();
431 const auto numBoundaryScvf = GeometryHelper::numBoundaryScvf(elementGeometry.type(), localFacetIndex);
432 numScvf_ += numBoundaryScvf;
433 numBoundaryScvf_ += numBoundaryScvf;
434
435 cache_.boundaryFaceScvfRanges_[eIdx].push_back(std::array<LocalIndexType, 2>{{
436 scvfLocalIdx,
437 static_cast<LocalIndexType>(numBoundaryScvf)
438 }});
439
440 for (unsigned int isScvfLocalIdx = 0; isScvfLocalIdx < numBoundaryScvf; ++isScvfLocalIdx)
441 {
442 const auto scvPair = geometryHelper.getScvPairForBoundaryScvf(localFacetIndex, isScvfLocalIdx);
443 const auto corners = geometryHelper.getBoundaryScvfCorners(localFacetIndex, isScvfLocalIdx);
444 const auto area = Dumux::convexPolytopeVolume<dim-1>(
445 geometryHelper.getBoundaryScvfGeometryType(isScvfLocalIdx),
446 [&](unsigned int i){ return corners[i]; }
447 );
448 cache_.scvfs_[eIdx].emplace_back(
449 Dumux::center(corners),
450 area,
451 intersection.centerUnitOuterNormal(),
452 std::move(scvPair),
453 scvfLocalIdx,
454 typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection },
455 geometryHelper.isOverlappingBoundaryScvf(localFacetIndex)
456 );
457
458 cache_.scvfBoundaryGeometryKeys_[eIdx].emplace_back(std::array<LocalIndexType, 2>{{
459 static_cast<LocalIndexType>(localFacetIndex),
460 static_cast<LocalIndexType>(isScvfLocalIdx)
461 }});
462
463 scvfLocalIdx++;
464 }
465
466 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
467 {
468 if (DofHelper::localDofOnIntersection(elementGeometry.type(), intersection.indexInInside(), localCoefficients.localKey(keyIdx)))
469 {
470 const auto dofIdxGlobal = DofHelper::dofIndex(this->dofMapper(), element, localCoefficients.localKey(keyIdx), gidSet);
471 boundaryDofIndices_[dofIdxGlobal] = true;
472 }
473 }
474 }
475
476 else if (periodicGridTraits_.isPeriodic(intersection))
477 {
478 this->setPeriodic();
479
480 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
481 for (int localDofIdx = 0; localDofIdx < localCoefficients.size(); ++localDofIdx)
482 {
483 if (!DofHelper::localDofOnIntersection(elementGeometry.type(), intersection.indexInInside(), localCoefficients.localKey(localDofIdx)))
484 continue;
485
486 const auto dofIdxGlobal = DofHelper::dofIndex(this->dofMapper(), element, localCoefficients.localKey(localDofIdx), gidSet);
487 const auto dofPos = DofHelper::dofPosition(elementGeometry, localCoefficients.localKey(localDofIdx));
488
489 const auto& outside = intersection.outside();
490 const auto outsideGeometry = outside.geometry();
491 const auto& localCoefficientsOut = this->feCache().get(outsideGeometry.type()).localCoefficients();
492 for (const auto& isOutside : intersections(this->gridView(), outside))
493 {
494 if (isOutside.boundary() && isOutside.neighbor())
495 {
496 for (int localDofIdxOut = 0; localDofIdxOut < localCoefficientsOut.size(); ++localDofIdxOut)
497 {
498 const auto& localKeyOut = localCoefficientsOut.localKey(localDofIdxOut);
499 if (!DofHelper::localDofOnIntersection(outsideGeometry.type(), isOutside.indexInInside(), localKeyOut))
500 continue;
501
502 const auto dofIdxGlobalOut = DofHelper::dofIndex(this->dofMapper(), outside, localKeyOut, gidSet);
503 const auto dofPosOutside = DofHelper::dofPosition(outsideGeometry, localKeyOut);
504 const auto shift = std::abs((this->bBoxMax()-this->bBoxMin())*intersection.centerUnitOuterNormal());
505 if (std::abs((dofPosOutside-dofPos).two_norm() - shift) < eps)
506 periodicDofMap_[dofIdxGlobal] = dofIdxGlobalOut;
507 }
508 }
509 }
510 }
511 }
512 }
513 }
514
515 if (this->isPeriodic() && this->gridView().comm().size() > 1)
516 DUNE_THROW(Dune::NotImplemented, "Periodic boundaries for pq3 method for parallel simulations!");
517 }
518
519 DofMapper dofMapper_;
520 const FeCache feCache_;
521 std::size_t numScv_;
522 std::size_t numScvf_;
523 std::size_t numBoundaryScvf_;
524 std::vector<bool> boundaryDofIndices_;
525 std::unordered_map<GridIndexType, GridIndexType> periodicDofMap_;
526 Cache cache_;
528};
529
530} // end namespace Dumux
531
532#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 for the order...
Definition discretization/pq3/geometryhelper.hh:53
Base class for the finite volume geometry vector for pq2 models This builds up the sub control volume...
Definition discretization/pq2/fvelementgeometry.hh:48
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
Finite volume geometry for the pq3 hybrid CVFE scheme (order-3 Lagrange elements).
Definition discretization/pq3/fvgridgeometry.hh:157
typename PQ3DefaultGridGeometryTraits< GridView >::IntersectionQuadratureRule IntersectionQuadratureRule
Definition discretization/pq3/fvgridgeometry.hh:204
Dune::LagrangeLocalFiniteElementCache< CoordScalar, Scalar, dim, 3 > FeCache
Definition discretization/pq3/fvgridgeometry.hh:195
typename PQ3DefaultGridGeometryTraits< GridView >::ScvQuadratureRule ScvQuadratureRule
Definition discretization/pq3/fvgridgeometry.hh:201
PQ3FVGridGeometry(const GridView &gridView)
Constructor.
Definition discretization/pq3/fvgridgeometry.hh:218
typename PQ3DefaultGridGeometryTraits< GridView >::ScvfQuadratureRule ScvfQuadratureRule
Definition discretization/pq3/fvgridgeometry.hh:202
std::size_t numScv() const
Definition discretization/pq3/fvgridgeometry.hh:225
friend LocalView localView(const PQ3FVGridGeometry &gg)
Definition discretization/pq3/fvgridgeometry.hh:272
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
Definition discretization/pq3/fvgridgeometry.hh:263
bool dofOnBoundary(GridIndexType dofIdx) const
Definition discretization/pq3/fvgridgeometry.hh:260
const DofMapper & dofMapper() const
Definition discretization/pq3/fvgridgeometry.hh:222
auto dofIndex(const Element &element, const LocalKey &localKey) const
Definition discretization/pq3/fvgridgeometry.hh:257
Experimental::BoundaryFace< GridView > BoundaryFace
Definition discretization/pq3/fvgridgeometry.hh:189
const FeCache & feCache() const
Definition discretization/pq3/fvgridgeometry.hh:249
GridView GridView
Definition discretization/pq3/fvgridgeometry.hh:197
typename PQ3DefaultGridGeometryTraits< GridView >::template LocalView< ThisType, true > LocalView
Definition discretization/pq3/fvgridgeometry.hh:183
static constexpr std::size_t maxNumElementDofs
Definition discretization/pq3/fvgridgeometry.hh:178
static constexpr bool enableHybridCVFE
Definition discretization/pq3/fvgridgeometry.hh:175
std::size_t numDofs() const
Definition discretization/pq3/fvgridgeometry.hh:234
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Definition discretization/pq3/fvgridgeometry.hh:269
void update(const GridView &gridView)
Definition discretization/pq3/fvgridgeometry.hh:237
DiscretizationMethods::PQ3 DiscretizationMethod
Definition discretization/pq3/fvgridgeometry.hh:172
typename PQ3DefaultGridGeometryTraits< GridView >::BoundaryFaceQuadratureRule BoundaryFaceQuadratureRule
Definition discretization/pq3/fvgridgeometry.hh:205
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
Definition discretization/pq3/fvgridgeometry.hh:266
typename PeriodicGridTraits< typename GridView::Grid >::SupportsPeriodicity SupportsPeriodicity
Definition discretization/pq3/fvgridgeometry.hh:199
typename PQ3DefaultGridGeometryTraits< GridView >::SubControlVolume SubControlVolume
Definition discretization/pq3/fvgridgeometry.hh:185
typename PQ3DefaultGridGeometryTraits< GridView >::DofMapper DofMapper
Definition discretization/pq3/fvgridgeometry.hh:193
void update(GridView &&gridView)
Definition discretization/pq3/fvgridgeometry.hh:243
std::size_t numBoundaryScvf() const
Definition discretization/pq3/fvgridgeometry.hh:231
std::size_t numScvf() const
Definition discretization/pq3/fvgridgeometry.hh:228
PQ3GridGeometryCache Cache
Definition discretization/pq3/fvgridgeometry.hh:335
typename PQ3DefaultGridGeometryTraits< GridView >::SubControlVolumeFace SubControlVolumeFace
Definition discretization/pq3/fvgridgeometry.hh:187
BasicGridGeometry_t< GridView, PQ3DefaultGridGeometryTraits< GridView > > BasicGridGeometry
Definition discretization/pq3/fvgridgeometry.hh:181
PQ3FVGridGeometry(std::shared_ptr< BasicGridGeometry > gg)
Constructor with shared basic grid geometry.
Definition discretization/pq3/fvgridgeometry.hh:208
static constexpr DiscretizationMethod discMethod
Definition discretization/pq3/fvgridgeometry.hh:173
typename PQ3DefaultGridGeometryTraits< GridView >::ElementQuadratureRule ElementQuadratureRule
Definition discretization/pq3/fvgridgeometry.hh:203
Extrusion_t< PQ3DefaultGridGeometryTraits< GridView > > Extrusion
Definition discretization/pq3/fvgridgeometry.hh:191
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...
the sub control volume for the cvfe scheme
Base class for a sub control volume face.
Helper class constructing the dual grid finite volume geometries for the pq3 cvfe discretization meth...
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 > PQ3QuadratureTraits
Quadrature rule traits for PQ3 discretization.
Definition discretization/pq3/fvgridgeometry.hh:112
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
Dune::Std::detected_or_t< std::conditional_t< enablesHybridCVFE< T >, Dumux::HybridPQ3GeometryHelper< GV, typename T::SubControlVolume, typename T::SubControlVolumeFace >, void >, SpecifiesGeometryHelper, T > PQ3GeometryHelper_t
Definition discretization/pq3/fvgridgeometry.hh:62
typename T::GeometryHelper SpecifiesGeometryHelper
Definition basegridgeometry.hh:30
CVFE< CVFEMethods::PQ3 > PQ3
Definition method.hh:138
Definition adapt.hh:17
PQ2SubControlVolume< GV > PQ3SubControlVolume
Definition discretization/pq3/fvgridgeometry.hh:50
PQ2FVElementGeometry< GG, enableCache > PQ3FVElementGeometry
Definition discretization/pq3/fvgridgeometry.hh:57
PQ2SubControlVolumeFace< GV > PQ3SubControlVolumeFace
Definition discretization/pq3/fvgridgeometry.hh:53
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
Default traits for the pq3 finite volume grid geometry.
Definition discretization/pq3/fvgridgeometry.hh:123
static constexpr std::size_t maxNumElementDofs
Definition discretization/pq3/fvgridgeometry.hh:133
std::true_type EnableHybridCVFE
Definition discretization/pq3/fvgridgeometry.hh:130
PQ3SubControlVolumeFace< GridView > SubControlVolumeFace
Definition discretization/pq3/fvgridgeometry.hh:125
PQ3SubControlVolume< GridView > SubControlVolume
Definition discretization/pq3/fvgridgeometry.hh:124
PQ3FVElementGeometry< GridGeometry, enableCache > LocalView
Definition discretization/pq3/fvgridgeometry.hh:128
Mapper traits for PQ3: vertices get 1 DOF, edges get 2 DOFs, quad faces/elements get 4 DOFs,...
Definition discretization/pq3/fvgridgeometry.hh:81
Dune::MultipleCodimMultipleGeomTypeMapper< GV > DofMapper
Definition discretization/pq3/fvgridgeometry.hh:82
static Dune::MCMGLayout layout()
Definition discretization/pq3/fvgridgeometry.hh:84
Definition periodicgridtraits.hh:24
Definition periodicgridtraits.hh:23
Dune-based quadrature rule with specified order.
Definition quadraturerules.hh:66
Compute the volume of several common geometry types.