32 return (degree == 0) ? 1.0 : 0.0;
50 if (std::abs(argument) <
static_cast<Real>(degree) + 1.0) {
51 Real argument_to_degree_power = (degree == 0) ? 1.0 : std::pow(argument, degree);
52 double double_factorial_value = 1.0;
53 for (
int index = 2 * degree + 1; index >= 1; index -= 2) {
54 double_factorial_value *= index;
56 Real half_argument_squared = 0.5 * argument * argument;
59 for (
int index = 1; index <= 60; index++) {
60 term *= -half_argument_squared / (index * (2.0 * degree + 2.0 * index + 1.0));
62 if (std::abs(term) < 1e-18 * std::abs(sum))
65 return (argument_to_degree_power / double_factorial_value) * sum;
69 return std::sin(argument) / argument;
71 return (std::sin(argument) / argument - std::cos(argument)) / argument;
73 return ((3.0 / (argument * argument) - 1.0) * std::sin(argument) -
74 3.0 * std::cos(argument) / argument) /
77 Real bessel_minus_one = std::sin(argument) / argument;
78 Real bessel_current = (std::sin(argument) / argument - std::cos(argument)) / argument;
79 for (
int index = 2; index <= degree; index++) {
80 Real bessel_plus_one =
81 ((2 * index - 1) * bessel_current / argument) - bessel_minus_one;
82 bessel_minus_one = bessel_current;
83 bessel_current = bessel_plus_one;
85 return bessel_current;
106 int degree,
Real q_value,
const Real* radial_grid,
int mesh_size,
Real* result) {
108 Real value = (degree == 0) ? 1.0 : 0.0;
109 for (
int index = 0; index < mesh_size; index++) {
110 result[index] = value;
124 for (
int index = 0; index < mesh_size; index++) {
125 Real argument = q_value * radial_grid[index];
126 if (std::abs(argument) < 1.0) {
129 result[index] = std::sin(argument) / argument;
135 for (
int index = 0; index < mesh_size; index++) {
136 Real argument = q_value * radial_grid[index];
137 if (std::abs(argument) < 1.0) {
140 result[index] = (std::sin(argument) / argument - std::cos(argument)) / argument;
146 for (
int index = 0; index < mesh_size; index++) {
147 Real argument = q_value * radial_grid[index];
153 if (std::abs(argument) < 1.0) {
156 result[index] = ((3.0 / (argument * argument) - 1.0) * std::sin(argument) -
157 3.0 * std::cos(argument) / argument) /
165 for (
int index = 0; index < mesh_size; index++) {
166 Real argument = q_value * radial_grid[index];
174 if (std::abs(argument) <
static_cast<Real>(degree) + 1.0) {
177 Real bessel_minus_one = std::sin(argument) / argument;
178 Real bessel_current =
179 (std::sin(argument) / argument - std::cos(argument)) / argument;
180 for (
int recurrence_index = 2; recurrence_index <= degree; recurrence_index++) {
181 Real bessel_plus_one =
182 ((2 * recurrence_index - 1) * bessel_current / argument) -
184 bessel_minus_one = bessel_current;
185 bessel_current = bessel_plus_one;
187 result[index] = bessel_current;