17#ifndef DUMUX_POROUSMEDIUMFLOW_BOXDFM_GRID_FVGEOMETRY_HH
18#define DUMUX_POROUSMEDIUMFLOW_BOXDFM_GRID_FVGEOMETRY_HH
21#include <unordered_map>
23#include <dune/localfunctions/lagrange/lagrangelfecache.hh>
24#include <dune/geometry/multilineargeometry.hh>
25#include <dune/grid/common/mcmgmapper.hh>
41template<
class GV,
class T>
57template<
class Gr
idView,
class MapperTraits = DefaultMapperTraits<Gr
idView>>
64 template<
class Gr
idGeometry,
bool enableCache>
68 using FacetMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
81 bool enableGridGeometryCache =
false,
95template<
class Scalar,
class GV,
class Traits>
101 using GridIndexType =
typename GV::IndexSet::IndexType;
103 using Element =
typename GV::template Codim<0>::Entity;
104 using CoordScalar =
typename GV::ctype;
105 static const int dim = GV::dimension;
106 static const int dimWorld = GV::dimensionworld;
107 static_assert(dim == 2 || dim == 3,
"The box-dfm GridGeometry is only implemented in 2 or 3 dimensions.");
125 using FeCache = Dune::LagrangeLocalFiniteElementCache<CoordScalar, Scalar, dim, 1>;
132 template<
class FractureGr
idAdapter >
136 update_(fractureGridAdapter);
142 {
return this->vertexMapper(); }
155 {
return numBoundaryScvf_; }
159 {
return this->gridView().size(dim); }
162 template<
class FractureGr
idAdapter >
163 void update(
const GridView& gridView,
const FractureGridAdapter& fractureGridAdapter)
165 ParentType::update(gridView);
166 update_(fractureGridAdapter);
170 template<
class FractureGr
idAdapter >
173 ParentType::update(std::move(gridView));
174 update_(fractureGridAdapter);
180 const std::vector<SubControlVolume>&
scvs(GridIndexType eIdx)
const {
return scvs_[eIdx]; }
182 const std::vector<SubControlVolumeFace>&
scvfs(GridIndexType eIdx)
const {
return scvfs_[eIdx]; }
184 bool dofOnBoundary(
unsigned int dofIdx)
const {
return boundaryDofIndices_[dofIdx]; }
186 bool dofOnFracture(
unsigned int dofIdx)
const {
return fractureDofIndices_[dofIdx]; }
192 { DUNE_THROW(Dune::InvalidStateException,
"Periodic boundaries are not supported by the box-dfm scheme"); }
195 [[deprecated(
"Will be removed after release 3.9. Implement periodicDofMap() if periodic bcs are supported.")]]
197 {
return std::unordered_map<std::size_t, std::size_t>(); }
201 template<
class FractureGr
idAdapter >
202 void update_(
const FractureGridAdapter& fractureGridAdapter)
207 auto numElements = this->gridView().size(0);
208 scvs_.resize(numElements);
209 scvfs_.resize(numElements);
211 boundaryDofIndices_.assign(numDofs(),
false);
212 fractureDofIndices_.assign(this->gridView.size(dim),
false);
216 numBoundaryScvf_ = 0;
218 for (
const auto& element : elements(this->gridView()))
221 auto eIdx = this->elementMapper().index(element);
224 numScv_ += element.subEntities(dim);
225 numScvf_ += element.subEntities(dim-1);
228 auto elementGeometry = element.geometry();
229 const auto refElement = referenceElement(elementGeometry);
232 GeometryHelper geometryHelper(elementGeometry);
235 scvs_[eIdx].resize(elementGeometry.corners());
236 using LocalIndexType =
typename SubControlVolumeFace::Traits::LocalIndexType;
237 for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < elementGeometry.corners(); ++scvLocalIdx)
239 const auto dofIdxGlobal = this->vertexMapper().subIndex(element, scvLocalIdx, dim);
241 scvs_[eIdx][scvLocalIdx] = SubControlVolume(geometryHelper,
248 LocalIndexType scvfLocalIdx = 0;
249 scvfs_[eIdx].resize(element.subEntities(dim-1));
250 for (; scvfLocalIdx < element.subEntities(dim-1); ++scvfLocalIdx)
253 std::vector<LocalIndexType> localScvIndices({
static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 0, dim)),
254 static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 1, dim))});
256 scvfs_[eIdx][scvfLocalIdx] = SubControlVolumeFace(geometryHelper,
260 std::move(localScvIndices));
274 LocalIndexType scvLocalIdx =
element.subEntities(dim);
275 for (
const auto& intersection : intersections(this->gridView(), element))
278 const auto& isGeometry = intersection.geometry();
280 const auto idxInInside = intersection.indexInInside();
282 std::vector<GridIndexType> isVertexIndices(
numCorners);
283 for (
unsigned int vIdxLocal = 0; vIdxLocal <
numCorners; ++vIdxLocal)
284 isVertexIndices[vIdxLocal] = this->vertexMapper().subIndex(element,
285 refElement.subEntity(idxInInside, 1, vIdxLocal, dim),
288 if (intersection.boundary() && !intersection.neighbor())
290 numScvf_ += isGeometry.corners();
291 numBoundaryScvf_ += isGeometry.corners();
293 for (
unsigned int isScvfLocalIdx = 0; isScvfLocalIdx <
numCorners; ++isScvfLocalIdx)
296 const LocalIndexType insideScvIdx =
static_cast<LocalIndexType
>(refElement.subEntity(idxInInside, 1, isScvfLocalIdx, dim));
297 std::vector<LocalIndexType> localScvIndices = {insideScvIdx, insideScvIdx};
298 scvfs_[eIdx].emplace_back(geometryHelper,
303 std::move(localScvIndices));
308 const auto numFaceVerts = refElement.size(idxInInside, 1, dim);
309 for (
int localVIdx = 0; localVIdx < numFaceVerts; ++localVIdx)
311 const auto vIdx = refElement.subEntity(idxInInside, 1, localVIdx, dim);
312 const auto vIdxGlobal = this->vertexMapper().subIndex(element, vIdx, dim);
313 boundaryDofIndices_[vIdxGlobal] =
true;
317 else if (intersection.boundary() && intersection.neighbor())
318 DUNE_THROW(Dune::InvalidStateException,
"Periodic boundaries are not supported by the box-dfm scheme");
321 if (fractureGridAdapter.composeFacetElement(isVertexIndices))
323 for (
auto vIdx : isVertexIndices)
324 fractureDofIndices_[vIdx] =
true;
328 const auto curNumScvs = scvs_[eIdx].size();
330 for (
unsigned int vIdxLocal = 0; vIdxLocal <
numCorners; ++vIdxLocal)
331 scvs_[eIdx].emplace_back(geometryHelper,
335 static_cast<LocalIndexType
>(refElement.subEntity(idxInInside, 1, vIdxLocal, dim)),
339 isVertexIndices[vIdxLocal]);
344 const auto& faceRefElement = referenceElement(isGeometry);
345 for (
unsigned int edgeIdx = 0; edgeIdx < faceRefElement.size(1); ++edgeIdx)
348 std::vector<LocalIndexType> localScvIndices({
static_cast<LocalIndexType
>(faceRefElement.subEntity(edgeIdx, 1, 0, dim-1)),
349 static_cast<LocalIndexType
>(faceRefElement.subEntity(edgeIdx, 1, 1, dim-1))});
352 std::for_each( localScvIndices.begin(),
353 localScvIndices.end(),
354 [curNumScvs] (
auto& elemLocalIdx) { elemLocalIdx += curNumScvs; } );
358 scvfs_[eIdx].emplace_back(geometryHelper,
363 std::move(localScvIndices),
364 intersection.boundary());
372 std::vector<LocalIndexType> localScvIndices({0, 1});
375 std::for_each( localScvIndices.begin(),
376 localScvIndices.end(),
377 [curNumScvs] (
auto& elemLocalIdx) { elemLocalIdx += curNumScvs; } );
381 scvfs_[eIdx].emplace_back(geometryHelper,
386 std::move(localScvIndices),
387 intersection.boundary());
394 const FeCache feCache_;
396 std::vector<std::vector<SubControlVolume>> scvs_;
397 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
401 std::size_t numScvf_;
402 std::size_t numBoundaryScvf_;
405 std::vector<bool> boundaryDofIndices_;
406 std::vector<bool> fractureDofIndices_;
416template<
class Scalar,
class GV,
class Traits>
422 using GridIndexType =
typename GV::IndexSet::IndexType;
424 static const int dim = GV::dimension;
425 static const int dimWorld = GV::dimensionworld;
427 using Element =
typename GV::template Codim<0>::Entity;
428 using Intersection =
typename GV::Intersection;
429 using CoordScalar =
typename GV::ctype;
447 using FeCache = Dune::LagrangeLocalFiniteElementCache<CoordScalar, Scalar, dim, 1>;
454 template<
class FractureGr
idAdapter >
457 , facetMapper_(gridView,
Dune::mcmgLayout(
Dune::template Codim<1>()))
459 update_(fractureGridAdapter);
465 {
return this->vertexMapper(); }
478 {
return numBoundaryScvf_; }
482 {
return this->gridView().size(dim); }
485 template<
class FractureGr
idAdapter >
486 void update(
const GridView& gridView,
const FractureGridAdapter& fractureGridAdapter)
488 ParentType::update(gridView);
489 updateFacetMapper_();
490 update_(fractureGridAdapter);
494 template<
class FractureGr
idAdapter >
497 ParentType::update(std::move(gridView));
498 updateFacetMapper_();
499 update_(fractureGridAdapter);
505 bool dofOnBoundary(
unsigned int dofIdx)
const {
return boundaryDofIndices_[dofIdx]; }
507 bool dofOnFracture(
unsigned int dofIdx)
const {
return fractureDofIndices_[dofIdx]; }
512 bool isOnFracture(
const Element& element,
const Intersection& intersection)
const
513 {
return facetOnFracture_[facetMapper_.subIndex(element, intersection.indexInInside(), 1)]; }
517 { DUNE_THROW(Dune::InvalidStateException,
"Periodic boundaries are not supported by the box-dfm scheme"); }
520 [[deprecated(
"Will be removed after release 3.9. Implement periodicDofMap() if periodic bcs are supported.")]]
522 {
return std::unordered_map<std::size_t, std::size_t>(); }
526 void updateFacetMapper_()
528 facetMapper_.update(this->gridView());
531 template<
class FractureGr
idAdapter >
532 void update_(
const FractureGridAdapter& fractureGridAdapter)
534 boundaryDofIndices_.assign(numDofs(),
false);
535 fractureDofIndices_.assign(numDofs(),
false);
536 facetOnFracture_.assign(this->gridView().size(1),
false);
542 numBoundaryScvf_ = 0;
543 for (
const auto& element : elements(this->gridView()))
545 numScv_ += element.subEntities(dim);
546 numScvf_ += element.subEntities(dim-1);
548 const auto elementGeometry = element.geometry();
549 const auto refElement = referenceElement(elementGeometry);
552 for (
const auto& intersection : intersections(this->gridView(), element))
555 const auto& isGeometry = intersection.geometry();
557 const auto idxInInside = intersection.indexInInside();
559 std::vector<GridIndexType> isVertexIndices(
numCorners);
560 for (
unsigned int vIdxLocal = 0; vIdxLocal <
numCorners; ++vIdxLocal)
561 isVertexIndices[vIdxLocal] = this->vertexMapper().subIndex(element,
562 refElement.subEntity(idxInInside, 1, vIdxLocal, dim),
565 if (intersection.boundary() && !intersection.neighbor())
572 const auto fIdx = intersection.indexInInside();
573 const auto numFaceVerts = refElement.size(fIdx, 1, dim);
574 for (
int localVIdx = 0; localVIdx < numFaceVerts; ++localVIdx)
576 const auto vIdx = refElement.subEntity(fIdx, 1, localVIdx, dim);
577 const auto vIdxGlobal = this->vertexMapper().subIndex(element, vIdx, dim);
578 boundaryDofIndices_[vIdxGlobal] =
true;
583 else if (intersection.boundary() && intersection.neighbor())
584 DUNE_THROW(Dune::InvalidStateException,
"Periodic boundaries are not supported by the box-dfm scheme");
587 if (fractureGridAdapter.composeFacetElement(isVertexIndices))
589 facetOnFracture_[facetMapper_.subIndex(element, idxInInside, 1)] =
true;
590 for (
auto vIdx : isVertexIndices)
591 fractureDofIndices_[vIdx] =
true;
593 const auto isGeometry = intersection.geometry();
594 numScv_ += isGeometry.corners();
595 numScvf_ += dim == 3 ? referenceElement(isGeometry).size(1) : 1;
601 const FeCache feCache_;
606 std::size_t numScvf_;
607 std::size_t numBoundaryScvf_;
610 std::vector<bool> boundaryDofIndices_;
611 std::vector<bool> fractureDofIndices_;
614 typename Traits::FacetMapper facetMapper_;
615 std::vector<bool> facetOnFracture_;
Base class for grid geometries.
Helper class constructing the dual grid finite volume geometries for the box discretizazion method.
Base class for all grid geometries.
Definition: basegridgeometry.hh:52
typename BaseImplementation::GridView GridView
export the grid view type
Definition: basegridgeometry.hh:60
Base class for the finite volume geometry vector for box discrete fracture model.
Definition: porousmediumflow/boxdfm/fvelementgeometry.hh:41
Base class for the finite volume geometry vector for box schemes This builds up the sub control volum...
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:419
Extrusion_t< Traits > Extrusion
Export the extrusion type.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:443
bool dofOnBoundary(unsigned int dofIdx) const
If a vertex / d.o.f. is on the boundary.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:505
bool dofOnPeriodicBoundary(std::size_t dofIdx) const
Periodic boundaries are not supported for the box-dfm scheme.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:509
BoxDfmFVGridGeometry(const GridView gridView, const FractureGridAdapter &fractureGridAdapter)
Constructor.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:455
std::size_t numScv() const
The total number of sub control volumes.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:468
bool isOnFracture(const Element &element, const Intersection &intersection) const
Returns true if an intersection coincides with a fracture element.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:512
std::unordered_map< std::size_t, std::size_t > periodicVertexMap() const
Returns the map between dofs across periodic boundaries.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:521
std::size_t numDofs() const
The total number of degrees of freedom.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:481
std::size_t numBoundaryScvf() const
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:477
void update(const GridView &gridView, const FractureGridAdapter &fractureGridAdapter)
update all fvElementGeometries (call this after grid adaption)
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:486
typename Traits::VertexMapper DofMapper
export dof mapper type
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:445
typename Traits::template LocalView< ThisType, false > LocalView
export the type of the fv element geometry (the local view type)
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:437
std::size_t numScvf() const
The total number of sun control volume faces.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:472
Dune::LagrangeLocalFiniteElementCache< CoordScalar, Scalar, dim, 1 > FeCache
export the finite element cache type
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:447
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:503
const DofMapper & dofMapper() const
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:464
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:441
Detail::BoxDfmGeometryHelper_t< GV, Traits > GeometryHelper
export the geometry helper type
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:451
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:439
bool dofOnFracture(unsigned int dofIdx) const
If a vertex / d.o.f. is on a fracture.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:507
void update(GridView &&gridView, const FractureGridAdapter &fractureGridAdapter)
update all fvElementGeometries (call this after grid adaption)
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:495
std::size_t periodicallyMappedDof(std::size_t dofIdx) const
The index of the vertex / d.o.f. on the other side of the periodic boundary.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:516
Base class for the finite volume geometry vector for box schemes that consider extra connectivity bet...
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:98
typename Traits::SubControlVolume SubControlVolume
Export the type of sub control volume.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:117
Dune::LagrangeLocalFiniteElementCache< CoordScalar, Scalar, dim, 1 > FeCache
Export the finite element cache type.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:125
std::unordered_map< std::size_t, std::size_t > periodicVertexMap() const
Returns the map between dofs across periodic boundaries.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:196
Detail::BoxDfmGeometryHelper_t< GV, Traits > GeometryHelper
export the geometry helper type
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:129
const std::vector< SubControlVolumeFace > & scvfs(GridIndexType eIdx) const
Get the local scvfs for an element.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:182
std::size_t numDofs() const
The total number of degrees of freedom.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:158
typename Traits::VertexMapper DofMapper
Export dof mapper type.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:123
BoxDfmFVGridGeometry(const GridView gridView, const FractureGridAdapter &fractureGridAdapter)
Constructor.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:133
void update(GridView &&gridView, const FractureGridAdapter &fractureGridAdapter)
update all fvElementGeometries (call this after grid adaption)
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:171
const std::vector< SubControlVolume > & scvs(GridIndexType eIdx) const
Get the local scvs for an element.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:180
Extrusion_t< Traits > Extrusion
Export the extrusion type.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:121
typename Traits::template LocalView< ThisType, true > LocalView
Export the type of the fv element geometry (the local view type)
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:115
const DofMapper & dofMapper() const
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:141
std::size_t numScvf() const
The total number of sun control volume faces.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:149
std::size_t numScv() const
The total number of sub control volumes.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:145
std::size_t periodicallyMappedDof(std::size_t dofIdx) const
The index of the vertex / d.o.f. on the other side of the periodic boundary.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:191
std::size_t numBoundaryScvf() const
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:154
bool dofOnBoundary(unsigned int dofIdx) const
If a vertex / d.o.f. is on the boundary.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:184
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:178
void update(const GridView &gridView, const FractureGridAdapter &fractureGridAdapter)
update all fvElementGeometries (call this after grid adaption)
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:163
typename Traits::SubControlVolumeFace SubControlVolumeFace
Export the type of sub control volume.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:119
bool dofOnPeriodicBoundary(std::size_t dofIdx) const
Periodic boundaries are not supported for the box-dfm scheme.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:188
bool dofOnFracture(unsigned int dofIdx) const
If a vertex / d.o.f. is on a fracture.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:186
Base class for the finite volume geometry vector for box schemes.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:83
Create sub control volumes and sub control volume face geometries.
Definition: porousmediumflow/boxdfm/geometryhelper.hh:47
Class for a sub control volume face in the box discrete fracture method, i.e a part of the boundary o...
Definition: porousmediumflow/boxdfm/subcontrolvolumeface.hh:65
the sub control volume for the box discrete fracture scheme
Definition: porousmediumflow/boxdfm/subcontrolvolume.hh:64
Defines the default element and vertex mapper types.
Helper classes to compute the integration elements.
The available discretization methods in Dumux.
Dune::Std::detected_or_t< Dumux::BoxDfmGeometryHelper< GV, GV::dimension, typename T::SubControlVolume, typename T::SubControlVolumeFace >, SpecifiesGeometryHelper, T > BoxDfmGeometryHelper_t
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:46
typename T::GeometryHelper SpecifiesGeometryHelper
Definition: basegridgeometry.hh:30
CVFE< CVFEMethods::PQ1 > Box
Definition: method.hh:94
std::size_t numCorners(Shape shape)
Returns the number of corners of a given geometry.
Definition: throatproperties.hh:220
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:166
Definition: common/pdesolver.hh:24
Base class for the local finite volume geometry for the box discrete fracture model.
Helper class constructing the dual grid finite volume geometries for the box discrete fracture model.
the sub control volume for the box discrete fracture scheme
The sub control volume face class for the box discrete fracture model.
The default traits for the box finite volume grid geometry.
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:60
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > FacetMapper
Definition: porousmediumflow/boxdfm/fvgridgeometry.hh:68