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>
 
   56template<
class Gr
idView>
 
   61    using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
 
   63    template<
class Gr
idGeometry, 
bool enableCache>
 
 
   72         bool enableCaching = 
true,
 
   81    using Element = 
typename GV::template Codim<0>::Entity;
 
   83    using Scalar = 
typename GV::ctype;
 
   85    static const int dim = GV::dimension;
 
   86    static const int dimWorld = GV::dimensionworld;
 
   88    static_assert(dim > 1, 
"Only implemented for dim > 1");
 
  118    , periodicGridTraits_(this->
gridView().grid())
 
 
  133    { 
return numBoundaryScvf_; }
 
 
  137    { 
return this->
gridView().size(1); }
 
 
  159    { 
return boundaryDofIndices_[dofIdx]; }
 
 
  163    { 
return dofMapper_; }
 
 
  167    { 
return periodicFaceMap_.count(dofIdx); }
 
 
  171    { 
return periodicFaceMap_.at(dofIdx); }
 
 
  175    { 
return periodicFaceMap_; }
 
 
  179    { 
return { gg.cache_ }; }
 
 
  183    class FCDiamondGridGeometryCache
 
  194        const FaceCenteredDiamondFVGridGeometry& gridGeometry()
 const 
  195        { 
return *gridGeometry_; }
 
  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]; }
 
  206        bool hasBoundaryScvf(GridIndexType eIdx)
 const 
  207        { 
return hasBoundaryScvf_[eIdx]; }
 
  214            hasBoundaryScvf_.clear();
 
  217        std::vector<std::vector<SubControlVolume>> scvs_;
 
  218        std::vector<std::vector<SubControlVolumeFace>> scvfs_;
 
  219        std::vector<bool> hasBoundaryScvf_;
 
  221        const FaceCenteredDiamondFVGridGeometry* gridGeometry_;
 
  227    using Cache = FCDiamondGridGeometryCache;
 
  229    using GeometryHelper = 
typename Cache::GeometryHelper;
 
  236        dofMapper_.update(this->
gridView());
 
  239        const auto numElements = this->
gridView().size(0);
 
  240        cache_.scvs_.resize(numElements);
 
  241        cache_.scvfs_.resize(numElements);
 
  242        cache_.hasBoundaryScvf_.resize(numElements, 
false);
 
  244        boundaryDofIndices_.assign(
numDofs(), 
false);
 
  248        numBoundaryScvf_ = 0;
 
  255            const auto geometry = 
element.geometry();
 
  256            GeometryHelper geometryHelper(geometry);
 
  259            cache_.scvs_[eIdx].reserve(geometryHelper.numScv());
 
  260            numScv_ += geometryHelper.numScv();
 
  261            for (LocalIndexType localScvIdx = 0; localScvIdx < geometryHelper.numScv(); ++localScvIdx)
 
  264                const auto& corners = geometryHelper.getScvCorners(localScvIdx);
 
  266                    SubControlVolume::Traits::geometryType(geometry.type()),
 
  267                    [&](
unsigned int i){ return corners[i]; }
 
  270                cache_.scvs_[eIdx].emplace_back(
 
  272                    geometryHelper.facetCenter(localScvIdx),
 
  281            LocalIndexType localScvfIdx = 0;
 
  282            cache_.scvfs_[eIdx].reserve(geometryHelper.numInteriorScvf());
 
  283            numScvf_ += geometryHelper.numInteriorScvf();
 
  284            for (; localScvfIdx < geometryHelper.numInteriorScvf(); ++localScvfIdx)
 
  286                const auto& corners = geometryHelper.getScvfCorners(localScvfIdx);
 
  287                const auto& scvPair = geometryHelper.getInsideOutsideScvForScvf(localScvfIdx);
 
  289                    SubControlVolumeFace::Traits::interiorGeometryType(geometry.type()),
 
  290                    [&](
unsigned int i){ 
return corners[i]; }
 
  293                cache_.scvfs_[eIdx].emplace_back(
 
  296                    geometryHelper.normal(corners, scvPair),
 
  303            for (
const auto& intersection : intersections(this->
gridView(), 
element))
 
  305                if (onDomainBoundary_(intersection))
 
  308                    const LocalIndexType localFacetIndex = intersection.indexInInside();
 
  310                    boundaryDofIndices_[dofIndex] = 
true;
 
  313                    cache_.hasBoundaryScvf_[eIdx] = 
true;
 
  316                    const auto geo = intersection.geometry();
 
  317                    cache_.scvfs_[eIdx].emplace_back(
 
  320                        intersection.centerUnitOuterNormal(),
 
  321                        std::array<LocalIndexType, 2>{{localFacetIndex, localFacetIndex}},
 
  323                        typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection }
 
  333                if (onPeriodicBoundary_(intersection))
 
  335                    const LocalIndexType localFacetIndex = intersection.indexInInside();
 
  340                    const auto& otherElement = intersection.outside();
 
  342                    LocalIndexType otherIntersectionLocalIdx = 0;
 
  343                    bool periodicFaceFound = 
false;
 
  345                    for (
const auto& otherIntersection : intersections(this->
gridView(), otherElement))
 
  347                        if (periodicFaceFound)
 
  350                        if (Dune::FloatCmp::eq(intersection.centerUnitOuterNormal()*otherIntersection.centerUnitOuterNormal(), -1.0, 1e-7))
 
  352                            const auto periodicDofIdx = 
dofMapper().subIndex(otherElement, otherIntersectionLocalIdx, 1);
 
  353                            periodicFaceMap_[dofIndex] = periodicDofIdx;
 
  354                            periodicFaceFound = 
true;
 
  357                        ++otherIntersectionLocalIdx;
 
  364    bool onDomainBoundary_(
const typename GridView::Intersection& intersection)
 const 
  366        return !intersection.neighbor() && intersection.boundary();
 
  369    bool onProcessorBoundary_(
const typename GridView::Intersection& intersection)
 const 
  371        return !intersection.neighbor() && !intersection.boundary();
 
  374    bool onPeriodicBoundary_(
const typename GridView::Intersection& intersection)
 const 
  376        return periodicGridTraits_.isPeriodic(intersection);
 
  380    std::vector<bool> boundaryDofIndices_;
 
  382    DofMapper dofMapper_;
 
  385    std::size_t numScvf_;
 
  386    std::size_t numBoundaryScvf_;
 
  389    std::unordered_map<GridIndexType, GridIndexType> periodicFaceMap_;
 
  391    const FeCache feCache_;
 
 
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.
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:255
Element-wise grid geometry (local view)
Definition discretization/facecentered/diamond/fvelementgeometry.hh:32
Grid geometry for the diamond discretization.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:76
static constexpr bool cachingEnabled
Definition discretization/facecentered/diamond/fvgridgeometry.hh:94
friend LocalView localView(const FaceCenteredDiamondFVGridGeometry &gg)
local view of this object (constructed with the internal cache)
Definition discretization/facecentered/diamond/fvgridgeometry.hh:178
DiscretizationMethods::FCDiamond DiscretizationMethod
Definition discretization/facecentered/diamond/fvgridgeometry.hh:92
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:170
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:174
FaceCenteredDiamondFVGridGeometry(const GridView &gridView, const std::string ¶mGroup="")
Constructor.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:114
GV GridView
Definition discretization/facecentered/diamond/fvgridgeometry.hh:103
std::size_t numScv() const
The total number of sub control volumes.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:124
typename PeriodicGridTraits< typename GV::Grid >::SupportsPeriodicity SupportsPeriodicity
Definition discretization/facecentered/diamond/fvgridgeometry.hh:111
FCDiamondGridGeometryCache Cache
Definition discretization/facecentered/diamond/fvgridgeometry.hh:227
typename Traits::SubControlVolumeFace SubControlVolumeFace
Definition discretization/facecentered/diamond/fvgridgeometry.hh:101
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a d.o.f. is on a periodic boundary.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:166
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:154
Extrusion_t< Traits > Extrusion
Definition discretization/facecentered/diamond/fvgridgeometry.hh:107
bool dofOnBoundary(GridIndexType dofIdx) const
If a face / d.o.f. is on the boundary.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:158
static constexpr DiscretizationMethod discMethod
Definition discretization/facecentered/diamond/fvgridgeometry.hh:93
std::size_t numBoundaryScvf() const
The total number of boundary sub control volume faces.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:132
std::size_t numDofs() const
the total number of dofs
Definition discretization/facecentered/diamond/fvgridgeometry.hh:136
void update(GridView &&gridView)
update all fvElementGeometries (call this after grid adaption)
Definition discretization/facecentered/diamond/fvgridgeometry.hh:147
const DofMapper & dofMapper() const
Return a reference to the dof mapper.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:162
NonconformingFECache< Scalar, Scalar, dim > FeCache
Definition discretization/facecentered/diamond/fvgridgeometry.hh:109
typename Traits::template LocalView< ThisType, true > LocalView
Definition discretization/facecentered/diamond/fvgridgeometry.hh:97
typename Traits::SubControlVolume SubControlVolume
Definition discretization/facecentered/diamond/fvgridgeometry.hh:99
std::size_t numScvf() const
The total number of sub control volume faces.
Definition discretization/facecentered/diamond/fvgridgeometry.hh:128
void update(const GridView &gridView)
update all fvElementGeometries (call this after grid adaption)
Definition discretization/facecentered/diamond/fvgridgeometry.hh:140
typename Traits::DofMapper DofMapper
Definition discretization/facecentered/diamond/fvgridgeometry.hh:105
The SCVF implementation for diamond.
Definition discretization/facecentered/diamond/subcontrolvolumeface.hh:63
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.
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.
Distance implementation details.
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:43
typename T::GeometryHelper SpecifiesGeometryHelper
Definition basegridgeometry.hh:30
CVFE< CVFEMethods::CR_RT > FCDiamond
Definition method.hh:101
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:166
Definition common/pdesolver.hh:24
Grid properties related to periodicity.
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:58
FaceCenteredDiamondSubControlVolume< GridView > SubControlVolume
Definition discretization/facecentered/diamond/fvgridgeometry.hh:59
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > DofMapper
Definition discretization/facecentered/diamond/fvgridgeometry.hh:61
FaceCenteredDiamondFVElementGeometry< GridGeometry, enableCache > LocalView
Definition discretization/facecentered/diamond/fvgridgeometry.hh:64
FaceCenteredDiamondSubControlVolumeFace< GridView > SubControlVolumeFace
Definition discretization/facecentered/diamond/fvgridgeometry.hh:60
typename GridView::IndexSet::IndexType GridIndex
Definition indextraits.hh:27
std::uint_least8_t SmallLocalIndex
Definition indextraits.hh:29
Definition periodicgridtraits.hh:34
Definition periodicgridtraits.hh:33
Compute the volume of several common geometry types.