5 #ifndef OPENFPM_PDATA_MONOMIALBASIS_H
6 #define OPENFPM_PDATA_MONOMIALBASIS_H
8 #include "Vector/map_vector.hpp"
9 #include <Grid/grid_sm.hpp>
10 #include <Grid/iterators/grid_key_dx_iterator_sub_bc.hpp>
11 #include "Monomial.hpp"
12 #include "Monomial.cuh"
15 template<
unsigned int dim,
typename T = Monomial<dim>,
template<
typename,
template<
typename...>
class...>
class vector_type =
openfpm::vector_std,
template<
typename...>
class... Args>
28 MonomialBasis(
unsigned int degrees[dim],
unsigned int convergenceOrder);
38 __host__ __device__
unsigned int size()
const;
40 __host__ __device__
const T &getElement(
size_t i)
const;
42 __host__ __device__ T &getElement(
size_t i);
44 __host__ __device__
const vector_type<T, Args...> &getElements()
const;
48 __host__ __device__
bool operator==(
const MonomialBasis &other)
const;
50 __host__ __device__
vector_type<T, Args...>& getBasis() {
return basis; }
52 template<
typename charT,
typename traits>
53 friend std::basic_ostream<charT, traits> &
56 lhs <<
"MonomialBasis: size=" << rhs.size() <<
", elements={ ";
57 for (
const auto &el : rhs.getElements())
59 lhs <<
"(" << el <<
") ";
61 lhs <<
"}" << std::endl;
73 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
76 generateBasis(degrees, convergenceOrder);
79 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
83 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
89 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
96 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
102 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
108 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
114 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
119 unsigned int mSum = 0U;
120 for (
size_t i = 0; i < m.size(); ++i) mSum += m.get(i);
122 unsigned int orderLimit = mSum + r;
123 size_t dimensions[dim];
124 std::fill(dimensions, dimensions + dim, orderLimit);
129 long int startV[dim] = {};
134 std::fill(bc, bc + dim, NON_PERIODIC);
139 unsigned char alphaMin =
static_cast<unsigned char>(!(mSum % 2));
149 T candidateBasisElement(p);
151 if (candidateBasisElement.order() < orderLimit && candidateBasisElement.order() >= alphaMin)
153 basis.add(candidateBasisElement);
159 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
165 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
170 for (
size_t i = 0; i < basis.size(); ++i)
173 T d = basis.get(i).getDerivative(differentialOrder);
180 template<
unsigned int dim,
typename T,
template<
typename,
template<
typename...>
class...>
class vector_type,
template<
typename...>
class... Args>
183 return basis == other.basis;
The same as grid_key_dx_iterator_sub_p but with periodic boundary.
Implementation of 1-D std::vector like structure.
KeyT const ValueT ValueT OffsetIteratorT OffsetIteratorT int
[in] The number of segments that comprise the sorting data