12#ifndef DUMUX_DISCRETIZATION_FE_GRID_DISCRETIZATION_HH
13#define DUMUX_DISCRETIZATION_FE_GRID_DISCRETIZATION_HH
18#include <unordered_map>
20#include <dune/common/reservedvector.hh>
39template<
class GV,
class Traits>
47 static const int dim = GV::dimension;
82 : ParentType(std::move(gg))
83 , dofMapper_(this->
gridView(), Traits::layout())
85 , periodicGridTraits_(this->
gridView().grid())
97 {
return dofMapper_; }
123 {
return boundaryDofIndices_[dofIdx]; }
127 {
return periodicDofMap_.count(dofIdx); }
131 {
return periodicDofMap_.at(dofIdx); }
135 {
return periodicDofMap_; }
139 {
return { gg.cache_ }; }
142 class FEGridDiscretizationCache
147 using DofHelper =
typename Traits::DofHelper;
150 : gridDiscretization_(&gg)
153 const FEGridDiscretization& gridDiscretization()
const
154 {
return *gridDiscretization_; }
157 auto boundaryFaces(GridIndexType eIdx)
const -> std::span<const BoundaryFace>
159 if (
auto it = boundaryFaces_.find(eIdx); it != boundaryFaces_.end())
166 { boundaryFaces_.clear(); }
168 std::unordered_map<GridIndexType, Dune::ReservedVector<BoundaryFace, 2*dim>> boundaryFaces_;
170 const FEGridDiscretization* gridDiscretization_;
176 using Cache = FEGridDiscretizationCache;
182 using DofHelper =
typename Cache::DofHelper;
184 dofMapper_.update(this->
gridView());
186 boundaryDofIndices_.assign(
numDofs(),
false);
190 auto elementGeometry =
element.geometry();
191 const auto& localCoefficients = this->
feCache().get(
element.type()).localCoefficients();
194 LocalIndexType numBoundaryFaces = 0;
195 for (
const auto& intersection : intersections(this->
gridView(),
element))
197 if (intersection.boundary() && !periodicGridTraits_.isPeriodic(intersection))
200 const auto isGeometry = intersection.geometry();
204 intersection.centerUnitOuterNormal(),
206 static_cast<LocalIndexType
>(intersection.indexInInside()),
207 typename BoundaryFace::Traits::BoundaryFlag{intersection}
211 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
213 if (DofHelper::localDofOnIntersection(elementGeometry.type(),
214 intersection.indexInInside(),
215 localCoefficients.localKey(keyIdx)))
217 const auto dofIdxGlobal = DofHelper::dofIndex(
219 boundaryDofIndices_[dofIdxGlobal] =
true;
225 else if (periodicGridTraits_.isPeriodic(intersection))
229 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
230 for (
int localDofIdx = 0; localDofIdx < localCoefficients.size(); ++localDofIdx)
232 if (!DofHelper::localDofOnIntersection(elementGeometry.type(),
233 intersection.indexInInside(),
234 localCoefficients.localKey(localDofIdx)))
237 const auto dofIdxGlobal = DofHelper::dofIndex(
239 const auto dofPos = DofHelper::dofPosition(elementGeometry, localCoefficients.localKey(localDofIdx));
241 const auto& outside = intersection.outside();
242 const auto outsideGeometry = outside.geometry();
243 const auto& localCoefficientsOut = this->
feCache().get(outsideGeometry.type()).localCoefficients();
244 for (
const auto& isOutside : intersections(this->
gridView(), outside))
246 if (periodicGridTraits_.isPeriodic(isOutside))
248 for (
int localDofIdxOut = 0; localDofIdxOut < localCoefficientsOut.size(); ++localDofIdxOut)
250 const auto& localKeyOut = localCoefficientsOut.localKey(localDofIdxOut);
251 if (!DofHelper::localDofOnIntersection(outsideGeometry.type(),
252 isOutside.indexInInside(),
256 const auto dofIdxGlobalOut = DofHelper::dofIndex(this->
dofMapper(), outside, localKeyOut);
257 const auto dofPosOutside = DofHelper::dofPosition(outsideGeometry, localKeyOut);
258 const auto shift = std::abs((this->
bBoxMax()-this->
bBoxMin())*intersection.centerUnitOuterNormal());
259 if (std::abs((dofPosOutside - dofPos).two_norm() - shift) < eps)
260 periodicDofMap_[dofIdxGlobal] = dofIdxGlobalOut;
271 DUNE_THROW(Dune::NotImplemented,
"Periodic boundaries for FE method for parallel simulations!");
277 std::vector<bool> boundaryDofIndices_;
279 std::unordered_map<GridIndexType, GridIndexType> periodicDofMap_;
Base class for grid geometries.
Implementation of a boundary face related to primary grid elements (dune intersections).
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
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
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
Class for a boundary face related to primary grid elements (dune intersections).
Definition boundaryface.hh:69
Default class for finite element grid discretizations.
Definition fem/fegriddiscretization.hh:42
typename Traits::BoundaryFaceQuadratureRule BoundaryFaceQuadratureRule
the quadrature rule type for boundary faces
Definition fem/fegriddiscretization.hh:78
Experimental::BoundaryFace< GV > BoundaryFace
export the boundary face type
Definition fem/fegriddiscretization.hh:57
typename Traits::ElementQuadratureRule ElementQuadratureRule
the quadrature rule type for elements
Definition fem/fegriddiscretization.hh:74
BasicGridGeometry_t< GV, Traits > BasicGridGeometry
export basic grid geometry type for the alternative constructor
Definition fem/fegriddiscretization.hh:60
typename Traits::template LocalView< ThisType, true > LocalView
export the type of the element discretization (the local view type)
Definition fem/fegriddiscretization.hh:62
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the d.o.f. on the other side of the periodic boundary.
Definition fem/fegriddiscretization.hh:130
void update(const GridView &gridView)
update all geometries (call this after grid adaption)
Definition fem/fegriddiscretization.hh:104
GV GridView
export the grid view type
Definition fem/fegriddiscretization.hh:70
friend LocalView localView(const FEGridDiscretization &gg)
local view of this object (constructed with the internal cache)
Definition fem/fegriddiscretization.hh:138
typename PeriodicGridTraits< typename GV::Grid >::SupportsPeriodicity SupportsPeriodicity
export whether the grid supports periodicity
Definition fem/fegriddiscretization.hh:72
static constexpr DiscretizationMethod discMethod
Definition fem/fegriddiscretization.hh:52
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a d.o.f. is on a periodic boundary.
Definition fem/fegriddiscretization.hh:126
typename Traits::IntersectionQuadratureRule IntersectionQuadratureRule
the quadrature rule type for intersections
Definition fem/fegriddiscretization.hh:76
bool dofOnBoundary(GridIndexType dofIdx) const
If a d.o.f. is on the boundary.
Definition fem/fegriddiscretization.hh:122
FEGridDiscretization(const GridView &gridView)
Constructor.
Definition fem/fegriddiscretization.hh:91
const DofMapper & dofMapper() const
The dof mapper.
Definition fem/fegriddiscretization.hh:96
std::size_t numDofs() const
The total number of degrees of freedom.
Definition fem/fegriddiscretization.hh:100
void update(GridView &&gridView)
update all geometries (call this after grid adaption)
Definition fem/fegriddiscretization.hh:111
FEGridDiscretizationCache Cache
Definition fem/fegriddiscretization.hh:176
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition fem/fegriddiscretization.hh:118
const std::unordered_map< GridIndexType, GridIndexType > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition fem/fegriddiscretization.hh:134
typename Traits::FeCache FeCache
export the finite element cache type
Definition fem/fegriddiscretization.hh:68
FEGridDiscretization(std::shared_ptr< BasicGridGeometry > gg)
Constructor.
Definition fem/fegriddiscretization.hh:81
typename Traits::DiscretizationMethod DiscretizationMethod
export the discretization method this geometry belongs to
Definition fem/fegriddiscretization.hh:51
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition fem/fegriddiscretization.hh:64
static constexpr std::size_t maxNumElementDofs
Definition fem/fegriddiscretization.hh:54
typename Traits::DofMapper DofMapper
export dof mapper type
Definition fem/fegriddiscretization.hh:66
Helper classes to compute the integration elements.
Dune::Std::detected_or_t< Dumux::BasicGridGeometry< GV, typename T::ElementMapper, typename T::VertexMapper >, Detail::SpecifiesBaseGridGeometry, T > BasicGridGeometry_t
Type of the basic grid geometry implementation used as backend.
Definition basegridgeometry.hh:38
BaseGridGeometry(std::shared_ptr< BaseImplementation > impl)
Constructor from a BaseImplementation.
Definition basegridgeometry.hh:72
Definition assembly/assembler.hh:44
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:236
Grid properties related to periodicity.
Quadrature rules over sub-control volumes and sub-control volume faces.
typename GridView::IndexSet::IndexType GridIndex
Definition indextraits.hh:27
unsigned int LocalIndex
Definition indextraits.hh:28
Definition periodicgridtraits.hh:24
Definition periodicgridtraits.hh:23