5 #ifndef OPENFPM_PDATA_MONOMIALBASIS_H 6 #define OPENFPM_PDATA_MONOMIALBASIS_H 9 #include <Grid/grid_sm.hpp> 10 #include <Grid/iterators/grid_key_dx_iterator_sub_bc.hpp> 11 #include "Monomial.hpp" 13 template<
unsigned int dim>
17 std::vector<Monomial<dim>> basis;
20 MonomialBasis(
const std::vector<unsigned int> °rees,
unsigned int convergenceOrder);
22 MonomialBasis(
unsigned int degrees[dim],
unsigned int convergenceOrder);
32 unsigned int size()
const;
38 const std::vector<Monomial<dim>> &getElements()
const;
44 template<
typename charT,
typename traits>
45 friend std::basic_ostream<charT, traits> &
48 lhs <<
"MonomialBasis: size=" << rhs.size() <<
", elements={ ";
49 for (
const auto &el : rhs.getElements())
51 lhs <<
"(" << el <<
") ";
53 lhs <<
"}" << std::endl;
58 void generateBasis(std::vector<unsigned int> m,
unsigned int r);
63 template<
unsigned int dim>
66 generateBasis(degrees, convergenceOrder);
69 template<
unsigned int dim>
71 :
MonomialBasis(std::vector<unsigned
int>(degrees, degrees + dim), convergenceOrder) {}
73 template<
unsigned int dim>
79 template<
unsigned int dim>
86 template<
unsigned int dim>
92 template<
unsigned int dim>
98 template<
unsigned int dim>
104 template<
unsigned int dim>
109 unsigned int mSum = std::accumulate(m.begin(), m.end(), 0U);
110 unsigned int orderLimit = mSum + r;
111 size_t dimensions[dim];
112 std::fill(dimensions, dimensions + dim, orderLimit);
117 long int startV[dim] = {};
122 std::fill(bc, bc + dim, NON_PERIODIC);
127 unsigned char alphaMin = static_cast<unsigned char>(!(mSum % 2));
136 if (candidateBasisElement.order() < orderLimit && candidateBasisElement.order() >= alphaMin)
138 basis.push_back(candidateBasisElement);
144 template<
unsigned int dim>
150 template<
unsigned int dim>
153 std::vector<Monomial<dim>> derivatives;
154 for (
const auto &monomial : getElements())
156 derivatives.push_back(monomial.getDerivative(differentialOrder));
161 template<
unsigned int dim>
164 return basis == other.basis;
171 #endif //OPENFPM_PDATA_MONOMIALBASIS_H
__device__ __host__ const T & get(unsigned int i) const
Get coordinate.
KeyT const ValueT ValueT OffsetIteratorT OffsetIteratorT int
[in] The number of segments that comprise the sorting data