3#ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
4#define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_TRANSFORMEDINDEXBASIS_HH
9#include <dune/common/std/apply.hh>
10#include <dune/common/hybridutilities.hh>
11#include <dune/common/reservedvector.hh>
12#include <dune/common/typeutilities.hh>
13#include <dune/common/hybridutilities.hh>
15#include <dune/typetree/compositenode.hh>
16#include <dune/typetree/utility.hh>
29namespace Experimental {
50template<
class RPB,
class T>
53 using Transformation = T;
62 using GridView =
typename RawPreBasis::GridView;
68 using Node =
typename RawPreBasis::Node;
79 template<
class RPB_R,
class T_R>
121 return size(Dune::ReservedVector<size_type, multiIndexBufferSize>{});
125 template<
class SizePrefix>
153 template<
class MultiIndex>
159 template<
typename It>
163 for(std::size_t i=0; i<node.size(); ++i)
176template<
class RPB,
class T>
183namespace BasisFactory {
184namespace Experimental {
197template<
class RawPreBasisFactory,
class Transformation>
199 RawPreBasisFactory&& preBasisFactory,
200 Transformation&& transformation)
203 preBasisFactory=std::forward<RawPreBasisFactory>(preBasisFactory),
204 transformation =std::forward<Transformation>(transformation)
205 ](
const auto& gridView) {
230template<
class IndexTransformation,
class SizeImplementation, std::
size_t minIS, std::
size_t maxIS>
238 template<
class IT_R,
class SI_R>
241 sizeImplementation_(std::forward<SI_R>(sizeImplementation))
244 template<
class MultiIndex,
class PreBasis>
247 indexTransformation_(multiIndex, preBasis);
250 template<
class Prefix,
class PreBasis>
251 auto size(
const Prefix& prefix,
const PreBasis& preBasis)
const
253 return sizeImplementation_(prefix, preBasis);
256 template<
class PreBasis>
259 return preBasis.dimension();
263 IndexTransformation indexTransformation_;
264 SizeImplementation sizeImplementation_;
287template<
class IndexTransformation,
class SizeImplementation, std::
size_t minIndexSize, std::
size_t maxIndexSize>
291 std::decay_t<IndexTransformation>,
292 std::decay_t<SizeImplementation>,
293 minIndexSize, maxIndexSize>(
295 std::forward<SizeImplementation>(sizeImplementation));
Definition: polynomial.hh:10
auto transformIndices(RawPreBasisFactory &&preBasisFactory, Transformation &&transformation)
Create a TransformedIndexPreBasisFactory.
Definition: transformedindexbasis.hh:198
auto indexTransformation(IndexTransformation &&indexTransformation, SizeImplementation &&sizeImplementation, Dune::index_constant< minIndexSize >, Dune::index_constant< maxIndexSize >)
A generic implementation of a transformation.
Definition: transformedindexbasis.hh:288
TransformedIndexPreBasis(RPB &&, T &&) -> TransformedIndexPreBasis< std::decay_t< RPB >, std::decay_t< T > >
A pre-basis transforming multi-indices.
Definition: transformedindexbasis.hh:52
It indices(const Node &node, It it) const
Definition: transformedindexbasis.hh:160
Transformation transformation_
Definition: transformedindexbasis.hh:173
void initializeIndices()
Initialize the global indices.
Definition: transformedindexbasis.hh:86
typename RawPreBasis::GridView GridView
The grid view that the FE basis is defined on.
Definition: transformedindexbasis.hh:62
void transformIndex(MultiIndex &multiIndex) const
Definition: transformedindexbasis.hh:154
RawPreBasis rawPreBasis_
Definition: transformedindexbasis.hh:172
typename RawPreBasis::Node Node
Template mapping root tree path to type of created tree node.
Definition: transformedindexbasis.hh:68
TransformedIndexPreBasis(RPB_R &&rawPreBasis, T_R &&transformation)
Constructor for given child pre-basis objects.
Definition: transformedindexbasis.hh:80
RawPreBasis & rawPreBasis()
Definition: transformedindexbasis.hh:148
static constexpr size_type maxMultiIndexSize
Definition: transformedindexbasis.hh:70
void update(const GridView &gv)
Update the stored grid view, to be called if the grid has changed.
Definition: transformedindexbasis.hh:98
Node makeNode() const
Create tree node with given root tree path.
Definition: transformedindexbasis.hh:113
const GridView & gridView() const
Obtain the grid view that the basis is defined on.
Definition: transformedindexbasis.hh:92
size_type size(const SizePrefix &prefix) const
Return number of possible values for next position in multi index.
Definition: transformedindexbasis.hh:126
RPB RawPreBasis
Definition: transformedindexbasis.hh:59
size_type size() const
Same as size(prefix) with empty prefix.
Definition: transformedindexbasis.hh:119
size_type maxNodeSize() const
Get the maximal number of DOFs associated to node for any element.
Definition: transformedindexbasis.hh:138
std::size_t size_type
Type used for indices and size information.
Definition: transformedindexbasis.hh:65
static constexpr size_type multiIndexBufferSize
Definition: transformedindexbasis.hh:72
size_type dimension() const
Get the total dimension of the space spanned by this basis.
Definition: transformedindexbasis.hh:132
const RawPreBasis & rawPreBasis() const
Definition: transformedindexbasis.hh:143
static constexpr size_type minMultiIndexSize
Definition: transformedindexbasis.hh:71
A generic implementation of a transformation.
Definition: transformedindexbasis.hh:232
auto dimension(const PreBasis &preBasis) const
Definition: transformedindexbasis.hh:257
GenericIndexingTransformation(IT_R &&indexTransformation, SI_R &&sizeImplementation)
Definition: transformedindexbasis.hh:239
void transformIndex(MultiIndex &multiIndex, const PreBasis &preBasis) const
Definition: transformedindexbasis.hh:245
static constexpr std::size_t maxIndexSize
Definition: transformedindexbasis.hh:236
static constexpr std::size_t minIndexSize
Definition: transformedindexbasis.hh:235
auto size(const Prefix &prefix, const PreBasis &preBasis) const
Definition: transformedindexbasis.hh:251