7#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
8#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_RAVIARTTHOMASBASIS_HH
11#include <dune/common/exceptions.hh>
13#include <dune/grid/common/capabilities.hh>
14#include <dune/grid/common/mcmgmapper.hh>
16#include <dune/localfunctions/common/localfiniteelementvariant.hh>
17#include <dune/localfunctions/raviartthomas.hh>
18#include <dune/localfunctions/raviartthomas/raviartthomas0cube2d.hh>
19#include <dune/localfunctions/raviartthomas/raviartthomas0cube3d.hh>
20#include <dune/localfunctions/raviartthomas/raviartthomas02d.hh>
21#include <dune/localfunctions/raviartthomas/raviartthomas03d.hh>
22#include <dune/localfunctions/raviartthomas/raviartthomas1cube2d.hh>
23#include <dune/localfunctions/raviartthomas/raviartthomas1cube3d.hh>
24#include <dune/localfunctions/raviartthomas/raviartthomas12d.hh>
25#include <dune/localfunctions/raviartthomas/raviartthomas2cube2d.hh>
37 template<
int dim,
typename D,
typename R, std::
size_t k>
38 struct RaviartThomasSimplexLocalInfo
41 using FiniteElement =
void*;
44 template<
typename D,
typename R>
45 struct RaviartThomasSimplexLocalInfo<2,D,R,0>
47 using FiniteElement = RT02DLocalFiniteElement<D,R>;
50 template<
typename D,
typename R>
51 struct RaviartThomasSimplexLocalInfo<2,D,R,1>
53 using FiniteElement = RT12DLocalFiniteElement<D,R>;
56 template<
typename D,
typename R>
57 struct RaviartThomasSimplexLocalInfo<3,D,R,0>
59 using FiniteElement = RT03DLocalFiniteElement<D,R>;
62 template<
int dim,
typename D,
typename R, std::
size_t k>
63 struct RaviartThomasCubeLocalInfo
66 using FiniteElement =
void*;
69 template<
typename D,
typename R>
70 struct RaviartThomasCubeLocalInfo<2,D,R,0>
72 using FiniteElement = RT0Cube2DLocalFiniteElement<D,R>;
75 template<
typename D,
typename R>
76 struct RaviartThomasCubeLocalInfo<2,D,R,1>
78 using FiniteElement = RT1Cube2DLocalFiniteElement<D,R>;
81 template<
typename D,
typename R>
82 struct RaviartThomasCubeLocalInfo<2,D,R,2>
84 using FiniteElement = RT2Cube2DLocalFiniteElement<D,R>;
87 template<
typename D,
typename R>
88 struct RaviartThomasCubeLocalInfo<3,D,R,0>
90 using FiniteElement = RT0Cube3DLocalFiniteElement<D,R>;
93 template<
typename D,
typename R>
94 struct RaviartThomasCubeLocalInfo<3,D,R,1>
96 using FiniteElement = RT1Cube3DLocalFiniteElement<D,R>;
99 template<
int dim,
typename D,
typename R, std::
size_t k>
100 struct RaviartThomasPyramidLocalInfo
103 using FiniteElement =
void*;
106 template<
typename D,
typename R>
107 struct RaviartThomasPyramidLocalInfo<3,D,R,0>
109 using FiniteElement = RT0PyramidLocalFiniteElement<D,R>;
112 template<
int dim,
typename D,
typename R, std::
size_t k>
113 struct RaviartThomasPrismLocalInfo
116 using FiniteElement =
void*;
119 template<
typename D,
typename R>
120 struct RaviartThomasPrismLocalInfo<3,D,R,0>
122 using FiniteElement = RT0PrismLocalFiniteElement<D,R>;
125 template<
typename GV,
int dim,
typename R, std::
size_t k>
126 class RaviartThomasLocalFiniteElementMap
128 using D =
typename GV::ctype;
129 constexpr static bool hasFixedElementType = Capabilities::hasSingleGeometryType<typename GV::Grid>::v;
131 using CubeFiniteElement =
typename RaviartThomasCubeLocalInfo<dim, D, R, k>::FiniteElement;
132 using SimplexFiniteElement =
typename RaviartThomasSimplexLocalInfo<dim, D, R, k>::FiniteElement;
133 using PyramidFiniteElement =
typename RaviartThomasPyramidLocalInfo<dim, D, R, k>::FiniteElement;
134 using PrismFiniteElement =
typename RaviartThomasPrismLocalInfo<dim, D, R, k>::FiniteElement;
138 using T = LocalBasisTraits<D, dim, FieldVector<D,dim>, R, dim, FieldVector<R,dim>, FieldMatrix<D,dim,dim> >;
140 constexpr static unsigned int topologyId = Capabilities::hasSingleGeometryType<typename GV::Grid>::topologyId;
141 constexpr static GeometryType type = GeometryType(topologyId, GV::dimension);
143 using FiniteElement = std::conditional_t<hasFixedElementType,
144 std::conditional_t<type.isCube(), CubeFiniteElement, SimplexFiniteElement>,
145 std::conditional_t<dim == 3,
146 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement, PyramidFiniteElement, PrismFiniteElement>,
147 LocalFiniteElementVariant<CubeFiniteElement, SimplexFiniteElement> > >;
151 static std::size_t numVariants(GeometryType type)
153 auto numFacets = referenceElement<D,dim>(type).size(1);
154 return power(2,numFacets);
157 RaviartThomasLocalFiniteElementMap(
const GV& gv)
158 : elementMapper_(gv, mcmgElementLayout())
163 void update (
const GV& gv)
165 elementMapper_.update(gv);
166 if constexpr (hasFixedElementType)
168 variants_.resize(numVariants(type));
169 for (
size_t i = 0; i < numVariants(type); i++)
170 variants_[i] = FiniteElement(i);
175 size_t numVariantsSimplex = numVariants(GeometryTypes::simplex(dim));
176 size_t numVariantsCube = numVariants(GeometryTypes::cube(dim));
178 variants_.resize(numVariantsSimplex + numVariantsCube);
179 for (
size_t i = 0; i < numVariantsSimplex; i++)
180 variants_[i] = SimplexFiniteElement(i);
181 for (
size_t i = 0; i < numVariantsCube; i++)
182 variants_[i + numVariantsSimplex] = CubeFiniteElement(i);
183 if constexpr (dim == 3)
185 size_t numVariantsPyramid = numVariants(GeometryTypes::pyramid);
186 size_t numVariantsPrism = numVariants(GeometryTypes::prism);
188 variants_.resize(numVariantsSimplex + numVariantsCube + numVariantsPyramid + numVariantsPrism );
190 for (
size_t i = 0; i < numVariantsPyramid; i++)
191 variants_[i + numVariantsSimplex + numVariantsCube] = PyramidFiniteElement(i);
192 for (
size_t i = 0; i < numVariantsPrism; i++)
193 variants_[i + numVariantsSimplex + numVariantsCube + numVariantsPyramid] = PrismFiniteElement(i);
197 orient_.resize(gv.size(0));
198 for(
const auto& cell :
elements(gv))
200 unsigned int myId = elementMapper_.index(cell);
205 if (intersection.neighbor() && (gv.contains(intersection.outside())) && (elementMapper_.index(intersection.outside()) > myId))
206 orient_[myId] |= (1 << intersection.indexInInside());
210 if constexpr (!hasFixedElementType)
212 size_t numVariantsSimplex = numVariants(GeometryTypes::simplex(dim));
213 size_t numVariantsCube = numVariants(GeometryTypes::cube(dim));
215 if (cell.type().isCube())
216 orient_[myId] += numVariantsSimplex;
217 if constexpr (dim == 3)
219 size_t numVariantsPyramid = numVariants(GeometryTypes::pyramid);
221 if (cell.type().isPyramid())
222 orient_[myId] += numVariantsSimplex + numVariantsCube;
223 if (cell.type().isPrism())
224 orient_[myId] += numVariantsSimplex + numVariantsCube + numVariantsPyramid;
230 template<
class EntityType>
231 const FiniteElement& find(
const EntityType& e)
const
233 return variants_[orient_[elementMapper_.index(e)]];
237 std::vector<FiniteElement> variants_;
238 Dune::MultipleCodimMultipleGeomTypeMapper<GV> elementMapper_;
239 std::vector<unsigned char> orient_;
257template<
typename GV,
int k>
260template<
typename GV,
int k>
267 static MCMGLayout dofLayout()
269 return [](GeometryType gt,
size_t gridDim) ->
size_t {
270 if ((gt.isPyramid()) and (k==0))
272 if (gt.dim() == gridDim)
273 return gt.isCube() ? ((dim == 2) ? k*(k+1)*dim : k*(k+1)*(k+1)*dim) : k*dim;
274 if (gt.dim() == gridDim-1)
275 return gt.isCube() ? (dim-2)*2*k+k+1 : (dim-1)*k+1 ;
280 static const int dim = GV::dimension;
281 using FiniteElementMap =
typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
293 Base(gv, dofLayout()),
297 if (gv.indexSet().types(0).size() > 1 and k>0)
298 DUNE_THROW(Dune::NotImplemented,
"Raviart-Thomas basis with index k>0 is only implemented for grids with a single element type");
300 for(
auto type : gv.indexSet().types(0))
301 if (!type.isSimplex() && !type.isCube() && !type.isPyramid() && !type.isPrism())
302 DUNE_THROW(Dune::NotImplemented,
"Raviart-Thomas elements are only implemented for grids with simplex, cube, pyramid or prism elements.");
326template<
typename GV,
int k>
330 static const int dim = GV::dimension;
335 using Element =
typename GV::template Codim<0>::Entity;
336 using FiniteElementMap =
typename Impl::RaviartThomasLocalFiniteElementMap<GV, dim, double, k>;
337 using FiniteElement = Impl::GlobalValuedLocalFiniteElement<Impl::ContravariantPiolaTransformator,
338 typename FiniteElementMap::FiniteElement,
385template<std::
size_t k>
388 return [](
const auto& gridView) {
408template<
typename GV,
int k>
auto raviartThomas()
Create a pre-basis factory that can create a Raviart-Thomas pre-basis.
Definition raviartthomasbasis.hh:386
auto power(ChildPreBasisFactory &&childPreBasisFactory, std::size_t k, const IndexMergingStrategy &)
Create a pre-basis factory that can build a PowerPreBasis.
Definition dynamicpowerbasis.hh:410
auto elements(const SubDomainGridView< HostGridView > &subDomainGridView)
ADL findable access to element range for a SubDomainGridView.
Definition subdomain.hh:487
auto intersections(const SubDomainGridView< HostGridView > &subDomainGridView, const Element &element)
ADL findable access to intersection range for an element of a SubDomainGridView.
Definition subdomain.hh:510
Definition monomialset.hh:19
Definition monomialset.hh:19
DefaultGlobalBasis< RaviartThomasPreBasis< GV, k > > RaviartThomasBasis
Basis of a k-th-order Raviart Thomas finite element space.
Definition raviartthomasbasis.hh:409
Definition argyrisbasis.hh:926
Global basis for given pre-basis.
Definition defaultglobalbasis.hh:53
void update(const GridView &gv)
Update the stored GridView.
Definition leafprebasismappermixin.hh:101
LeafPreBasisMapperMixin(const GridView &gv, Dune::MCMGLayout layout)
Construct from GridView and local DOF layout.
Definition leafprebasismappermixin.hh:74
void setSize(const size_type size)
Definition nodes.hh:197
Definition raviartthomasbasis.hh:329
typename Impl::RaviartThomasLocalFiniteElementMap< GV, dim, double, k > FiniteElementMap
Definition raviartthomasbasis.hh:336
void bind(const Element &e)
Bind to element.
Definition raviartthomasbasis.hh:362
typename GV::template Codim< 0 >::Entity Element
Definition raviartthomasbasis.hh:335
const Element * element_
Definition raviartthomasbasis.hh:372
const FiniteElement & finiteElement() const
Return the LocalFiniteElement for the element we are bound to.
Definition raviartthomasbasis.hh:356
std::size_t size_type
Definition raviartthomasbasis.hh:334
Impl::GlobalValuedLocalFiniteElement< Impl::ContravariantPiolaTransformator, typename FiniteElementMap::FiniteElement, Element > FiniteElement
Definition raviartthomasbasis.hh:337
RaviartThomasNode(const FiniteElementMap *finiteElementMap)
Definition raviartthomasbasis.hh:341
const Element & element() const
Return current element, throw if unbound.
Definition raviartthomasbasis.hh:347
FiniteElement finiteElement_
Definition raviartthomasbasis.hh:371
const FiniteElementMap * finiteElementMap_
Definition raviartthomasbasis.hh:373
Definition raviartthomasbasis.hh:263
Node makeNode() const
Create tree node.
Definition raviartthomasbasis.hh:315
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition raviartthomasbasis.hh:306
RaviartThomasPreBasis(const GridView &gv)
Constructor for a given grid view object.
Definition raviartthomasbasis.hh:292
std::size_t size_type
Definition raviartthomasbasis.hh:287
FiniteElementMap finiteElementMap_
Definition raviartthomasbasis.hh:321
RaviartThomasNode< GV, k > Node
Definition raviartthomasbasis.hh:289
GV GridView
The grid view that the FE space is defined on.
Definition raviartthomasbasis.hh:286