30#define M_PI 3.1415926535897932384626433
34#define M_SQRT1_2 0.70710678118654752440
80 int ncart = (L + 1) * (L + 2) / 2;
86 coef_table->
coeffs = (
double *)calloc((2 * L + 1) * ncart,
sizeof(double));
88 for (
int m = -L; m <= L; m++) {
89 for (
int icomb = 0; icomb < ncart; icomb++) {
94 int index = (m + L) * ncart + icomb;
95 coef_table->
coeffs[index] = u_lm_lx_ly_lz;
107 printf(
"get_real_spherical_harmonic_table(): %d > Lmax\n", L);
125 int j = lx + ly - abs(m);
131 if (!((m > 0 && (abs(m) - lx) % 2 == 0) || (m == 0 && lx % 2 == 0) ||
132 (m < 0 && (abs(m) - lx) % 2 != 0))) {
141 double u_lm_lx_ly_lz = 0.0;
142 for (
int i = j;
i <= (l - abs(m)) / 2;
i++) {
144 if (2 * l - 2 *
i < 0) {
148 if (l - abs(m) - 2 *
i < 0) {
158 for (
int k = 0; k <= j; k++) {
160 pow(-1, (abs(m) - lx + 2 * k) / 2);
163 u_lm_lx_ly_lz += factor_1 * sum;
166 u_lm_lx_ly_lz *= prefactor;
167 if (m == 0 && (lx % 2 == 0)) {
171 return u_lm_lx_ly_lz;
183 double kx_powers[200];
184 double ky_powers[200];
185 double kz_powers[200];
189 double length_k = sqrt(k[0] * k[0] + k[1] * k[1] + k[2] * k[2]);
192 unitary_kx = k[0] / length_k;
193 unitary_ky = k[1] / length_k;
194 unitary_kz = k[2] / length_k;
205 for (
int i = 1;
i <= l;
i++) {
206 kx_powers[
i] = kx_powers[
i - 1] * unitary_kx;
207 ky_powers[
i] = ky_powers[
i - 1] * unitary_ky;
208 kz_powers[
i] = kz_powers[
i - 1] * unitary_kz;
214 for (
int icomb = 0; icomb < ncart; icomb++) {
218 double y_lm_rst = rsh_coef_l->
coeffs[(m + l) * ncart + icomb];
220 value += y_lm_rst * kx_powers[r] * ky_powers[s] * kz_powers[t];
236 double kx_powers[200];
237 double ky_powers[200];
238 double kz_powers[200];
242 double length_k = sqrt(k[0] * k[0] + k[1] * k[1] + k[2] * k[2]);
245 double inv_length = 1.0 / length_k;
246 unitary_kx = k[0] * inv_length;
247 unitary_ky = k[1] * inv_length;
248 unitary_kz = k[2] * inv_length;
259 for (
int i = 1;
i <= l;
i++) {
260 kx_powers[
i] = kx_powers[
i - 1] * unitary_kx;
261 ky_powers[
i] = ky_powers[
i - 1] * unitary_ky;
262 kz_powers[
i] = kz_powers[
i - 1] * unitary_kz;
265 memset(rsh_array, 0, (2 * l + 1) *
sizeof(
double));
270 for (
int icomb = 0; icomb < ncart; icomb++) {
271 int r = rst_array[3 * icomb];
272 int s = rst_array[3 * icomb + 1];
273 int t = rst_array[3 * icomb + 2];
275 double k_xyz = kx_powers[r] * ky_powers[s] * kz_powers[t];
277 for (
int m = -l; m <= l; m++) {
278 double y_lm_rst = rsh_coef_l->
coeffs[(m + l) * ncart + icomb];
279 rsh_array[m + l] += y_lm_rst * k_xyz;
285 *num = (L + 1) * (L + 2) / 2;
287 int *combinations = (
int *)calloc(*num, 3 *
sizeof(
int));
290 for (
int i = 0;
i <= L;
i++) {
291 for (
int j = 0; j <= L; j++) {
292 for (
int k = 0; k <= L; k++) {
293 if (
i + j + k == L) {
294 combinations[3 * n + 0] =
i;
295 combinations[3 * n + 1] = j;
296 combinations[3 * n + 2] = k;
static void const int const int i
uint64_t libgrpp_binomial(uint64_t n, uint64_t k)
double libgrpp_factorial(int n)
double libgrpp_factorial_ratio(int n, int m)
rsh_coef_table_t * libgrpp_get_real_spherical_harmonic_table(int L)
void libgrpp_evaluate_real_spherical_harmonics_array(const int l, const double *k, double *rsh_array)
rsh_coef_table_t * libgrpp_tabulate_real_spherical_harmonic_coeffs(int L)
static int * generate_cartesian_combinations(int L, int *num)
static rsh_coef_table_t ** rsh_coef_tables
void libgrpp_create_real_spherical_harmonic_coeffs_tables(int Lmax)
double libgrpp_spherical_to_cartesian_coef(int l, int m, int lx, int ly)
static int rsh_tables_lmax
double libgrpp_evaluate_real_spherical_harmonic(const int l, const int m, const double *k)
#define LIBGRPP_ZERO_THRESH