27 double SO3_alpha(
const int m1,
const int m2,
const int j)
29 const int M = MAX(ABS(m1),ABS(m2)), mini = MIN(ABS(m1),ABS(m2));
35 if (m1 == 0 && m2 == 0)
40 return IF((m1+m2)%2,K(0.0),K(-0.5));
42 else if (j < M - mini)
43 return IF(j%2,K(0.5),K(-0.5));
45 return K(0.5) * SIGNF((R)m1)*SIGNF((R)m2);
48 SQRT(((R)(j+1))/((R)(j+1-m1)))
49 * SQRT(((R)(2*j+1))/((R)(j+1+m1)))
50 * SQRT(((R)(j+1))/((R)(j+1-m2)))
51 * SQRT(((R)(2*j+1))/((R)(j+1+m2)));
54 double SO3_beta(
const int m1,
const int m2,
const int j)
58 else if (j < MAX(ABS(m1),ABS(m2)))
60 else if (m1 == 0 || m2 == 0)
64 const R m1a = FABS((R)m1), m2a = FABS((R)m2);
66 ((SQRT(m1a)*SQRT(m2a))/((R)j))
67 * SQRT(m1a/((R)(j+1-m1)))
68 * SQRT(((R)(2*j+1))/((R)(j+1+m1)))
69 * SQRT(m2a/((R)(j+1-m2)))
70 * SQRT(((R)(2*j+1))/((R)(j+1+m2))),
71 SIGNF((R)m1)*SIGNF((R)m2));
75 double SO3_gamma(
const int m1,
const int m2,
const int j)
77 if (MAX(ABS(m1),ABS(m2)) < j)
78 return -(((R)(j+1))/((R)j)) * SQRT((((R)(j-m1))/((R)(j+1-m1)))
79 *(((R)(j+m1))/((R)(j+1+m1)))*(((R)(j-m2))/((R)(j+1-m2)))
80 *(((R)(j+m2))/((R)(j+1+m2))));
82 return IF(m1 > m2 || !((m1 + m2) % 2), K(1.0), K(-1.0))
83 * nfft_lambda2((R)ABS(m2 - m1),(R)ABS(m2 + m1));
90 inline void SO3_alpha_row(
double *
alpha,
int N,
int k,
int m)
93 double *alpha_act =
alpha;
94 for (j = -1; j <= N; j++)
95 *alpha_act++ = SO3_alpha(k, m, j);
98 inline void SO3_beta_row(
double *
beta,
int N,
int k,
int m)
101 double *beta_act =
beta;
102 for (j = -1; j <= N; j++)
103 *beta_act++ = SO3_beta(k, m, j);
106 inline void SO3_gamma_row(
double *
gamma,
int N,
int k,
int m)
109 double *gamma_act =
gamma;
110 for (j = -1; j <= N; j++)
111 *gamma_act++ = SO3_gamma(k, m, j);
116 inline void SO3_alpha_matrix(
double *
alpha,
int N,
int m)
119 double *alpha_act =
alpha;
120 for (i = -N; i <= N; i++)
122 for (j = -1; j <= N; j++)
124 *alpha_act = SO3_alpha(i, m, j);
130 inline void SO3_beta_matrix(
double *
alpha,
int N,
int m)
133 double *alpha_act =
alpha;
134 for (i = -N; i <= N; i++)
136 for (j = -1; j <= N; j++)
138 *alpha_act = SO3_beta(i, m, j);
144 inline void SO3_gamma_matrix(
double *
alpha,
int N,
int m)
147 double *alpha_act =
alpha;
148 for (i = -N; i <= N; i++)
150 for (j = -1; j <= N; j++)
152 *alpha_act = SO3_gamma(i, m, j);
160 inline void SO3_alpha_all(
double *
alpha,
int N)
164 double *alpha_act =
alpha;
166 for (m = -N; m <= N; m++)
168 for (i = -N; i <= N; i++)
170 for (j = -1; j <= N; j++)
172 *alpha_act = SO3_alpha(i, m, j);
173 fprintf(stdout,
"alpha_all_%d^[%d,%d]=%f\n", j, i, m,
183 inline void SO3_beta_all(
double *
alpha,
int N)
186 double *alpha_act =
alpha;
187 for (m = -N; m <= N; m++)
189 for (i = -N; i <= N; i++)
191 for (j = -1; j <= N; j++)
193 *alpha_act = SO3_beta(i, m, j);
200 inline void SO3_gamma_all(
double *
alpha,
int N)
203 double *alpha_act =
alpha;
204 for (m = -N; m <= N; m++)
206 for (i = -N; i <= N; i++)
208 for (j = -1; j <= N; j++)
210 *alpha_act = SO3_gamma(i, m, j);
217 inline void eval_wigner(
double *x,
double *y,
int size,
int k,
double *
alpha,
224 double a, b, x_val_act, a_old;
225 double *x_act, *y_act;
226 double *alpha_act, *beta_act, *gamma_act;
231 for (i = 0; i < size; i++)
243 alpha_act = &(alpha[k]);
244 beta_act = &(beta[k]);
245 gamma_act = &(gamma[k]);
246 for (j = k; j > 1; j--)
249 a = b + a_old * ((*alpha_act) * x_val_act + (*beta_act));
250 b = a_old * (*gamma_act);
255 *y_act = (a * ((*alpha_act) * x_val_act + (*beta_act)) + b);
262 inline int eval_wigner_thresh(
double *x,
double *y,
int size,
int k,
267 double a, b, x_val_act, a_old;
268 double *x_act, *y_act;
269 double *alpha_act, *beta_act, *gamma_act;
274 for (i = 0; i < size; i++)
286 alpha_act = &(alpha[k]);
287 beta_act = &(beta[k]);
288 gamma_act = &(gamma[k]);
289 for (j = k; j > 1; j--)
292 a = b + a_old * ((*alpha_act) * x_val_act + (*beta_act));
293 b = a_old * (*gamma_act);
298 *y_act = (a * ((*alpha_act) * x_val_act + (*beta_act)) + b);
319 double wigner_start(
int m1,
int m2,
double theta)
323 int cosPower, sinPower;
325 double dl, dm1, dm2, normFactor, sinSign;
330 max = (double) (ABS(m1) > ABS(m2) ? ABS(m1) : ABS(m2));
331 min = (double) (ABS(m1) < ABS(m2) ? ABS(m1) : ABS(m2));
344 for (i = 0; i < delta; i++)
345 normFactor *= SQRT((2. * dl - ((
double) i)) / (((double) i) + 1.));
349 normFactor *= SQRT((2. * dl + 1.) / 2.);
377 dCP = (double) cosPower;
378 dSP = (double) sinPower;
380 return normFactor * sinSign * POW(sin(theta / 2), dSP) * POW(cos(theta / 2),