14#ifndef DUMUX_DISCRETIZATION_PQ1BUBBLE_GRID_GEOMETRY_HH 
   15#define DUMUX_DISCRETIZATION_PQ1BUBBLE_GRID_GEOMETRY_HH 
   18#include <unordered_map> 
   20#include <dune/grid/common/mcmgmapper.hh> 
   43template<
class GV, 
class T>
 
   51template <
class Gr
idView>
 
   54    using DofMapper = Dune::MultipleCodimMultipleGeomTypeMapper<GridView>;
 
   62        return [](Dune::GeometryType gt, 
int dimgrid) {
 
   63            return (gt.dim() == dimgrid) || (gt.dim() == 0);
 
 
 
   74template<
class Gr
idView, 
class MapperTraits = PQ1BubbleMapperTraits<Gr
idView>>
 
   81    template<
class Gr
idGeometry, 
bool enableCache>
 
 
   93         bool enableCaching = 
true,
 
  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;
 
  108    static_assert(dim > 1, 
"Only implemented for dim > 1");
 
  135    , dofMapper_(
gridView, Traits::layout())
 
  137    , periodicGridTraits_(this->
gridView().grid())
 
 
  144    { 
return dofMapper_; }
 
 
  156    { 
return numBoundaryScvf_; }
 
 
  182    { 
return boundaryDofIndices_[dofIdx]; }
 
 
  186    { 
return periodicDofMap_.count(dofIdx); }
 
 
  190    { 
return periodicDofMap_.at(dofIdx); }
 
 
  194    { 
return periodicDofMap_; }
 
 
  198    { 
return { gg.cache_ }; }
 
 
  202    class PQ1BubbleGridGeometryCache
 
  213        const PQ1BubbleFVGridGeometry& gridGeometry()
 const 
  214        { 
return *gridGeometry_; }
 
  217        const std::vector<SubControlVolume>& scvs(GridIndexType eIdx)
 const 
  218        { 
return scvs_[eIdx]; }
 
  221        const std::vector<SubControlVolumeFace>& scvfs(GridIndexType eIdx)
 const 
  222        { 
return scvfs_[eIdx]; }
 
  225        bool hasBoundaryScvf(GridIndexType eIdx)
 const 
  226        { 
return hasBoundaryScvf_[eIdx]; }
 
  229        const std::vector<std::array<LocalIndexType, 2>>& scvfBoundaryGeometryKeys(GridIndexType eIdx)
 const 
  230        { 
return scvfBoundaryGeometryKeys_.at(eIdx); }
 
  237            hasBoundaryScvf_.clear();
 
  238            scvfBoundaryGeometryKeys_.clear();
 
  241        std::vector<std::vector<SubControlVolume>> scvs_;
 
  242        std::vector<std::vector<SubControlVolumeFace>> scvfs_;
 
  243        std::vector<bool> hasBoundaryScvf_;
 
  244        std::unordered_map<GridIndexType, std::vector<std::array<LocalIndexType, 2>>> scvfBoundaryGeometryKeys_;
 
  246        const PQ1BubbleFVGridGeometry* gridGeometry_;
 
  252    using Cache = PQ1BubbleGridGeometryCache;
 
  255    using GeometryHelper = 
typename Cache::GeometryHelper;
 
  260        dofMapper_.update(this->
gridView());
 
  262        auto numElements = this->
gridView().size(0);
 
  263        cache_.scvs_.resize(numElements);
 
  264        cache_.scvfs_.resize(numElements);
 
  265        cache_.hasBoundaryScvf_.resize(numElements, 
false);
 
  267        boundaryDofIndices_.assign(
numDofs(), 
false);
 
  271        numBoundaryScvf_ = 0;
 
  279            auto elementGeometry = 
element.geometry();
 
  280            const auto refElement = referenceElement(elementGeometry);
 
  283            GeometryHelper geometryHelper(elementGeometry);
 
  285            numScv_ += geometryHelper.numScv();
 
  287            cache_.scvs_[eIdx].resize(geometryHelper.numScv());
 
  288            for (LocalIndexType scvLocalIdx = 0; scvLocalIdx < geometryHelper.numScv(); ++scvLocalIdx)
 
  290                auto corners = geometryHelper.getScvCorners(scvLocalIdx);
 
  292                    geometryHelper.scvVolume(scvLocalIdx, corners),
 
  293                    geometryHelper.dofPosition(scvLocalIdx),
 
  297                    geometryHelper.dofIndex(this->dofMapper(), 
element, scvLocalIdx),
 
  298                    geometryHelper.isOverlappingScv(scvLocalIdx)
 
  303            numScvf_ += geometryHelper.numInteriorScvf();
 
  304            cache_.scvfs_[eIdx].resize(geometryHelper.numInteriorScvf());
 
  305            LocalIndexType scvfLocalIdx = 0;
 
  306            for (; scvfLocalIdx < geometryHelper.numInteriorScvf(); ++scvfLocalIdx)
 
  308                const auto scvPair = geometryHelper.getScvPairForScvf(scvfLocalIdx);
 
  309                const auto corners = geometryHelper.getScvfCorners(scvfLocalIdx);
 
  311                    geometryHelper.getInteriorScvfGeometryType(scvfLocalIdx),
 
  312                    [&](
unsigned int i){ 
return corners[i]; }
 
  318                    geometryHelper.normal(corners, scvPair),
 
  321                    geometryHelper.isOverlappingScvf(scvfLocalIdx)
 
  326            for (
const auto& intersection : intersections(this->
gridView(), 
element))
 
  328                if (intersection.boundary() && !intersection.neighbor())
 
  330                    cache_.hasBoundaryScvf_[eIdx] = 
true;
 
  332                    const auto localFacetIndex = intersection.indexInInside();
 
  333                    const auto numBoundaryScvf = geometryHelper.numBoundaryScvf(localFacetIndex);
 
  337                    for (
unsigned int isScvfLocalIdx = 0; isScvfLocalIdx < 
numBoundaryScvf; ++isScvfLocalIdx)
 
  340                        const auto scvPair = geometryHelper.getScvPairForBoundaryScvf(localFacetIndex, isScvfLocalIdx);
 
  341                        const auto corners = geometryHelper.getBoundaryScvfCorners(localFacetIndex, isScvfLocalIdx);
 
  343                            geometryHelper.getBoundaryScvfGeometryType(isScvfLocalIdx),
 
  344                            [&](
unsigned int i){ 
return corners[i]; }
 
  346                        cache_.scvfs_[eIdx].emplace_back(
 
  349                            intersection.centerUnitOuterNormal(),
 
  352                            typename SubControlVolumeFace::Traits::BoundaryFlag{ intersection },
 
  353                            geometryHelper.isOverlappingBoundaryScvf(localFacetIndex)
 
  357                        cache_.scvfBoundaryGeometryKeys_[eIdx].emplace_back(std::array<LocalIndexType, 2>{{
 
  358                            static_cast<LocalIndexType
>(localFacetIndex),
 
  359                            static_cast<LocalIndexType
>(isScvfLocalIdx)
 
  371                        const auto vIdx = refElement.subEntity(localFacetIndex, 1, localVIdx, dim);
 
  373                        boundaryDofIndices_[vIdxGlobal] = 
true;
 
  378                else if (periodicGridTraits_.isPeriodic(intersection))
 
  383                    const auto fIdx = intersection.indexInInside();
 
  384                    const auto numFaceVerts = refElement.size(fIdx, 1, dim);
 
  385                    const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
 
  386                    for (
int localVIdx = 0; localVIdx < numFaceVerts; ++localVIdx)
 
  388                        const auto vIdx = refElement.subEntity(fIdx, 1, localVIdx, dim);
 
  390                        const auto vPos = elementGeometry.corner(vIdx);
 
  392                        const auto& outside = intersection.outside();
 
  393                        const auto outsideGeometry = outside.geometry();
 
  394                        for (
const auto& isOutside : intersections(this->
gridView(), outside))
 
  397                            if (periodicGridTraits_.isPeriodic(isOutside))
 
  399                                const auto fIdxOutside = isOutside.indexInInside();
 
  400                                const auto numFaceVertsOutside = refElement.size(fIdxOutside, 1, dim);
 
  401                                for (
int localVIdxOutside = 0; localVIdxOutside < numFaceVertsOutside; ++localVIdxOutside)
 
  403                                    const auto vIdxOutside = refElement.subEntity(fIdxOutside, 1, localVIdxOutside, dim);
 
  404                                    const auto vPosOutside = outsideGeometry.corner(vIdxOutside);
 
  405                                    const auto shift = std::abs((this->
bBoxMax()-this->
bBoxMin())*intersection.centerUnitOuterNormal());
 
  406                                    if (std::abs((vPosOutside-vPos).two_norm() - shift) < eps)
 
  407                                        periodicDofMap_[vIdxGlobal] = this->
dofMapper().subIndex(outside, vIdxOutside, dim);
 
  418            DUNE_THROW(Dune::NotImplemented, 
"Periodic boundaries for pq1bubble method for parallel simulations!");
 
  426    std::size_t numScvf_;
 
  427    std::size_t numBoundaryScvf_;
 
  430    std::vector<bool> boundaryDofIndices_;
 
  433    std::unordered_map<GridIndexType, GridIndexType> periodicDofMap_;
 
 
Base class for grid geometries.
Compute the center point of a convex polytope geometry or a random-access container of corner points.
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
const GlobalCoordinate & bBoxMax() const
The coordinate of the corner of the GridView's bounding box with the largest values.
Definition basegridgeometry.hh:156
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
const GlobalCoordinate & bBoxMin() const
The coordinate of the corner of the GridView's bounding box with the smallest values.
Definition basegridgeometry.hh:149
bool isPeriodic() const
Returns if the grid geometry is periodic (at all)
Definition basegridgeometry.hh:162
Definition pq1bubblefecache.hh:29
Base class for the finite volume geometry vector for pq1bubble models This builds up the sub control ...
Definition discretization/pq1bubble/fvelementgeometry.hh:40
Base class for the finite volume geometry vector for pq1bubble schemes This builds up the sub control...
Definition discretization/pq1bubble/fvgridgeometry.hh:97
void update(const GridView &gridView)
update all geometries (call this after grid adaption)
Definition discretization/pq1bubble/fvgridgeometry.hh:163
friend LocalView localView(const PQ1BubbleFVGridGeometry &gg)
local view of this object (constructed with the internal cache)
Definition discretization/pq1bubble/fvgridgeometry.hh:197
PQ1BubbleGridGeometryCache Cache
Definition discretization/pq1bubble/fvgridgeometry.hh:252
static constexpr DiscretizationMethod discMethod
Definition discretization/pq1bubble/fvgridgeometry.hh:113
std::size_t numBoundaryScvf() const
The total number of boundary sub control volume faces.
Definition discretization/pq1bubble/fvgridgeometry.hh:155
std::size_t numScv() const
The total number of sub control volumes.
Definition discretization/pq1bubble/fvgridgeometry.hh:147
std::size_t numScvf() const
The total number of sub control volume faces.
Definition discretization/pq1bubble/fvgridgeometry.hh:151
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition discretization/pq1bubble/fvgridgeometry.hh:177
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the vertex / d.o.f. on the other side of the periodic boundary.
Definition discretization/pq1bubble/fvgridgeometry.hh:189
DiscretizationMethods::PQ1Bubble DiscretizationMethod
Definition discretization/pq1bubble/fvgridgeometry.hh:112
Extrusion_t< PQ1BubbleDefaultGridGeometryTraits< GridView > > Extrusion
Definition discretization/pq1bubble/fvgridgeometry.hh:122
typename PQ1BubbleDefaultGridGeometryTraits< GridView >::SubControlVolumeFace SubControlVolumeFace
Definition discretization/pq1bubble/fvgridgeometry.hh:120
std::size_t numDofs() const
The total number of degrees of freedom.
Definition discretization/pq1bubble/fvgridgeometry.hh:159
bool dofOnBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on the boundary.
Definition discretization/pq1bubble/fvgridgeometry.hh:181
typename PQ1BubbleDefaultGridGeometryTraits< GridView >::DofMapper DofMapper
Definition discretization/pq1bubble/fvgridgeometry.hh:124
const DofMapper & dofMapper() const
The dofMapper.
Definition discretization/pq1bubble/fvgridgeometry.hh:143
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition discretization/pq1bubble/fvgridgeometry.hh:193
GridView GridView
Definition discretization/pq1bubble/fvgridgeometry.hh:128
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a vertex / d.o.f. is on a periodic boundary.
Definition discretization/pq1bubble/fvgridgeometry.hh:185
typename PQ1BubbleDefaultGridGeometryTraits< GridView >::template LocalView< ThisType, true > LocalView
Definition discretization/pq1bubble/fvgridgeometry.hh:116
typename PQ1BubbleDefaultGridGeometryTraits< GridView >::SubControlVolume SubControlVolume
Definition discretization/pq1bubble/fvgridgeometry.hh:118
typename PeriodicGridTraits< typename GridView::Grid >::SupportsPeriodicity SupportsPeriodicity
Definition discretization/pq1bubble/fvgridgeometry.hh:130
PQ1BubbleFVGridGeometry(const GridView gridView)
Constructor.
Definition discretization/pq1bubble/fvgridgeometry.hh:133
void update(GridView &&gridView)
update all geometries (call this after grid adaption)
Definition discretization/pq1bubble/fvgridgeometry.hh:170
Dumux::PQ1BubbleFECache< CoordScalar, Scalar, dim > FeCache
Definition discretization/pq1bubble/fvgridgeometry.hh:126
A class to create sub control volume and sub control volume face geometries per element.
Definition discretization/pq1bubble/geometryhelper.hh:166
Class for a sub control volume face in the cvfe method, i.e a part of the boundary of a sub control v...
Definition discretization/pq1bubble/subcontrolvolumeface.hh:60
the sub control volume for the pq1bubble scheme
Definition discretization/pq1bubble/subcontrolvolume.hh:56
Defines the default element and vertex mapper types.
Base class for the local finite volume geometry for the pq1bubble method This builds up the sub contr...
Helper class constructing the dual grid finite volume geometries for the cvfe discretizazion method.
the sub control volume for the cvfe scheme
Base class for a sub control volume face.
Helper classes to compute the integration elements.
BaseGridGeometry(std::shared_ptr< BaseImplementation > impl)
Constructor from a BaseImplementation.
Definition basegridgeometry.hh:72
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
The available discretization methods in Dumux.
Distance implementation details.
Definition cvfelocalresidual.hh:25
Dune::Std::detected_or_t< Dumux::PQ1BubbleGeometryHelper< GV, typename T::SubControlVolume, typename T::SubControlVolumeFace >, SpecifiesGeometryHelper, T > PQ1BubbleGeometryHelper_t
Definition discretization/pq1bubble/fvgridgeometry.hh:44
typename T::GeometryHelper SpecifiesGeometryHelper
Definition basegridgeometry.hh:30
CVFE< CVFEMethods::PQ1Bubble > PQ1Bubble
Definition method.hh:108
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:166
Grid properties related to periodicity.
A finite element cache for P1/Q1 function with bubble.
Definition defaultmappertraits.hh:23
typename GridView::IndexSet::IndexType GridIndex
Definition indextraits.hh:27
unsigned int LocalIndex
Definition indextraits.hh:28
The default traits for the pq1bubble finite volume grid geometry Defines the scv and scvf types and t...
Definition discretization/pq1bubble/fvgridgeometry.hh:77
PQ1BubbleSubControlVolume< GridView > SubControlVolume
Definition discretization/pq1bubble/fvgridgeometry.hh:78
PQ1BubbleSubControlVolumeFace< GridView > SubControlVolumeFace
Definition discretization/pq1bubble/fvgridgeometry.hh:79
PQ1BubbleFVElementGeometry< GridGeometry, enableCache > LocalView
Definition discretization/pq1bubble/fvgridgeometry.hh:82
Definition discretization/pq1bubble/fvgridgeometry.hh:53
Dune::MultipleCodimMultipleGeomTypeMapper< GridView > DofMapper
Definition discretization/pq1bubble/fvgridgeometry.hh:54
static Dune::MCMGLayout layout()
layout for elements and vertices
Definition discretization/pq1bubble/fvgridgeometry.hh:60
Definition periodicgridtraits.hh:34
Definition periodicgridtraits.hh:33
Compute the volume of several common geometry types.