20#include <Kokkos_Macros.hpp>
29 hermite_poly_coeffs(
const unsigned int regularity,
const unsigned int index)
33 const unsigned int curr_index =
index % (regularity + 1);
34 const unsigned int side = (
index > regularity) ? 1 : 0;
37 const int loop_control_1 =
static_cast<int>(regularity + 1 - curr_index);
38 const int loop_control_2 = (side == 1) ?
39 static_cast<int>(curr_index + 1) :
40 static_cast<int>(regularity + 2);
42 std::vector<double> poly_coeffs(2 * regularity + 2, 0.0);
46 int binomial_1 = (curr_index % 2) ? -1 : 1;
48 for (
int i = 0; i < loop_control_2; ++i)
52 for (
int j = 0; j < loop_control_1; ++j)
56 for (
int k = 0; k < j + 1; ++k)
58 poly_coeffs[regularity + i + k + 1] +=
59 binomial_1 * inv_binomial * binomial_2;
63 inv_binomial *= regularity + j + 1;
64 inv_binomial /= j + 1;
67 binomial_1 *= -
static_cast<int>(curr_index - i);
75 for (
int i = 0; i < loop_control_2; ++i)
79 for (
int j = 0; j < loop_control_1; ++j)
81 poly_coeffs[curr_index + i + j] += binomial * inv_binomial;
82 inv_binomial *= regularity + j + 1;
83 inv_binomial /= j + 1;
86 binomial *= -
static_cast<int>(regularity + 1 - i);
94 for (
auto &it : poly_coeffs)
104 const unsigned int index)
105 :
Polynomial<double>(hermite_poly_coeffs(regularity, index))
106 , degree(2 * regularity + 1)
107 , regularity(regularity)
108 , side_index(index % (regularity + 1))
109 , side((index >= regularity + 1) ? 1 : 0)
116 std::vector<Polynomial<double>>
119 std::vector<Polynomial<double>> polys;
123 for (
unsigned int i = 0; i < sz; ++i)
static std::vector< Polynomial< double > > generate_complete_basis(const unsigned int regularity)
PolynomialsHermite(const unsigned int regularity, const unsigned int index)
#define DEAL_II_NAMESPACE_OPEN
#define DEAL_II_NAMESPACE_CLOSE
#define AssertIndexRange(index, range)
constexpr T pow(const T base, const int iexp)