3 #ifndef DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
4 #define DUNE_FUNCTIONS_FUNCTIONSPACEBASES_PERIODICBASIS_HH
12 #include <dune/functions/functionspacebases/concepts.hh>
13 #include <dune/functions/functionspacebases/containerdescriptors.hh>
14 #include <dune/functions/functionspacebases/transformedindexbasis.hh>
17 namespace Dune::Functions {
19 namespace BasisFactory {
25 namespace Experimental {
38 using IndexPairSet = std::set<std::pair<std::size_t,std::size_t>>;
54 indexPairSet_.insert(std::make_pair(a,b));
57 const auto& indexPairSet()
const
63 IndexPairSet indexPairSet_;
73 class PeriodicIndexingTransformation
77 static constexpr std::size_t minIndexSize = 1;
78 static constexpr std::size_t maxIndexSize = 1;
80 template<
class RawPreBasis,
class IndexPairSet>
81 PeriodicIndexingTransformation(
const RawPreBasis& rawPreBasis,
const IndexPairSet& indexPairSet)
83 static_assert(RawPreBasis::maxMultiIndexSize==1,
"PeriodicIndexingTransformation is only implemented for flat multi-indices");
84 std::size_t invalid = {std::numeric_limits<std::size_t>::max()};
85 mappedIdx_.resize(rawPreBasis.size(), invalid);
88 for(
const auto& [a, b] : indexPairSet)
91 if (mappedIdx_[i] == invalid)
92 mappedIdx_[i] = numIndices_++;
93 mappedIdx_[b] = mappedIdx_[a];
95 for(; i<rawPreBasis.size(); ++i)
96 if (mappedIdx_[i] == invalid)
97 mappedIdx_[i] = numIndices_++;
100 template<
class MultiIndex,
class PreBasis>
101 void transformIndex(MultiIndex& multiIndex,
const PreBasis& preBasis)
const
103 multiIndex = {{ mappedIdx_[multiIndex[0]] }};
106 template<
class Prefix,
class PreBasis>
107 std::size_t size(
const Prefix& prefix,
const PreBasis& preBasis)
const
109 if (prefix.size() == 1)
114 template<
class PreBasis>
115 auto dimension(
const PreBasis& preBasis)
const
121 template<
class PreBasis>
122 auto containerDescriptor(
const PreBasis& preBasis)
const
124 return Dune::Functions::containerDescriptor(preBasis);
128 std::vector<std::size_t> mappedIdx_;
129 std::size_t numIndices_;
134 template<
class RawPreBasisIndicator>
135 class PeriodicPreBasisFactory
138 PeriodicPreBasisFactory()
141 template<
class RPBI,
class PIS>
142 PeriodicPreBasisFactory(RPBI&& rawPreBasisIndicator, PIS&& periodicIndexSet) :
143 rawPreBasisIndicator_(std::forward<RPBI>(rawPreBasisIndicator)),
144 periodicIndexSet_(std::forward<PIS>(periodicIndexSet))
147 template<
class GridView,
148 std::enable_if_t<models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(),
int> = 0>
149 auto operator()(
const GridView& gridView)
const
151 const auto& rawPreBasis = rawPreBasisIndicator_.preBasis();
152 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
156 template<
class GridView,
157 std::enable_if_t<models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(),
int> = 0>
158 auto operator()(
const GridView& gridView)
const
160 const auto& rawPreBasis = rawPreBasisIndicator_;
161 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
165 template<
class GridView,
166 std::enable_if_t<not models<Concept::GlobalBasis<GridView>,RawPreBasisIndicator>(),
int> = 0,
167 std::enable_if_t<not models<Concept::PreBasis<GridView>,RawPreBasisIndicator>(),
int> = 0>
168 auto operator()(
const GridView& gridView)
const
170 auto rawPreBasis = rawPreBasisIndicator_(gridView);
171 rawPreBasis.initializeIndices();
172 auto transformation = PeriodicIndexingTransformation(rawPreBasis, periodicIndexSet_.indexPairSet());
177 RawPreBasisIndicator rawPreBasisIndicator_;
178 PeriodicIndexSet periodicIndexSet_;
198 template<
class RawPreBasisIndicator,
class PIS>
200 RawPreBasisIndicator&& rawPreBasisIndicator,
201 PIS&& periodicIndexSet
204 return Impl::PeriodicPreBasisFactory<std::decay_t<RawPreBasisIndicator>>(
205 std::forward<RawPreBasisIndicator>(rawPreBasisIndicator),
206 std::forward<PIS>(periodicIndexSet));
Container storing identified indices for a periodic basis.
Definition: periodicbasis.hh:37
void unifyIndexPair(std::size_t a, std::size_t b)
Insert a pair of indices.
Definition: periodicbasis.hh:48
auto periodic(RawPreBasisIndicator &&rawPreBasisIndicator, PIS &&periodicIndexSet)
Create a pre-basis factory that can create a periodic pre-basis.
Definition: periodicbasis.hh:199