5 #ifndef OPENFPM_PDATA_VANDERMONDE_HPP
6 #define OPENFPM_PDATA_VANDERMONDE_HPP
8 #include "MonomialBasis.hpp"
9 #include "VandermondeRowBuilder.hpp"
11 template<
unsigned int dim,
typename T,
typename MatrixType>
18 T eps,HOverEpsilon,minSpacing;
21 template<
typename verletIterator_type,
typename vector_type,
typename vector_type2>
24 verletIterator_type &it,
29 monomialBasis(monomialBasis),
30 HOverEpsilon(HOverEpsilon)
32 initialize(p, it, particlesSupport, particlesDomain);
36 MatrixType &getMatrix(MatrixType &V)
42 size_t N = x_pqVec.
size();
43 for (
unsigned int row = 0; row < N; ++row)
45 const auto& x_pq = x_pqVec.get(row);
46 vrb.buildRow(V, row, x_pq / eps);
63 void computeEps(T factor)
65 T avgNeighbourSpacing = 0;
66 minSpacing=std::numeric_limits<T>::max();
67 size_t N = x_pqVec.
size();
68 for (
size_t i = 0; i < N; ++i)
70 const auto& x_pq = x_pqVec.get(i);
72 avgNeighbourSpacing += computeAbsSum(x_pq);
78 avgNeighbourSpacing /= x_pqVec.
size();
79 eps = avgNeighbourSpacing/factor;
86 for (
unsigned int i = 0; i < dim; ++i)
88 absSum += fabs(x.value(i));
93 template<
typename verletIterator_type,
typename vector_type,
typename vector_type2>
94 void initialize(
size_t p, verletIterator_type &it,
const vector_type & particlesSupport,
vector_type2 &particlesDomain)
101 xp -= particlesSupport.
getPos(q);
109 if (x_pqVec.
size() < monomialBasis.size())
111 ACTION_ON_ERROR(std::length_error(
"Not enough neighbour points passed for Vandermonde matrix construction!"));
115 computeEps(HOverEpsilon);
This class implement the point shape in an N-dimensional space.
Implementation of 1-D std::vector like structure.
auto getPos(size_t vec_key) -> decltype(vd.getPos(vec_key))
Get the position of an element.
auto getPos(vect_dist_key_dx vec_key) -> decltype(vPos.template get< 0 >(vec_key.getKey()))
Get the position of an element.