15#ifndef DUMUX_FACETCOUPLING_BOX_GRID_FVGEOMETRY_HH
16#define DUMUX_FACETCOUPLING_BOX_GRID_FVGEOMETRY_HH
21#include <dune/grid/common/mcmgmapper.hh>
22#include <dune/localfunctions/lagrange/lagrangelfecache.hh>
38template<
class GV,
class T>
53template<
class Gr
idView>
60 template<
class Gr
idGeometry,
bool enableCache>
64 using ElementMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
68 using FacetMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
80 bool enableGridGeometryCache =
false,
91template<
class Scalar,
class GV,
class Traits>
100 using Element =
typename GV::template Codim<0>::Entity;
101 using CoordScalar =
typename GV::ctype;
102 static const int dim = GV::dimension;
103 static const int dimWorld = GV::dimensionworld;
121 using FeCache = Dune::LagrangeLocalFiniteElementCache<CoordScalar, Scalar, dim, 1>;
128 template<
class FacetGr
idView,
class CodimOneGr
idAdapter>
130 const FacetGridView& facetGridView,
132 bool verbose =
false)
135 update_(facetGridView, codimOneGridAdapter, verbose);
140 {
return this->vertexMapper(); }
153 {
return numBoundaryScvf_; }
157 {
return this->vertexMapper().size(); }
172 template<
class FacetGr
idView,
class CodimOneGr
idAdapter>
174 const FacetGridView& facetGridView,
176 bool verbose =
false)
178 ParentType::update(gridView);
179 update_(facetGridView, codimOneGridAdapter, verbose);
183 template<
class FacetGr
idView,
class CodimOneGr
idAdapter>
185 const FacetGridView& facetGridView,
187 bool verbose =
false)
189 ParentType::update(std::move(gridView));
190 update_(facetGridView, codimOneGridAdapter, verbose);
198 const std::vector<SubControlVolume>&
scvs(GridIndexType eIdx)
const
199 {
return scvs_[eIdx]; }
202 const std::vector<SubControlVolumeFace>&
scvfs(GridIndexType eIdx)
const
203 {
return scvfs_[eIdx]; }
207 {
return boundaryDofIndices_[dofIdx]; }
211 {
return interiorBoundaryDofIndices_[dofIdx]; }
219 { DUNE_THROW(Dune::InvalidStateException,
"Periodic boundaries are not supported by the box facet coupling scheme"); }
223 {
return std::unordered_map<GridIndexType, GridIndexType>(); }
227 template<
class FacetGr
idView,
class CodimOneGr
idAdapter>
228 void update_(
const FacetGridView& facetGridView,
230 bool verbose =
false)
233 this->vertexMapper().enrich(facetGridView, codimOneGridAdapter, verbose);
236 const auto numDof = numDofs();
237 const auto numElements = this->gridView().size(0);
240 scvs_.resize(numElements);
241 scvfs_.resize(numElements);
242 boundaryDofIndices_.assign(numDof,
false);
243 interiorBoundaryDofIndices_.assign(numDof,
false);
248 numBoundaryScvf_ = 0;
249 for (
const auto& element : elements(this->gridView()))
251 auto eIdx = this->elementMapper().index(element);
254 numScv_ += element.subEntities(dim);
255 numScvf_ += element.subEntities(dim-1);
258 auto elementGeometry = element.geometry();
259 const auto refElement = referenceElement(elementGeometry);
262 GeometryHelper geometryHelper(elementGeometry);
266 scvs_[eIdx].reserve(elementGeometry.corners());
267 for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < elementGeometry.corners(); ++scvLocalIdx)
268 scvs_[eIdx].emplace_back(geometryHelper.getScvCorners(scvLocalIdx),
271 this->vertexMapper().subIndex(element, scvLocalIdx, dim));
274 LocalIndexType scvfLocalIdx = 0;
275 scvfs_[eIdx].clear();
276 scvfs_[eIdx].reserve(element.subEntities(dim-1));
277 for (; scvfLocalIdx < element.subEntities(dim-1); ++scvfLocalIdx)
280 std::vector<LocalIndexType> localScvIndices({
static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 0, dim)),
281 static_cast<LocalIndexType
>(refElement.subEntity(scvfLocalIdx, dim-1, 1, dim))});
284 scvfs_[eIdx].emplace_back(geometryHelper,
288 std::move(localScvIndices));
293 std::vector<unsigned int> handledFacets;
294 for (
const auto& intersection : intersections(this->gridView(),
element))
296 if (std::count(handledFacets.begin(), handledFacets.end(), intersection.indexInInside()))
299 handledFacets.push_back(intersection.indexInInside());
302 const auto isGeometry = intersection.geometry();
303 const auto numFaceCorners = isGeometry.corners();
304 const auto idxInInside = intersection.indexInInside();
305 const auto boundary = intersection.boundary();
307 std::vector<LocalIndexType> vIndicesLocal(numFaceCorners);
308 for (
int i = 0; i < numFaceCorners; ++i)
309 vIndicesLocal[i] =
static_cast<LocalIndexType
>(refElement.subEntity(idxInInside, 1, i, dim));
311 std::vector<LocalIndexType> gridVertexIndices(numFaceCorners);
312 for (
int i = 0; i < numFaceCorners; ++i)
313 gridVertexIndices[i] = this->vertexMapper().vertexIndex(element, vIndicesLocal[i], dim);
319 if (boundary && intersection.neighbor())
320 DUNE_THROW(Dune::InvalidStateException,
"Periodic boundaries are not supported by the box facet coupling scheme");
323 if (isOnFacet || boundary)
326 numScvf_ += numFaceCorners;
327 numBoundaryScvf_ += int(boundary)*numFaceCorners;
329 for (
unsigned int isScvfLocalIdx = 0; isScvfLocalIdx < numFaceCorners; ++isScvfLocalIdx)
332 std::vector<LocalIndexType> localScvIndices = {vIndicesLocal[isScvfLocalIdx], vIndicesLocal[isScvfLocalIdx]};
335 scvfs_[eIdx].emplace_back(geometryHelper,
340 std::move(localScvIndices),
345 const auto dofIndex = this->vertexMapper().subIndex(element, vIndicesLocal[isScvfLocalIdx], dim);
346 if (boundary) boundaryDofIndices_[ dofIndex ] = boundary;
347 if (isOnFacet) interiorBoundaryDofIndices_[ dofIndex ] = isOnFacet;
357 const FeCache feCache_;
359 std::vector<std::vector<SubControlVolume>> scvs_;
360 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
364 std::size_t numScvf_;
365 std::size_t numBoundaryScvf_;
368 std::vector<bool> boundaryDofIndices_;
369 std::vector<bool> interiorBoundaryDofIndices_;
379template<
class Scalar,
class GV,
class Traits>
388 static const int dim = GV::dimension;
389 static const int dimWorld = GV::dimensionworld;
391 using Element =
typename GV::template Codim<0>::Entity;
392 using Intersection =
typename GV::Intersection;
393 using CoordScalar =
typename GV::ctype;
411 using FeCache = Dune::LagrangeLocalFiniteElementCache<CoordScalar, Scalar, dim, 1>;
418 template<
class FacetGr
idView,
class CodimOneGr
idAdapter>
420 const FacetGridView& facetGridView,
422 bool verbose =
false)
424 , facetMapper_(gridView,
Dune::mcmgLayout(
Dune::template Codim<1>()))
426 update_(facetGridView, codimOneGridAdapter, verbose);
432 {
return this->vertexMapper(); }
445 {
return numBoundaryScvf_; }
449 {
return this->vertexMapper().size(); }
464 template<
class FacetGr
idView,
class CodimOneGr
idAdapter>
466 const FacetGridView& facetGridView,
468 bool verbose =
false)
470 ParentType::update(gridView);
471 updateFacetMapper_();
472 update_(facetGridView, codimOneGridAdapter, verbose);
476 template<
class FacetGr
idView,
class CodimOneGr
idAdapter>
478 const FacetGridView& facetGridView,
480 bool verbose =
false)
482 ParentType::update(std::move(gridView));
483 updateFacetMapper_();
484 update_(facetGridView, codimOneGridAdapter, verbose);
493 {
return boundaryDofIndices_[dofIdx]; }
497 {
return interiorBoundaryDofIndices_[dofIdx]; }
501 {
return facetIsOnInteriorBoundary_[ facetMapper_.subIndex(element, intersection.indexInInside(), 1) ]; }
509 { DUNE_THROW(Dune::InvalidStateException,
"Periodic boundaries are not supported by the facet coupling scheme"); }
513 {
return std::unordered_map<GridIndexType, GridIndexType>(); }
517 void updateFacetMapper_()
519 facetMapper_.update(this->gridView());
522 template<
class FacetGr
idView,
class CodimOneGr
idAdapter>
523 void update_(
const FacetGridView& facetGridView,
524 const CodimOneGridAdapter& codimOneGridAdapter,
528 this->vertexMapper().enrich(facetGridView, codimOneGridAdapter, verbose);
534 numBoundaryScvf_ = 0;
536 const auto numDof = numDofs();
537 boundaryDofIndices_.assign(numDof,
false);
538 interiorBoundaryDofIndices_.assign(numDof,
false);
539 facetIsOnInteriorBoundary_.assign(this->gridView().size(1),
false);
540 for (
const auto& element : elements(this->gridView()))
542 numScv_ += element.subEntities(dim);
543 numScvf_ += element.subEntities(dim-1);
545 const auto elementGeometry = element.geometry();
546 const auto refElement = referenceElement(elementGeometry);
550 std::vector<unsigned int> handledFacets;
551 for (
const auto& intersection : intersections(this->gridView(), element))
553 if (std::count(handledFacets.begin(), handledFacets.end(), intersection.indexInInside()))
556 handledFacets.push_back(intersection.indexInInside());
559 const auto isGeometry = intersection.geometry();
560 const auto numFaceCorners = isGeometry.corners();
561 const auto idxInInside = intersection.indexInInside();
562 const auto boundary = intersection.boundary();
564 std::vector<LocalIndexType> vIndicesLocal(numFaceCorners);
565 for (
int i = 0; i < numFaceCorners; ++i)
566 vIndicesLocal[i] =
static_cast<LocalIndexType
>(refElement.subEntity(idxInInside, 1, i, dim));
568 std::vector<GridIndexType> gridVertexIndices(numFaceCorners);
569 for (
int i = 0; i < numFaceCorners; ++i)
570 gridVertexIndices[i] = this->vertexMapper().vertexIndex(element, vIndicesLocal[i], dim);
573 const bool isOnFacet = codimOneGridAdapter.composeFacetElement(gridVertexIndices);
576 if (boundary && intersection.neighbor())
577 DUNE_THROW(Dune::InvalidStateException,
"Periodic boundaries are not supported by the box facet coupling scheme");
579 if (isOnFacet || boundary)
581 numScvf_ += numFaceCorners;
582 numBoundaryScvf_ += int(boundary)*numFaceCorners;
585 for (
int i = 0; i < numFaceCorners; ++i)
587 const auto dofIndex = this->vertexMapper().subIndex(element, vIndicesLocal[i], dim);
588 if (boundary) boundaryDofIndices_[ dofIndex ] =
true;
591 interiorBoundaryDofIndices_[ dofIndex ] =
true;
592 facetIsOnInteriorBoundary_[ facetMapper_.subIndex(element, idxInInside, 1) ] =
true;
600 const FeCache feCache_;
605 std::size_t numScvf_;
606 std::size_t numBoundaryScvf_;
609 std::vector<bool> boundaryDofIndices_;
610 std::vector<bool> interiorBoundaryDofIndices_;
613 typename Traits::FacetMapper facetMapper_;
614 std::vector<bool> facetIsOnInteriorBoundary_;
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 element-local finite volume geometry for box models in the context of models consi...
Definition: multidomain/facet/box/fvelementgeometry.hh:36
Base class for the finite volume geometry vector for box schemes This builds up the sub control volum...
Definition: multidomain/facet/box/fvgridgeometry.hh:382
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition: multidomain/facet/box/fvgridgeometry.hh:403
BoxFacetCouplingFVGridGeometry(const GridView &gridView, const FacetGridView &facetGridView, const CodimOneGridAdapter &codimOneGridAdapter, bool verbose=false)
Constructor.
Definition: multidomain/facet/box/fvgridgeometry.hh:419
std::size_t numScv() const
The total number of sub control volumes.
Definition: multidomain/facet/box/fvgridgeometry.hh:435
std::size_t numScvf() const
The total number of sun control volume faces.
Definition: multidomain/facet/box/fvgridgeometry.hh:439
std::size_t numDofs() const
The total number of degrees of freedom.
Definition: multidomain/facet/box/fvgridgeometry.hh:448
std::unordered_map< GridIndexType, GridIndexType > periodicVertexMap() const
Returns the map between dofs across periodic boundaries.
Definition: multidomain/facet/box/fvgridgeometry.hh:512
void update(GridView &&gridView, const FacetGridView &facetGridView, const CodimOneGridAdapter &codimOneGridAdapter, bool verbose=false)
update all fvElementGeometries (call this after grid adaption)
Definition: multidomain/facet/box/fvgridgeometry.hh:477
std::size_t numBoundaryScvf() const
Definition: multidomain/facet/box/fvgridgeometry.hh:444
Dune::LagrangeLocalFiniteElementCache< CoordScalar, Scalar, dim, 1 > FeCache
export the finite element cache type
Definition: multidomain/facet/box/fvgridgeometry.hh:411
Detail::BoxFacetCouplingGeometryHelper_t< GV, Traits > GeometryHelper
export the geometry helper type
Definition: multidomain/facet/box/fvgridgeometry.hh:415
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition: multidomain/facet/box/fvgridgeometry.hh:488
typename Traits::VertexMapper DofMapper
export dof mapper type
Definition: multidomain/facet/box/fvgridgeometry.hh:409
const DofMapper & dofMapper() const
Definition: multidomain/facet/box/fvgridgeometry.hh:431
typename Traits::template LocalView< ThisType, false > LocalView
export the type of the fv element geometry (the local view type)
Definition: multidomain/facet/box/fvgridgeometry.hh:401
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the vertex / d.o.f. on the other side of the periodic boundary.
Definition: multidomain/facet/box/fvgridgeometry.hh:508
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
Periodic boundaries are not supported for the box facet coupling scheme.
Definition: multidomain/facet/box/fvgridgeometry.hh:504
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition: multidomain/facet/box/fvgridgeometry.hh:405
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition: multidomain/facet/box/fvgridgeometry.hh:407
bool dofOnBoundary(unsigned int dofIdx) const
If a d.o.f. is on the boundary.
Definition: multidomain/facet/box/fvgridgeometry.hh:492
void update(const GridView &gridView, const FacetGridView &facetGridView, const CodimOneGridAdapter &codimOneGridAdapter, bool verbose=false)
update all fvElementGeometries (call this after grid adaption)
Definition: multidomain/facet/box/fvgridgeometry.hh:465
bool dofOnInteriorBoundary(unsigned int dofIdx) const
If a d.o.f. is on an interior boundary.
Definition: multidomain/facet/box/fvgridgeometry.hh:496
bool isOnInteriorBoundary(const Element &element, const Intersection &intersection) const
returns true if an intersection is on an interior boundary
Definition: multidomain/facet/box/fvgridgeometry.hh:500
Base class for the finite volume geometry vector for box schemes in the context of coupled models whe...
Definition: multidomain/facet/box/fvgridgeometry.hh:94
bool dofOnInteriorBoundary(GridIndexType dofIdx) const
If a d.o.f. is on an interior boundary.
Definition: multidomain/facet/box/fvgridgeometry.hh:210
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the vertex / d.o.f. on the other side of the periodic boundary.
Definition: multidomain/facet/box/fvgridgeometry.hh:218
void update(const GridView &gridView, const FacetGridView &facetGridView, const CodimOneGridAdapter &codimOneGridAdapter, bool verbose=false)
update all fvElementGeometries (call this after grid adaption)
Definition: multidomain/facet/box/fvgridgeometry.hh:173
Dune::LagrangeLocalFiniteElementCache< CoordScalar, Scalar, dim, 1 > FeCache
export the finite element cache type
Definition: multidomain/facet/box/fvgridgeometry.hh:121
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition: multidomain/facet/box/fvgridgeometry.hh:117
const std::vector< SubControlVolume > & scvs(GridIndexType eIdx) const
Get the local scvs for an element.
Definition: multidomain/facet/box/fvgridgeometry.hh:198
std::size_t numScv() const
The total number of sub control volumes.
Definition: multidomain/facet/box/fvgridgeometry.hh:143
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
Periodic boundaries are not supported for the box facet coupling scheme.
Definition: multidomain/facet/box/fvgridgeometry.hh:214
bool dofOnBoundary(GridIndexType dofIdx) const
If a d.o.f. is on the boundary.
Definition: multidomain/facet/box/fvgridgeometry.hh:206
typename Traits::VertexMapper DofMapper
export dof mapper type
Definition: multidomain/facet/box/fvgridgeometry.hh:119
std::size_t numBoundaryScvf() const
Definition: multidomain/facet/box/fvgridgeometry.hh:152
const DofMapper & dofMapper() const
the vertex mapper is the dofMapper
Definition: multidomain/facet/box/fvgridgeometry.hh:139
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition: multidomain/facet/box/fvgridgeometry.hh:113
std::size_t numScvf() const
The total number of sun control volume faces.
Definition: multidomain/facet/box/fvgridgeometry.hh:147
void update(GridView &&gridView, const FacetGridView &facetGridView, const CodimOneGridAdapter &codimOneGridAdapter, bool verbose=false)
update all fvElementGeometries (call this after grid adaption)
Definition: multidomain/facet/box/fvgridgeometry.hh:184
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition: multidomain/facet/box/fvgridgeometry.hh:194
std::size_t numDofs() const
The total number of degrees of freedom.
Definition: multidomain/facet/box/fvgridgeometry.hh:156
BoxFacetCouplingFVGridGeometry(const GridView &gridView, const FacetGridView &facetGridView, const CodimOneGridAdapter &codimOneGridAdapter, bool verbose=false)
Constructor.
Definition: multidomain/facet/box/fvgridgeometry.hh:129
typename Traits::template LocalView< ThisType, true > LocalView
export the type of the fv element geometry (the local view type)
Definition: multidomain/facet/box/fvgridgeometry.hh:111
std::unordered_map< GridIndexType, GridIndexType > periodicVertexMap() const
Returns the map between dofs across periodic boundaries.
Definition: multidomain/facet/box/fvgridgeometry.hh:222
const std::vector< SubControlVolumeFace > & scvfs(GridIndexType eIdx) const
Get the local scvfs for an element.
Definition: multidomain/facet/box/fvgridgeometry.hh:202
Detail::BoxFacetCouplingGeometryHelper_t< GV, Traits > GeometryHelper
export the geometry helper type
Definition: multidomain/facet/box/fvgridgeometry.hh:125
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition: multidomain/facet/box/fvgridgeometry.hh:115
Base class for the finite volume geometry vector for box schemes in the context of coupled models whe...
Definition: multidomain/facet/box/fvgridgeometry.hh:82
Class for a sub control volume face in the box method, i.e a part of the boundary of a sub control vo...
Definition: multidomain/facet/box/subcontrolvolumeface.hh:41
Create sub control volumes and sub control volume face geometries.
Definition: boxgeometryhelper.hh:257
the sub control volume for the box scheme
Definition: discretization/box/subcontrolvolume.hh:60
Adapter that allows retrieving information on a d-dimensional grid for entities of a (d-1)-dimensiona...
Definition: codimonegridadapter.hh:40
bool composeFacetElement(const IndexStorage &bulkVertexIndices) const
Returns true if a given set of bulk vertex indices make up a facet grid element.
Definition: codimonegridadapter.hh:180
A vertex mapper that allows for enrichment of nodes. Indication on where to enrich the nodes is done ...
Definition: vertexmapper.hh:130
the sub control volume for the box scheme
Helper classes to compute the integration elements.
The available discretization methods in Dumux.
Base class for a sub control volume face of the box method in the context of of models considering co...
Dune::Std::detected_or_t< Dumux::BoxGeometryHelper< GV, GV::dimension, typename T::SubControlVolume, typename T::SubControlVolumeFace >, SpecifiesGeometryHelper, T > BoxFacetCouplingGeometryHelper_t
Definition: multidomain/facet/box/fvgridgeometry.hh:43
typename T::GeometryHelper SpecifiesGeometryHelper
Definition: basegridgeometry.hh:30
CVFE< CVFEMethods::PQ1 > Box
Definition: method.hh:94
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:166
Definition: common/pdesolver.hh:24
The default traits for the finite volume grid geometry of the box scheme with coupling occurring acro...
Definition: multidomain/facet/box/fvgridgeometry.hh:55
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > FacetMapper
Definition: multidomain/facet/box/fvgridgeometry.hh:68
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > ElementMapper
Definition: multidomain/facet/box/fvgridgeometry.hh:64
Structure to define the index types used for grid and local indices.
Definition: indextraits.hh:26