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>
42template<
class GV,
class T>
54template<
class Gr
idView,
class ScvRule = Dumux::QuadratureRules::M
idpo
intQuadrature,
class ScvfRule = Dumux::QuadratureRules::M
idpo
intQuadrature>
63template<
class Gr
idView,
class QuadratureTraits = FaceCenteredDiamondQuadratureTraits<Gr
idView>>
68 using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
70 template<
class Gr
idGeometry,
bool enableCache>
79 bool enableCaching =
true,
88 using Element =
typename GV::template Codim<0>::Entity;
90 using Scalar =
typename GV::ctype;
92 static const int dim = GV::dimension;
93 static const int dimWorld = GV::dimensionworld;
95 static_assert(dim > 1,
"Only implemented for dim > 1");
129 , periodicGridTraits_(this->
gridView().grid())
144 {
return numBoundaryScvf_; }
148 {
return this->
gridView().size(1); }
170 {
return boundaryDofIndices_[dofIdx]; }
174 {
return dofMapper_; }
178 {
return periodicFaceMap_.count(dofIdx); }
182 {
return periodicFaceMap_.at(dofIdx); }
186 {
return periodicFaceMap_; }
190 {
return { gg.cache_ }; }
194 class FCDiamondGridGeometryCache
206 {
return *gridGeometry_; }
209 const std::vector<SubControlVolume>&
scvs(GridIndexType eIdx)
const
210 {
return scvs_[eIdx]; }
213 const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx)
const
214 {
return scvfs_[eIdx]; }
217 bool hasBoundaryScvf(GridIndexType eIdx)
const
218 {
return hasBoundaryScvf_[eIdx]; }
225 hasBoundaryScvf_.clear();
228 std::vector<std::vector<SubControlVolume>> scvs_;
229 std::vector<std::vector<SubControlVolumeFace>> scvfs_;
230 std::vector<bool> hasBoundaryScvf_;
238 using Cache = FCDiamondGridGeometryCache;
240 using GeometryHelper =
typename Cache::GeometryHelper;
247 dofMapper_.update(this->
gridView());
250 const auto numElements = this->
gridView().size(0);
251 cache_.scvs_.resize(numElements);
252 cache_.scvfs_.resize(numElements);
253 cache_.hasBoundaryScvf_.resize(numElements,
false);
255 boundaryDofIndices_.assign(
numDofs(),
false);
259 numBoundaryScvf_ = 0;
266 const auto geometry =
element.geometry();
267 GeometryHelper geometryHelper(geometry);
270 cache_.scvs_[eIdx].reserve(geometryHelper.numScv());
271 numScv_ += geometryHelper.numScv();
272 for (LocalIndexType localScvIdx = 0; localScvIdx < geometryHelper.numScv(); ++localScvIdx)
275 const auto& corners = geometryHelper.getScvCorners(localScvIdx);
276 const auto volume = Dumux::convexPolytopeVolume<dim>(
277 SubControlVolume::Traits::geometryType(geometry.type()),
278 [&](
unsigned int i){ return corners[i]; }
281 cache_.scvs_[eIdx].emplace_back(
283 geometryHelper.facetCenter(localScvIdx),
292 LocalIndexType localScvfIdx = 0;
293 cache_.scvfs_[eIdx].reserve(geometryHelper.numInteriorScvf());
294 numScvf_ += geometryHelper.numInteriorScvf();
295 for (; localScvfIdx < geometryHelper.numInteriorScvf(); ++localScvfIdx)
297 const auto& corners = geometryHelper.getScvfCorners(localScvfIdx);
298 const auto& scvPair = geometryHelper.getInsideOutsideScvForScvf(localScvfIdx);
300 SubControlVolumeFace::Traits::interiorGeometryType(geometry.type()),
301 [&](
unsigned int i){
return corners[i]; }
304 cache_.scvfs_[eIdx].emplace_back(
307 geometryHelper.normal(corners, scvPair),
314 for (
const auto& intersection : intersections(this->
gridView(),
element))
316 if (onDomainBoundary_(intersection))
319 const LocalIndexType localFacetIndex = intersection.indexInInside();
321 boundaryDofIndices_[dofIndex] =
true;
324 cache_.hasBoundaryScvf_[eIdx] =
true;
327 const auto geo = intersection.geometry();
328 cache_.scvfs_[eIdx].emplace_back(
331 intersection.centerUnitOuterNormal(),
332 std::array<LocalIndexType, 2>{{localFacetIndex, localFacetIndex}},
334 typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection }
344 if (onPeriodicBoundary_(intersection))
346 const LocalIndexType localFacetIndex = intersection.indexInInside();
351 const auto& otherElement = intersection.outside();
353 LocalIndexType otherIntersectionLocalIdx = 0;
354 bool periodicFaceFound =
false;
356 for (
const auto& otherIntersection : intersections(this->
gridView(), otherElement))
358 if (periodicFaceFound)
361 if (Dune::FloatCmp::eq(intersection.centerUnitOuterNormal()*otherIntersection.centerUnitOuterNormal(), -1.0, 1e-7))
363 const auto periodicDofIdx =
dofMapper().subIndex(otherElement, otherIntersectionLocalIdx, 1);
364 periodicFaceMap_[dofIndex] = periodicDofIdx;
365 periodicFaceFound =
true;
368 ++otherIntersectionLocalIdx;
375 bool onDomainBoundary_(
const typename GridView::Intersection& intersection)
const
377 return !intersection.neighbor() && intersection.boundary();
380 bool onProcessorBoundary_(
const typename GridView::Intersection& intersection)
const
382 return !intersection.neighbor() && !intersection.boundary();
385 bool onPeriodicBoundary_(
const typename GridView::Intersection& intersection)
const
387 return periodicGridTraits_.isPeriodic(intersection);
391 std::vector<bool> boundaryDofIndices_;
393 DofMapper dofMapper_;
396 std::size_t numScvf_;
397 std::size_t numBoundaryScvf_;
400 std::unordered_map<GridIndexType, GridIndexType> periodicFaceMap_;
402 const FeCache feCache_;
406 PeriodicGridTraits<typename GridView::Grid> periodicGridTraits_;
Base class for grid geometries.
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.
Base class for all grid geometries.
Definition: basegridgeometry.hh:52
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
Get an element from a global element index.
Definition: basegridgeometry.hh:142
const GridView & gridView() const
Return the gridView this grid geometry object lives on.
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
Element-wise grid geometry (local view)
Definition: discretization/facecentered/diamond/fvelementgeometry.hh:36
Grid geometry for the diamond discretization.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:83
static constexpr bool cachingEnabled
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:101
friend LocalView localView(const FaceCenteredDiamondFVGridGeometry &gg)
local view of this object (constructed with the internal cache)
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:189
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:181
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:185
FaceCenteredDiamondFVGridGeometry(const GridView &gridView, const std::string ¶mGroup="")
Constructor.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:125
GV GridView
export the grid view type
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:110
std::size_t numScv() const
The total number of sub control volumes.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:135
typename PeriodicGridTraits< typename GV::Grid >::SupportsPeriodicity SupportsPeriodicity
export whether the grid(geometry) supports periodicity
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:118
FCDiamondGridGeometryCache Cache
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:238
typename Traits::SubControlVolumeFace SubControlVolumeFace
export the type of sub control volume
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:108
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a d.o.f. is on a periodic boundary.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:177
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:165
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:114
bool dofOnBoundary(GridIndexType dofIdx) const
If a face / d.o.f. is on the boundary.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:169
static constexpr DiscretizationMethod discMethod
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:100
std::size_t numBoundaryScvf() const
The total number of boundary sub control volume faces.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:143
std::size_t numDofs() const
the total number of dofs
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:147
typename Traits::ScvfQuadratureRule ScvfQuadratureRule
the quadrature rule type for scvfs
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:122
void update(GridView &&gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:158
const DofMapper & dofMapper() const
Return a reference to the dof mapper.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:173
typename Traits::ScvQuadratureRule ScvQuadratureRule
the quadrature rule type for scvs
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:120
typename Traits::template LocalView< ThisType, true > LocalView
export the type of the fv element geometry (the local view type)
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:104
typename Traits::SubControlVolume SubControlVolume
export the type of sub control volume
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:106
std::size_t numScvf() const
The total number of sub control volume faces.
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:139
void update(const GridView &gridView)
update all fvElementGeometries (call this after grid adaption)
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:151
typename Traits::DofMapper DofMapper
export the dof mapper type
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:112
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.
Helper classes to compute the integration elements.
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.
Dune::Std::detected_or_t< Dumux::DiamondGeometryHelper< GV, typename T::SubControlVolume, typename T::SubControlVolumeFace >, SpecifiesGeometryHelper, T > FaceCenteredDiamondGeometryHelper_t
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:47
typename T::GeometryHelper SpecifiesGeometryHelper
Definition: basegridgeometry.hh:30
CVFE< CVFEMethods::CR_RT > FCDiamond
Definition: method.hh:105
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition: extrusion.hh:166
std::ranges::range auto scvs(const FVElementGeometry &fvGeometry, const LocalDof &localDof)
Definition: localdof.hh:79
Definition: common/pdesolver.hh:24
Grid properties related to periodicity.
Quadrature rule traits for discretization schemes.
Definition: quadraturerules.hh:84
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:65
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > DofMapper
Definition: discretization/facecentered/diamond/fvgridgeometry.hh:68
Structure to define the index types used for grid and local indices.
Definition: indextraits.hh:26
Definition: periodicgridtraits.hh:24
Compute the volume of several common geometry types.