12#ifndef DUMUX_DISCRETIZATION_FE_GRID_DISCRETIZATION_HH
13#define DUMUX_DISCRETIZATION_FE_GRID_DISCRETIZATION_HH
19#include <unordered_map>
21#include <dune/common/reservedvector.hh>
41template<
class GV,
class Traits>
49 static const int dim = GV::dimension;
84 : ParentType(std::move(gd))
85 , dofMapper_(this->
gridView(), Traits::layout())
87 , periodicGridTraits_(this->
gridView().grid())
99 {
return dofMapper_; }
125 {
return boundaryDofIndices_[dofIdx]; }
129 {
return periodicDofMap_.count(dofIdx); }
132 [[deprecated(
"Will be removed after release 3.11. Use periodicallyMappedDofs, returning a range of dofs")]]
134 {
return periodicDofMap_.at(dofIdx)[0]; }
138 {
return std::views::all(periodicDofMap_.at(dofIdx)); }
141 const std::unordered_map<GridIndexType, std::vector<GridIndexType>>&
periodicDofMap()
const
142 {
return periodicDofMap_; }
146 {
return { gd.cache_ }; }
149 class FEGridDiscretizationCache
154 using DofHelper =
typename Traits::DofHelper;
157 : gridDiscretization_(&gd)
161 {
return *gridDiscretization_; }
164 auto boundaryFaces(GridIndexType eIdx)
const -> std::span<const BoundaryFace>
166 if (
auto it = boundaryFaces_.find(eIdx); it != boundaryFaces_.end())
173 { boundaryFaces_.clear(); }
175 std::unordered_map<GridIndexType, Dune::ReservedVector<BoundaryFace, 2*dim>> boundaryFaces_;
177 const FEGridDiscretization* gridDiscretization_;
183 using Cache = FEGridDiscretizationCache;
189 using DofHelper =
typename Cache::DofHelper;
191 dofMapper_.update(this->
gridView());
193 boundaryDofIndices_.assign(
numDofs(),
false);
194 periodicDofMap_.clear();
198 auto elementGeometry =
element.geometry();
199 const auto& localCoefficients = this->
feCache().get(
element.type()).localCoefficients();
202 LocalIndexType numBoundaryFaces = 0;
203 for (
const auto& intersection : intersections(this->
gridView(),
element))
205 if (intersection.boundary() && !periodicGridTraits_.isPeriodic(intersection))
208 const auto isGeometry = intersection.geometry();
212 intersection.centerUnitOuterNormal(),
214 static_cast<LocalIndexType
>(intersection.indexInInside()),
215 typename BoundaryFace::Traits::BoundaryFlag{intersection}
219 for (LocalIndexType keyIdx = 0; keyIdx < localCoefficients.size(); ++keyIdx)
221 if (DofHelper::localDofOnIntersection(elementGeometry.type(),
222 intersection.indexInInside(),
223 localCoefficients.localKey(keyIdx)))
225 const auto dofIdxGlobal = DofHelper::dofIndex(
227 boundaryDofIndices_[dofIdxGlobal] =
true;
233 else if (periodicGridTraits_.isPeriodic(intersection))
237 const auto eps = 1e-7*(elementGeometry.corner(1) - elementGeometry.corner(0)).two_norm();
238 for (
int localDofIdx = 0; localDofIdx < localCoefficients.size(); ++localDofIdx)
240 if (!DofHelper::localDofOnIntersection(elementGeometry.type(),
241 intersection.indexInInside(),
242 localCoefficients.localKey(localDofIdx)))
245 const auto dofIdxGlobal = DofHelper::dofIndex(
247 const auto dofPos = DofHelper::dofPosition(elementGeometry, localCoefficients.localKey(localDofIdx));
249 const auto& outside = intersection.outside();
250 const auto outsideGeometry = outside.geometry();
251 const auto& localCoefficientsOut = this->
feCache().get(outsideGeometry.type()).localCoefficients();
252 for (
const auto& isOutside : intersections(this->
gridView(), outside))
254 if (periodicGridTraits_.isPeriodic(isOutside))
256 for (
int localDofIdxOut = 0; localDofIdxOut < localCoefficientsOut.size(); ++localDofIdxOut)
258 const auto& localKeyOut = localCoefficientsOut.localKey(localDofIdxOut);
259 if (!DofHelper::localDofOnIntersection(outsideGeometry.type(),
260 isOutside.indexInInside(),
264 const auto dofIdxGlobalOut = DofHelper::dofIndex(this->
dofMapper(), outside, localKeyOut);
265 const auto dofPosOutside = DofHelper::dofPosition(outsideGeometry, localKeyOut);
266 const auto shift = std::abs((this->
bBoxMax()-this->
bBoxMin())*intersection.centerUnitOuterNormal());
267 if ((dofPosOutside - dofPos + shift*intersection.centerUnitOuterNormal()).two_norm() < eps)
281 DUNE_THROW(Dune::NotImplemented,
"Periodic boundaries for FE method for parallel simulations!");
287 std::vector<bool> boundaryDofIndices_;
289 std::unordered_map<GridIndexType, std::vector<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:44
typename Traits::BoundaryFaceQuadratureRule BoundaryFaceQuadratureRule
the quadrature rule type for boundary faces
Definition fem/fegriddiscretization.hh:80
Experimental::BoundaryFace< GV > BoundaryFace
export the boundary face type
Definition fem/fegriddiscretization.hh:59
friend LocalView localView(const FEGridDiscretization &gd)
local view of this object (constructed with the internal cache)
Definition fem/fegriddiscretization.hh:145
typename Traits::ElementQuadratureRule ElementQuadratureRule
the quadrature rule type for elements
Definition fem/fegriddiscretization.hh:76
BasicGridGeometry_t< GV, Traits > BasicGridGeometry
export basic grid geometry type for the alternative constructor
Definition fem/fegriddiscretization.hh:62
typename Traits::template LocalView< ThisType, true > LocalView
export the type of the element discretization (the local view type)
Definition fem/fegriddiscretization.hh:64
const std::ranges::range auto periodicallyMappedDofs(GridIndexType dofIdx) const
The indices of the d.o.f.s on the other side of the periodic boundaries.
Definition fem/fegriddiscretization.hh:137
GridIndexType periodicallyMappedDof(GridIndexType dofIdx) const
The index of the d.o.f. on the other side of the periodic boundary.
Definition fem/fegriddiscretization.hh:133
void update(const GridView &gridView)
update all geometries (call this after grid adaption)
Definition fem/fegriddiscretization.hh:106
GV GridView
export the grid view type
Definition fem/fegriddiscretization.hh:72
typename PeriodicGridTraits< typename GV::Grid >::SupportsPeriodicity SupportsPeriodicity
export whether the grid supports periodicity
Definition fem/fegriddiscretization.hh:74
static constexpr DiscretizationMethod discMethod
Definition fem/fegriddiscretization.hh:54
bool dofOnPeriodicBoundary(GridIndexType dofIdx) const
If a d.o.f. is on a periodic boundary.
Definition fem/fegriddiscretization.hh:128
typename Traits::IntersectionQuadratureRule IntersectionQuadratureRule
the quadrature rule type for intersections
Definition fem/fegriddiscretization.hh:78
bool dofOnBoundary(GridIndexType dofIdx) const
If a d.o.f. is on the boundary.
Definition fem/fegriddiscretization.hh:124
FEGridDiscretization(const GridView &gridView)
Constructor.
Definition fem/fegriddiscretization.hh:93
const DofMapper & dofMapper() const
The dof mapper.
Definition fem/fegriddiscretization.hh:98
std::size_t numDofs() const
The total number of degrees of freedom.
Definition fem/fegriddiscretization.hh:102
void update(GridView &&gridView)
update all geometries (call this after grid adaption)
Definition fem/fegriddiscretization.hh:113
const std::unordered_map< GridIndexType, std::vector< GridIndexType > > & periodicDofMap() const
Returns the map between dofs across periodic boundaries.
Definition fem/fegriddiscretization.hh:141
FEGridDiscretizationCache Cache
Definition fem/fegriddiscretization.hh:183
const FeCache & feCache() const
The finite element cache for creating local FE bases.
Definition fem/fegriddiscretization.hh:120
typename Traits::FeCache FeCache
export the finite element cache type
Definition fem/fegriddiscretization.hh:70
typename Traits::DiscretizationMethod DiscretizationMethod
export the discretization method this geometry belongs to
Definition fem/fegriddiscretization.hh:53
Extrusion_t< Traits > Extrusion
export the type of extrusion
Definition fem/fegriddiscretization.hh:66
static constexpr std::size_t maxNumElementDofs
Definition fem/fegriddiscretization.hh:56
typename Traits::DofMapper DofMapper
export dof mapper type
Definition fem/fegriddiscretization.hh:68
FEGridDiscretization(std::shared_ptr< BasicGridGeometry > gd)
Constructor.
Definition fem/fegriddiscretization.hh:83
Helper classes to compute the integration elements.
void closePeriodicDofMap(std::unordered_map< Index, std::vector< Index > > &periodicDofMap)
Map every degree of freedom to all others it is identified with.
Definition periodicdofmap.hh:48
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
void addPeriodicallyMappedDof(std::unordered_map< Index, std::vector< Index > > &periodicDofMap, std::type_identity_t< Index > dofIdx, std::type_identity_t< Index > periodicDofIdx)
Register a degree of freedom as periodically mapped to another one.
Definition periodicdofmap.hh:29
BaseGridGeometry(std::shared_ptr< BaseImplementation > impl)
Constructor from a BaseImplementation.
Definition basegridgeometry.hh:72
decltype(auto) gridDiscretization(const T &t, Args &&... args)
The grid discretization.
Definition griddiscretization.hh:65
Definition assembly/assembler.hh:46
typename Extrusion< T >::type Extrusion_t
Convenience alias for obtaining the extrusion type.
Definition extrusion.hh:257
Helpers for maps between degrees of freedom identified across periodic boundaries.
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