12#ifndef DUMUX_DISCRETIZATION_FACECENTERED_DIAMOND_FV_GRID_GEOMETRY
13#define DUMUX_DISCRETIZATION_FACECENTERED_DIAMOND_FV_GRID_GEOMETRY
16#include <unordered_map>
18#include <dune/grid/common/mcmgmapper.hh>
19#include <dune/geometry/type.hh>
43template<
class GV,
class T>
55template<
class Gr
idView,
class ScvRule = Dumux::QuadratureRules::M
idpo
intQuadrature,
class ScvfRule = Dumux::QuadratureRules::M
idpo
intQuadrature>
64template<
class Gr
idView,
class QuadratureTraits = FaceCenteredDiamondQuadratureTraits<Gr
idView>>
69 using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
71 template<
class Gr
idGeometry,
bool enableCache>
80 bool enableCaching =
true,
89 using Element =
typename GV::template Codim<0>::Entity;
91 using Scalar =
typename GV::ctype;
93 static const int dim = GV::dimension;
94 static const int dimWorld = GV::dimensionworld;
96 static_assert(dim > 1,
"Only implemented for dim > 1");
134 , periodicGridTraits_(this->
gridView().grid())
149 {
return numBoundaryScvf_; }
153 {
return this->
gridView().size(1); }
175 {
return boundaryDofIndices_[dofIdx]; }
179 {
return dofMapper_; }
183 {
return periodicFaceMap_.count(dofIdx); }
187 {
return periodicFaceMap_.at(dofIdx); }
191 {
return periodicFaceMap_; }
195 {
return { gg.cache_ }; }
199 class FCDiamondGridGeometryCache
210 const FaceCenteredDiamondFVGridGeometry& gridGeometry()
const
211 {
return *gridGeometry_; }
214 const std::vector<SubControlVolume>& scvs(GridIndexType eIdx)
const
215 {
return scvs_[eIdx]; }
218 const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx)
const
219 {
return scvfs_[eIdx]; }
222 bool hasBoundaryScvf(GridIndexType eIdx)
const
223 {
return hasBoundaryScvf_[eIdx]; }
226 const auto& boundaryFaces(GridIndexType eIdx)
const
227 {
return boundaryFaces_[eIdx]; }
230 const auto& boundaryFaceScvfRanges(GridIndexType eIdx)
const
231 {
return boundaryFaceScvfRanges_[eIdx]; }
238 hasBoundaryScvf_.clear();
239 boundaryFaces_.clear();
240 boundaryFaceScvfRanges_.clear();
243 std::vector<std::vector<SubControlVolume>> scvs_;
244 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
245 std::vector<bool> hasBoundaryScvf_;
246 std::vector<Dune::ReservedVector<BoundaryFace, 2*dim>> boundaryFaces_;
247 std::vector<Dune::ReservedVector<std::array<LocalIndexType, 2>, 2*dim>> boundaryFaceScvfRanges_;
249 const FaceCenteredDiamondFVGridGeometry* gridGeometry_;
255 using Cache = FCDiamondGridGeometryCache;
257 using GeometryHelper =
typename Cache::GeometryHelper;
264 dofMapper_.update(this->
gridView());
267 const auto numElements = this->
gridView().size(0);
268 cache_.scvs_.resize(numElements);
269 cache_.scvfs_.resize(numElements);
270 cache_.hasBoundaryScvf_.resize(numElements,
false);
271 cache_.boundaryFaces_.resize(numElements);
272 cache_.boundaryFaceScvfRanges_.resize(numElements);
274 boundaryDofIndices_.assign(
numDofs(),
false);
278 numBoundaryScvf_ = 0;
285 const auto geometry =
element.geometry();
286 GeometryHelper geometryHelper(geometry);
289 cache_.scvs_[eIdx].reserve(geometryHelper.numScv());
290 numScv_ += geometryHelper.numScv();
291 for (LocalIndexType localScvIdx = 0; localScvIdx < geometryHelper.numScv(); ++localScvIdx)
294 const auto& corners = geometryHelper.getScvCorners(localScvIdx);
296 SubControlVolume::Traits::geometryType(geometry.type()),
297 [&](
unsigned int i){ return corners[i]; }
300 cache_.scvs_[eIdx].emplace_back(
302 geometryHelper.facetCenter(localScvIdx),
311 LocalIndexType localScvfIdx = 0;
312 cache_.scvfs_[eIdx].reserve(geometryHelper.numInteriorScvf());
313 numScvf_ += geometryHelper.numInteriorScvf();
314 for (; localScvfIdx < geometryHelper.numInteriorScvf(); ++localScvfIdx)
316 const auto& corners = geometryHelper.getScvfCorners(localScvfIdx);
317 const auto& scvPair = geometryHelper.getInsideOutsideScvForScvf(localScvfIdx);
319 SubControlVolumeFace::Traits::interiorGeometryType(geometry.type()),
320 [&](
unsigned int i){
return corners[i]; }
323 cache_.scvfs_[eIdx].emplace_back(
326 geometryHelper.normal(corners, scvPair),
333 LocalIndexType numBoundaryFaces = 0;
334 for (
const auto& intersection : intersections(this->
gridView(),
element))
336 if (onDomainBoundary_(intersection))
339 const LocalIndexType localFacetIndex = intersection.indexInInside();
341 boundaryDofIndices_[dofIndex] =
true;
344 cache_.hasBoundaryScvf_[eIdx] =
true;
348 const auto geo = intersection.geometry();
352 intersection.centerUnitOuterNormal(),
354 static_cast<LocalIndexType
>(localFacetIndex),
355 typename BoundaryFace::Traits::BoundaryFlag{intersection}
359 cache_.boundaryFaceScvfRanges_[eIdx].push_back(std::array<LocalIndexType, 2>{{
365 const auto geo = intersection.geometry();
366 cache_.scvfs_[eIdx].emplace_back(
369 intersection.centerUnitOuterNormal(),
370 std::array<LocalIndexType, 2>{{localFacetIndex, localFacetIndex}},
372 typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection }
382 if (onPeriodicBoundary_(intersection))
384 const LocalIndexType localFacetIndex = intersection.indexInInside();
389 const auto& otherElement = intersection.outside();
391 LocalIndexType otherIntersectionLocalIdx = 0;
392 bool periodicFaceFound =
false;
394 for (
const auto& otherIntersection : intersections(this->
gridView(), otherElement))
396 if (periodicFaceFound)
399 if (Dune::FloatCmp::eq(intersection.centerUnitOuterNormal()*otherIntersection.centerUnitOuterNormal(), -1.0, 1e-7))
401 const auto periodicDofIdx =
dofMapper().subIndex(otherElement, otherIntersectionLocalIdx, 1);
402 periodicFaceMap_[dofIndex] = periodicDofIdx;
403 periodicFaceFound =
true;
406 ++otherIntersectionLocalIdx;
413 bool onDomainBoundary_(
const typename GridView::Intersection& intersection)
const
415 return !intersection.neighbor() && intersection.boundary();
418 bool onProcessorBoundary_(
const typename GridView::Intersection& intersection)
const
420 return !intersection.neighbor() && !intersection.boundary();
423 bool onPeriodicBoundary_(
const typename GridView::Intersection& intersection)
const
425 return periodicGridTraits_.isPeriodic(intersection);
429 std::vector<bool> boundaryDofIndices_;
431 DofMapper dofMapper_;
434 std::size_t numScvf_;
435 std::size_t numBoundaryScvf_;
438 std::unordered_map<GridIndexType, GridIndexType> periodicFaceMap_;
440 const FeCache feCache_;
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.
Check the overlap size for different discretization methods.
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
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
Helper class to construct SCVs and SCVFs for the diamond scheme.
Definition discretization/facecentered/diamond/geometryhelper.hh:252
Class for a boundary face related to primary grid elements (dune intersections).
Definition boundaryface.hh:69
Element-wise grid geometry (local view).
Definition discretization/facecentered/diamond/fvelementgeometry.hh:38
Grid geometry for the diamond discretization.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:84
static constexpr bool cachingEnabled
Definition discretization/facecentered/diamond/fvgridgeometry.hh:102
Experimental::BoundaryFace< GV > BoundaryFace
Definition discretization/facecentered/diamond/fvgridgeometry.hh:127
friend LocalView localView(const FaceCenteredDiamondFVGridGeometry &gg)
local view of this object (constructed with the internal cache)
Definition discretization/facecentered/diamond/fvgridgeometry.hh:194
DiscretizationMethods::FCDiamond DiscretizationMethod
Definition discretization/facecentered/diamond/fvgridgeometry.hh:100
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the d.o.f. on the other side of the periodic boundary.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:186
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:190
FaceCenteredDiamondFVGridGeometry(const GridView &gridView, const std::string ¶mGroup="")
Constructor.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:130
GV GridView
Definition discretization/facecentered/diamond/fvgridgeometry.hh:113
std::size_t numScv() const
The total number of sub control volumes.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:140
typename PeriodicGridTraits< typename GV::Grid >::SupportsPeriodicity SupportsPeriodicity
Definition discretization/facecentered/diamond/fvgridgeometry.hh:121
FCDiamondGridGeometryCache Cache
Definition discretization/facecentered/diamond/fvgridgeometry.hh:255
typename Traits::SubControlVolumeFace SubControlVolumeFace
Definition discretization/facecentered/diamond/fvgridgeometry.hh:111
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a d.o.f. is on a periodic boundary.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:182
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:170
Extrusion_t< Traits > Extrusion
Definition discretization/facecentered/diamond/fvgridgeometry.hh:117
bool dofOnBoundary(GridIndexType dofIdx) const
If a face / d.o.f. is on the boundary.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:174
static constexpr DiscretizationMethod discMethod
Definition discretization/facecentered/diamond/fvgridgeometry.hh:101
std::size_t numBoundaryScvf() const
The total number of boundary sub control volume faces.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:148
static constexpr bool enableHybridCVFE
Definition discretization/facecentered/diamond/fvgridgeometry.hh:104
std::size_t numDofs() const
the total number of dofs
Definition discretization/facecentered/diamond/fvgridgeometry.hh:152
typename Traits::ScvfQuadratureRule ScvfQuadratureRule
Definition discretization/facecentered/diamond/fvgridgeometry.hh:125
void update(GridView &&gridView)
update all fvElementGeometries (call this after grid adaption)
Definition discretization/facecentered/diamond/fvgridgeometry.hh:163
const DofMapper & dofMapper() const
Return a reference to the dof mapper.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:178
typename Traits::ScvQuadratureRule ScvQuadratureRule
Definition discretization/facecentered/diamond/fvgridgeometry.hh:123
NonconformingFECache< Scalar, Scalar, dim > FeCache
Definition discretization/facecentered/diamond/fvgridgeometry.hh:119
typename Traits::template LocalView< ThisType, true > LocalView
Definition discretization/facecentered/diamond/fvgridgeometry.hh:107
typename Traits::SubControlVolume SubControlVolume
Definition discretization/facecentered/diamond/fvgridgeometry.hh:109
std::size_t numScvf() const
The total number of sub control volume faces.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:144
void update(const GridView &gridView)
update all fvElementGeometries (call this after grid adaption)
Definition discretization/facecentered/diamond/fvgridgeometry.hh:156
typename Traits::DofMapper DofMapper
Definition discretization/facecentered/diamond/fvgridgeometry.hh:115
The SCVF implementation for diamond.
Definition discretization/facecentered/diamond/subcontrolvolumeface.hh:62
Face centered diamond subcontrolvolume face.
Definition discretization/facecentered/diamond/subcontrolvolume.hh:62
Defines the default element and vertex mapper types.
Element-wise grid geometry (local view).
Helper class to construct SCVs and SCVFs for the diamond scheme.
Face centered diamond subcontrolvolume face.
The SCVF implementation for diamond.
Helper classes to compute the integration elements.
CVFE::DefaultQuadratureTraits< GridView, ScvRule, ScvfRule > FaceCenteredDiamondQuadratureTraits
Quadrature rule traits for FaceCenteredDiamond discretization.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:56
BaseGridGeometry(std::shared_ptr< BaseImplementation > impl)
Constructor from a BaseImplementation.
Definition basegridgeometry.hh:72
auto volume(const Geometry &geo, unsigned int integrationOrder=4)
The volume of a given geometry.
Definition volume.hh:159
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
Define some often used mathematical functions.
The available discretization methods in Dumux.
Definition cvfelocalresidual.hh:25
Dune::Std::detected_or_t< Dumux::DiamondGeometryHelper< GV, typename T::SubControlVolume, typename T::SubControlVolumeFace >, SpecifiesGeometryHelper, T > FaceCenteredDiamondGeometryHelper_t
Definition discretization/facecentered/diamond/fvgridgeometry.hh:44
typename T::GeometryHelper SpecifiesGeometryHelper
Definition basegridgeometry.hh:30
CVFE< CVFEMethods::CR_RT > FCDiamond
Definition method.hh:109
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:236
Definition common/pdesolver.hh:24
Grid properties related to periodicity.
Quadrature rule traits for discretization schemes.
Definition quadraturerules.hh:85
Definition defaultmappertraits.hh:23
The default traits for the face-centered diamond finite volume grid geometry Defines the scv and scvf...
Definition discretization/facecentered/diamond/fvgridgeometry.hh:66
FaceCenteredDiamondFVElementGeometry< GridGeometry, enableCache > LocalView
Definition discretization/facecentered/diamond/fvgridgeometry.hh:72
FaceCenteredDiamondSubControlVolume< GridView > SubControlVolume
Definition discretization/facecentered/diamond/fvgridgeometry.hh:67
FaceCenteredDiamondSubControlVolumeFace< GridView > SubControlVolumeFace
Definition discretization/facecentered/diamond/fvgridgeometry.hh:68
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > DofMapper
Definition discretization/facecentered/diamond/fvgridgeometry.hh:69
typename GridView::IndexSet::IndexType GridIndex
Definition indextraits.hh:27
std::uint_least8_t SmallLocalIndex
Definition indextraits.hh:29
Definition periodicgridtraits.hh:24
Definition periodicgridtraits.hh:23
Compute the volume of several common geometry types.