31 const so3_parameters_t *parameters,
34 switch (parameters->sampling_scheme)
37 case SO3_SAMPLING_MW_SS:
39 return -I * SSHT_PION2;
41 return I * SSHT_PION2;
43 return 2.0 / (1.0 - p*p);
47 SO3_ERROR_GENERIC(
"Invalid sampling scheme.");
117 switch (parameters->sampling_scheme)
119 case SO3_SAMPLING_MW:
121 case SO3_SAMPLING_MW_SS:
124 SO3_ERROR_GENERIC(
"Invalid sampling scheme.");
145 switch (parameters->sampling_scheme)
147 case SO3_SAMPLING_MW:
149 case SO3_SAMPLING_MW_SS:
152 SO3_ERROR_GENERIC(
"Invalid sampling scheme.");
173 switch (parameters->sampling_scheme)
175 case SO3_SAMPLING_MW:
176 return parameters->L;
177 case SO3_SAMPLING_MW_SS:
178 return parameters->L + 1;
180 SO3_ERROR_GENERIC(
"Invalid sampling scheme.");
200 if (parameters->steerable)
227 switch (parameters->sampling_scheme)
229 case SO3_SAMPLING_MW:
230 return 2.0 * a * SO3_PI / (2.0*L - 1.0);
231 case SO3_SAMPLING_MW_SS:
232 return 2.0 * a * SO3_PI / (2.0*L);
234 SO3_ERROR_GENERIC(
"Invalid sampling scheme.");
259 switch (parameters->sampling_scheme)
261 case SO3_SAMPLING_MW:
262 return (2.0*b + 1.0) * SO3_PI / (2.0*L - 1.0);
263 case SO3_SAMPLING_MW_SS:
264 return 2.0 * b * SO3_PI / (2.0*L);
266 SO3_ERROR_GENERIC(
"Invalid sampling scheme.");
291 if (parameters->steerable)
292 return g * SO3_PI / N;
294 return 2.0 * g * SO3_PI / (2.0*N - 1.0);
315 const so3_parameters_t *parameters
320 switch (parameters->storage)
322 case SO3_STORAGE_PADDED:
323 if (parameters->reality)
327 case SO3_STORAGE_COMPACT:
330 if (parameters->reality)
331 return N*(6*L*L-(N-1)*(2*N-1))/6;
333 return (2*N-1)*(3*L*L-N*(N-1))/3;
335 SO3_ERROR_GENERIC(
"Invalid storage method.");
369 int L, N, offset, absn;
375 switch (parameters->storage)
377 case SO3_STORAGE_PADDED:
378 switch (parameters->n_order)
380 case SO3_N_ORDER_ZERO_FIRST:
381 offset = ((n < 0) ? -2*n - 1 : 2*n) * L*L;
382 *ind = offset + el*el + el + m;
384 case SO3_N_ORDER_NEGATIVE_FIRST:
385 offset = (N-1 + n) * L*L;
386 *ind = offset + el*el + el + m;
389 SO3_ERROR_GENERIC(
"Invalid n-order.");
391 case SO3_STORAGE_COMPACT:
392 switch (parameters->n_order)
394 case SO3_N_ORDER_ZERO_FIRST:
397 SO3_ERROR_GENERIC(
"Tried to access component with n > l in compact storage.");
399 offset = (2*absn-1)*(3*L*L - absn*(absn-1))/3;
403 *ind = offset + el*el - n*n + el + m;
405 case SO3_N_ORDER_NEGATIVE_FIRST:
408 SO3_ERROR_GENERIC(
"Tried to access component with n > l in compact storage.");
410 offset = (N-1 + n) * L*L - (2*N - 1)*(N-1)*N/6;
413 offset += absn*(2*absn+1)*(absn+1)/6;
415 offset -= absn*(2*absn-1)*(absn-1)/6;
416 *ind = offset + el*el - n*n + el + m;
419 SO3_ERROR_GENERIC(
"Invalid n-order.");
422 SO3_ERROR_GENERIC(
"Invalid storage method.");
459 switch (parameters->storage)
461 case SO3_STORAGE_PADDED:
462 switch (parameters->n_order)
464 case SO3_N_ORDER_ZERO_FIRST:
475 *m = ind - (*el)*(*el) - *el;
477 case SO3_N_ORDER_NEGATIVE_FIRST:
478 *n = ind/(L*L) - (N-1);
483 *m = ind - (*el)*(*el) - *el;
486 SO3_ERROR_GENERIC(
"Invalid n-order.");
488 case SO3_STORAGE_COMPACT:
489 switch (parameters->n_order)
491 case SO3_N_ORDER_ZERO_FIRST:
496 while(ind + offset >= L*L)
514 *m = ind - (*el)*(*el) - *el;
516 case SO3_N_ORDER_NEGATIVE_FIRST:
521 while(ind + offset >= L*L)
532 *m = ind - (*el)*(*el) - *el;
535 SO3_ERROR_GENERIC(
"Invalid n-order.");
538 SO3_ERROR_GENERIC(
"Invalid storage method.");
572 so3_parameters_t temp_params;
576 temp_params = *parameters;
577 temp_params.n_order = SO3_N_ORDER_NEGATIVE_FIRST;
580 switch(parameters->storage)
582 case SO3_STORAGE_PADDED:
587 case SO3_STORAGE_COMPACT:
593 SO3_ERROR_GENERIC(
"Invalid storage method.");
627 so3_parameters_t temp_params;
631 temp_params = *parameters;
632 temp_params.n_order = SO3_N_ORDER_NEGATIVE_FIRST;
635 switch(parameters->storage)
637 case SO3_STORAGE_PADDED:
641 case SO3_STORAGE_COMPACT:
646 SO3_ERROR_GENERIC(
"Invalid storage method.");