version 3.8
discretization/cellcentered/tpfa/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-FileCopyrightInfo: Copyright © DuMux Project contributors, see AUTHORS.md in root folder
5// SPDX-License-Identifier: GPL-3.0-or-later
6//
14#ifndef DUMUX_DISCRETIZATION_CCTPFA_FV_GRID_GEOMETRY_HH
15#define DUMUX_DISCRETIZATION_CCTPFA_FV_GRID_GEOMETRY_HH
16
17#include <utility>
18#include <algorithm>
19
22
31
32namespace Dumux {
33
40template<class GridView, class MapperTraits = DefaultMapperTraits<GridView>>
42: public MapperTraits
43{
46
47 template<class GridGeometry>
49
50 template<class GridGeometry, bool enableCache>
52
57 static constexpr int maxNumScvfNeighbors = int(GridView::dimension)<int(GridView::dimensionworld) ? 8 : 1<<(GridView::dimension-1);
58};
59
66template<class GridView,
67 bool enableGridGeometryCache = false,
70
77template<class GV, class Traits>
78class CCTpfaFVGridGeometry<GV, true, Traits>
79: public BaseGridGeometry<GV, Traits>
80{
83 using ConnectivityMap = typename Traits::template ConnectivityMap<ThisType>;
84 using GridIndexType = typename IndexTraits<GV>::GridIndex;
85 using Element = typename GV::template Codim<0>::Entity;
86
87 static const int dim = GV::dimension;
88 static const int dimWorld = GV::dimensionworld;
89
90public:
94 using LocalView = typename Traits::template LocalView<ThisType, true>;
96 using SubControlVolume = typename Traits::SubControlVolume;
98 using SubControlVolumeFace = typename Traits::SubControlVolumeFace;
102 using DofMapper = typename Traits::ElementMapper;
103
106 static constexpr DiscretizationMethod discMethod{};
107
109 static constexpr int maxElementStencilSize = LocalView::maxNumElementScvfs*Traits::maxNumScvfNeighbors + 1;
110
112 using GridView = GV;
113
115 CCTpfaFVGridGeometry(std::shared_ptr<BasicGridGeometry> gg)
116 : ParentType(std::move(gg))
117 {
118 // Check if the overlap size is what we expect
120 DUNE_THROW(Dune::InvalidStateException, "The cctpfa discretization method needs at least an overlap of 1 for parallel computations. "
121 << " Set the parameter \"Grid.Overlap\" in the input file.");
122
123 update_();
124 }
125
128 : CCTpfaFVGridGeometry(std::make_shared<BasicGridGeometry>(gridView))
129 {}
130
133 const DofMapper& dofMapper() const
134 { return this->elementMapper(); }
135
137 std::size_t numScv() const
138 {
139 return scvs_.size();
140 }
141
143 std::size_t numScvf() const
144 {
145 return scvfs_.size();
146 }
147
149 std::size_t numBoundaryScvf() const
150 {
151 return numBoundaryScvf_;
152 }
153
155 std::size_t numDofs() const
156 { return this->gridView().size(0); }
157
158
160 void update(const GridView& gridView)
161 {
162 ParentType::update(gridView);
163 update_();
164 }
165
167 void update(GridView&& gridView)
168 {
169 ParentType::update(std::move(gridView));
170 update_();
171 }
172
174 const SubControlVolume& scv(GridIndexType scvIdx) const
175 {
176 return scvs_[scvIdx];
177 }
178
180 const SubControlVolumeFace& scvf(GridIndexType scvfIdx) const
181 {
182 return scvfs_[scvfIdx];
183 }
184
187 const SubControlVolumeFace& flipScvf(GridIndexType scvfIdx, unsigned int outsideScvfIdx = 0) const
188 {
189 return scvfs_[flipScvfIndices_[scvfIdx][outsideScvfIdx]];
190 }
191
193 const std::vector<GridIndexType>& scvfIndicesOfScv(GridIndexType scvIdx) const
194 {
195 return scvfIndicesOfScv_[scvIdx];
196 }
197
202 const ConnectivityMap &connectivityMap() const
203 { return connectivityMap_; }
204
206 bool hasBoundaryScvf(GridIndexType eIdx) const
207 { return hasBoundaryScvf_[eIdx]; }
208
209private:
210
211 void update_()
212 {
213 // clear containers (necessary after grid refinement)
214 scvs_.clear();
215 scvfs_.clear();
216 scvfIndicesOfScv_.clear();
217 flipScvfIndices_.clear();
218
219 // determine size of containers
220 std::size_t numScvs = numDofs();
221 std::size_t numScvf = 0;
222 for (const auto& element : elements(this->gridView()))
223 numScvf += element.subEntities(1);
224
225 // reserve memory
226 scvs_.resize(numScvs);
227 scvfs_.reserve(numScvf);
228 scvfIndicesOfScv_.resize(numScvs);
229 hasBoundaryScvf_.assign(numScvs, false);
230
231 // Build the scvs and scv faces
232 GridIndexType scvfIdx = 0;
233 numBoundaryScvf_ = 0;
234 for (const auto& element : elements(this->gridView()))
235 {
236 const auto eIdx = this->elementMapper().index(element);
237 scvs_[eIdx] = SubControlVolume(element.geometry(), eIdx);
238
239 // the element-wise index sets for finite volume geometry
240 std::vector<GridIndexType> scvfsIndexSet;
241 scvfsIndexSet.reserve(element.subEntities(1));
242
243 // for network grids there might be multiple intersection with the same geometryInInside
244 // we identify those by the indexInInside for now (assumes conforming grids at branching facets)
245 using ScvfGridIndexStorage = typename SubControlVolumeFace::Traits::GridIndexStorage;
246 std::vector<ScvfGridIndexStorage> outsideIndices;
247 if (dim < dimWorld)
248 {
250 outsideIndices.resize(element.subEntities(1));
251 std::for_each(outsideIndices.begin(), outsideIndices.end(), [eIdx] (auto& nIndices) { nIndices.push_back(eIdx); });
252
253 // second, insert neighbors
254 for (const auto& intersection : intersections(this->gridView(), element))
255 {
256 if (intersection.neighbor())
257 {
258 const auto nIdx = this->elementMapper().index( intersection.outside() );
259 outsideIndices[intersection.indexInInside()].push_back(nIdx);
260 }
261 }
262 }
263
264 for (const auto& intersection : intersections(this->gridView(), element))
265 {
266 // inner sub control volume faces (includes periodic boundaries)
267 if (intersection.neighbor())
268 {
269 // update the grid geometry if we have periodic boundaries
270 if (intersection.boundary())
271 this->setPeriodic();
272
273 if (dim == dimWorld)
274 {
275 const auto nIdx = this->elementMapper().index(intersection.outside());
276 scvfs_.emplace_back(intersection,
277 intersection.geometry(),
278 scvfIdx,
279 ScvfGridIndexStorage({eIdx, nIdx}),
280 false);
281 scvfsIndexSet.push_back(scvfIdx++);
282 }
283 // this is for network grids
284 // (will be optimized away of dim == dimWorld)
285 else
286 {
287 auto indexInInside = intersection.indexInInside();
288 // check if we already handled this facet
289 if (outsideIndices[indexInInside].empty())
290 continue;
291 else
292 {
293 scvfs_.emplace_back(intersection,
294 intersection.geometry(),
295 scvfIdx,
296 outsideIndices[indexInInside],
297 false);
298 scvfsIndexSet.push_back(scvfIdx++);
299 outsideIndices[indexInInside].clear();
300 }
301 }
302 }
303 // boundary sub control volume faces
304 else if (intersection.boundary())
305 {
306 scvfs_.emplace_back(intersection,
307 intersection.geometry(),
308 scvfIdx,
309 ScvfGridIndexStorage({eIdx, static_cast<GridIndexType>(this->gridView().size(0) + numBoundaryScvf_++)}),
310 true);
311 scvfsIndexSet.push_back(scvfIdx++);
312
313 hasBoundaryScvf_[eIdx] = true;
314 }
315 }
316
317 // Save the scvf indices belonging to this scv to build up fv element geometries fast
318 scvfIndicesOfScv_[eIdx] = scvfsIndexSet;
319 }
320
321 // Make the flip index set for network, surface, and periodic grids
322 if (dim < dimWorld || this->isPeriodic())
323 {
324 flipScvfIndices_.resize(scvfs_.size());
325 for (auto&& scvf : scvfs_)
326 {
327 if (scvf.boundary())
328 continue;
329
330 flipScvfIndices_[scvf.index()].resize(scvf.numOutsideScvs());
331 const auto insideScvIdx = scvf.insideScvIdx();
332 // check which outside scvf has the insideScvIdx index in its outsideScvIndices
333 for (unsigned int i = 0; i < scvf.numOutsideScvs(); ++i)
334 flipScvfIndices_[scvf.index()][i] = findFlippedScvfIndex_(insideScvIdx, scvf.outsideScvIdx(i));
335 }
336 }
337
338 // build the connectivity map for an efficient assembly
339 connectivityMap_.update(*this);
340 }
341
342 // find the scvf that has insideScvIdx in its outsideScvIdx list and outsideScvIdx as its insideScvIdx
343 GridIndexType findFlippedScvfIndex_(GridIndexType insideScvIdx, GridIndexType outsideScvIdx)
344 {
345 // go over all potential scvfs of the outside scv
346 for (auto outsideScvfIndex : scvfIndicesOfScv_[outsideScvIdx])
347 {
348 const auto& outsideScvf = this->scvf(outsideScvfIndex);
349 for (unsigned int j = 0; j < outsideScvf.numOutsideScvs(); ++j)
350 if (outsideScvf.outsideScvIdx(j) == insideScvIdx)
351 return outsideScvf.index();
352 }
353
354 DUNE_THROW(Dune::InvalidStateException, "No flipped version of this scvf found!");
355 }
356
358 ConnectivityMap connectivityMap_;
359
361 std::vector<SubControlVolume> scvs_;
362 std::vector<SubControlVolumeFace> scvfs_;
363 std::vector<std::vector<GridIndexType>> scvfIndicesOfScv_;
364 std::size_t numBoundaryScvf_;
365 std::vector<bool> hasBoundaryScvf_;
366
368 std::vector<std::vector<GridIndexType>> flipScvfIndices_;
369};
370
378template<class GV, class Traits>
379class CCTpfaFVGridGeometry<GV, false, Traits>
380: public BaseGridGeometry<GV, Traits>
381{
384 using ConnectivityMap = typename Traits::template ConnectivityMap<ThisType>;
385
386 using GridIndexType = typename IndexTraits<GV>::GridIndex;
387 using Element = typename GV::template Codim<0>::Entity;
388
389 static const int dim = GV::dimension;
390 static const int dimWorld = GV::dimensionworld;
391
392 using ScvfGridIndexStorage = typename Traits::SubControlVolumeFace::Traits::GridIndexStorage;
393 using NeighborVolVarIndices = typename std::conditional_t< (dim<dimWorld),
394 ScvfGridIndexStorage,
395 Dune::ReservedVector<GridIndexType, 1> >;
396
397public:
401 using LocalView = typename Traits::template LocalView<ThisType, false>;
403 using SubControlVolume = typename Traits::SubControlVolume;
405 using SubControlVolumeFace = typename Traits::SubControlVolumeFace;
409 using DofMapper = typename Traits::ElementMapper;
410
413 static constexpr DiscretizationMethod discMethod{};
414
416 static constexpr int maxElementStencilSize = LocalView::maxNumElementScvfs*Traits::maxNumScvfNeighbors + 1;
417
419 using GridView = GV;
420
422 CCTpfaFVGridGeometry(std::shared_ptr<BasicGridGeometry> gg)
423 : ParentType(std::move(gg))
424 {
425 // Check if the overlap size is what we expect
427 DUNE_THROW(Dune::InvalidStateException, "The cctpfa discretization method needs at least an overlap of 1 for parallel computations. "
428 << " Set the parameter \"Grid.Overlap\" in the input file.");
429
430 update_();
431 }
432
435 : CCTpfaFVGridGeometry(std::make_shared<BasicGridGeometry>(gridView))
436 {}
437
440 const DofMapper& dofMapper() const
441 { return this->elementMapper(); }
442
444 std::size_t numScv() const
445 {
446 return numScvs_;
447 }
448
450 std::size_t numScvf() const
451 {
452 return numScvf_;
453 }
454
456 std::size_t numBoundaryScvf() const
457 {
458 return numBoundaryScvf_;
459 }
460
462 std::size_t numDofs() const
463 { return this->gridView().size(0); }
464
466 void update(const GridView& gridView)
467 {
468 ParentType::update(gridView);
469 update_();
470 }
471
473 void update(GridView&& gridView)
474 {
475 ParentType::update(std::move(gridView));
476 update_();
477 }
478
479 const std::vector<GridIndexType>& scvfIndicesOfScv(GridIndexType scvIdx) const
480 { return scvfIndicesOfScv_[scvIdx]; }
481
483 const std::vector<NeighborVolVarIndices>& neighborVolVarIndices(GridIndexType scvIdx) const
484 { return neighborVolVarIndices_[scvIdx]; }
485
490 const ConnectivityMap &connectivityMap() const
491 { return connectivityMap_; }
492
493private:
494
495 void update_()
496 {
497 // clear local data
498 scvfIndicesOfScv_.clear();
499 neighborVolVarIndices_.clear();
500
501 // reserve memory or resize the containers
502 numScvs_ = numDofs();
503 numScvf_ = 0;
504 numBoundaryScvf_ = 0;
505 scvfIndicesOfScv_.resize(numScvs_);
506 neighborVolVarIndices_.resize(numScvs_);
507
508 // Build the SCV and SCV face
509 for (const auto& element : elements(this->gridView()))
510 {
511 const auto eIdx = this->elementMapper().index(element);
512
513 // the element-wise index sets for finite volume geometry
514 auto numLocalFaces = element.subEntities(1);
515 std::vector<GridIndexType> scvfsIndexSet;
516 std::vector<NeighborVolVarIndices> neighborVolVarIndexSet;
517 scvfsIndexSet.reserve(numLocalFaces);
518 neighborVolVarIndexSet.reserve(numLocalFaces);
519
520 // for network grids there might be multiple intersection with the same geometryInInside
521 // we identify those by the indexInInside for now (assumes conforming grids at branching facets)
522 std::vector<NeighborVolVarIndices> outsideIndices;
523 if (dim < dimWorld)
524 {
525 outsideIndices.resize(numLocalFaces);
526 for (const auto& intersection : intersections(this->gridView(), element))
527 {
528 if (intersection.neighbor())
529 {
530 const auto nIdx = this->elementMapper().index(intersection.outside());
531 outsideIndices[intersection.indexInInside()].push_back(nIdx);
532 }
533 }
534 }
535
536 for (const auto& intersection : intersections(this->gridView(), element))
537 {
538 // inner sub control volume faces (includes periodic boundaries)
539 if (intersection.neighbor())
540 {
541 // update the grid geometry if we have periodic boundaries
542 if (intersection.boundary())
543 this->setPeriodic();
544
545 if (dim == dimWorld)
546 {
547 scvfsIndexSet.push_back(numScvf_++);
548 const auto nIdx = this->elementMapper().index(intersection.outside());
549 neighborVolVarIndexSet.emplace_back(NeighborVolVarIndices({nIdx}));
550 }
551 // this is for network grids
552 // (will be optimized away of dim == dimWorld)
553 else
554 {
555 auto indexInInside = intersection.indexInInside();
556 // check if we already handled this facet
557 if (outsideIndices[indexInInside].empty())
558 continue;
559 else
560 {
561 scvfsIndexSet.push_back(numScvf_++);
562 neighborVolVarIndexSet.emplace_back(std::move(outsideIndices[indexInInside]));
563 outsideIndices[indexInInside].clear();
564 }
565 }
566 }
567 // boundary sub control volume faces
568 else if (intersection.boundary())
569 {
570 scvfsIndexSet.push_back(numScvf_++);
571 neighborVolVarIndexSet.emplace_back(NeighborVolVarIndices({static_cast<GridIndexType>(numScvs_ + numBoundaryScvf_++)}));
572 }
573 }
574
575 // store the sets of indices in the data container
576 scvfIndicesOfScv_[eIdx] = scvfsIndexSet;
577 neighborVolVarIndices_[eIdx] = neighborVolVarIndexSet;
578 }
579
580 // build the connectivity map for an efficient assembly
581 connectivityMap_.update(*this);
582 }
583
585 std::size_t numScvs_;
586 std::size_t numScvf_;
587 std::size_t numBoundaryScvf_;
588
590 ConnectivityMap connectivityMap_;
591
593 std::vector<std::vector<GridIndexType>> scvfIndicesOfScv_;
594 std::vector<std::vector<NeighborVolVarIndices>> neighborVolVarIndices_;
595};
596
597} // end namespace Dumux
598
599#endif
Base class for grid geometries.
Stores the face indices corresponding to the neighbors of an element that contribute to the derivativ...
Check the overlap size for different discretization methods.
Base class for all grid geometries.
Definition: basegridgeometry.hh:52
typename BaseImplementation::GridView GridView
export the grid view type
Definition: basegridgeometry.hh:60
A simple version of the connectivity map for cellcentered schemes. This implementation works for sche...
Definition: cellcentered/connectivitymap.hh:41
Sub control volumes for cell-centered discretization schemes.
Definition: discretization/cellcentered/subcontrolvolume.hh:47
Stencil-local finite volume geometry (scvs and scvfs) for cell-centered TPFA models This builds up th...
Definition: discretization/cellcentered/tpfa/fvelementgeometry.hh:53
The finite volume geometry (scvs and scvfs) for cell-centered TPFA models on a grid view This builds ...
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:381
typename Traits::template LocalView< ThisType, false > LocalView
export the type of the fv element geometry (the local view type)
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:401
const std::vector< GridIndexType > & scvfIndicesOfScv(GridIndexType scvIdx) const
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:479
typename Traits::ElementMapper DofMapper
export dof mapper type
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:409
const DofMapper & dofMapper() const
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:440
CCTpfaFVGridGeometry(std::shared_ptr< BasicGridGeometry > gg)
Constructor with basic grid geometry used to share state with another grid geometry on the same grid ...
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:422
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:405
void update(GridView &&gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:473
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:403
std::size_t numScvf() const
The total number of sub control volume faces.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:450
const ConnectivityMap & connectivityMap() const
Returns the connectivity map of which dofs have derivatives with respect to a given dof.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:490
BasicGridGeometry_t< GV, Traits > BasicGridGeometry
export basic grid geometry type for the alternative constructor
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:399
CCTpfaFVGridGeometry(const GridView &gridView)
Constructor from gridView.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:434
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:407
void update(const GridView &gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:466
std::size_t numDofs() const
The total number of degrees of freedom.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:462
std::size_t numBoundaryScvf() const
The total number of boundary sub control volume faces.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:456
const std::vector< NeighborVolVarIndices > & neighborVolVarIndices(GridIndexType scvIdx) const
Return the neighbor volVar indices for all scvfs in the scv with index scvIdx.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:483
std::size_t numScv() const
The total number of sub control volumes.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:444
The finite volume geometry (scvs and scvfs) for cell-centered TPFA models on a grid view This builds ...
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:80
typename Traits::template LocalView< ThisType, true > LocalView
export the type of the fv element geometry (the local view type)
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:94
const ConnectivityMap & connectivityMap() const
Returns the connectivity map of which dofs have derivatives with respect to a given dof.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:202
void update(const GridView &gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:160
std::size_t numScv() const
The total number of sub control volumes.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:137
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:100
BasicGridGeometry_t< GV, Traits > BasicGridGeometry
export basic grid geometry type for the alternative constructor
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:92
CCTpfaFVGridGeometry(const GridView &gridView)
Constructor from gridView.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:127
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:96
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:98
std::size_t numDofs() const
The total number of degrees of freedom.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:155
const std::vector< GridIndexType > & scvfIndicesOfScv(GridIndexType scvIdx) const
Get the sub control volume face indices of an scv by global index.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:193
std::size_t numScvf() const
The total number of sub control volume faces.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:143
const SubControlVolumeFace & scvf(GridIndexType scvfIdx) const
Get a sub control volume face with a global scvf index.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:180
void update(GridView &&gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:167
bool hasBoundaryScvf(GridIndexType eIdx) const
Returns whether one of the geometry's scvfs lies on a boundary.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:206
std::size_t numBoundaryScvf() const
The total number of boundary sub control volume faces.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:149
const SubControlVolumeFace & flipScvf(GridIndexType scvfIdx, unsigned int outsideScvfIdx=0) const
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:187
typename Traits::ElementMapper DofMapper
export dof mapper type
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:102
const SubControlVolume & scv(GridIndexType scvIdx) const
Get a sub control volume with a global scv index.
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:174
CCTpfaFVGridGeometry(std::shared_ptr< BasicGridGeometry > gg)
Constructor with basic grid geometry used to share state with another grid geometry on the same grid ...
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:115
const DofMapper & dofMapper() const
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:133
The finite volume geometry (scvs and scvfs) for cell-centered TPFA models on a grid view This builds ...
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:69
The sub control volume face.
Definition: discretization/cellcentered/tpfa/subcontrolvolumeface.hh:78
Defines the default element and vertex mapper types.
Sub control volumes for cell-centered discretization schemes.
Stencil-local finite volume geometry (scvs and scvfs) for cell-centered TPFA models This builds up th...
The 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
Defines the index types used for grid and local indices.
The available discretization methods in Dumux.
Definition: adapt.hh:17
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:166
The default traits for the tpfa finite volume grid geometry Defines the scv and scvf types and the ma...
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:43
static constexpr int maxNumScvfNeighbors
Definition: discretization/cellcentered/tpfa/fvgridgeometry.hh:57
Check if the overlap size is valid for a given discretization method.
Definition: checkoverlapsize.hh:28
Definition: method.hh:25
Structure to define the index types used for grid and local indices.
Definition: indextraits.hh:26