so3  1.3.0
Fast and exact Wigner transforms
Macros | Functions
so3_test_csv.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <complex.h>
#include <time.h>
#include <so3.h>
Include dependency graph for so3_test_csv.c:

Macros

#define NREPEAT   10
 
#define MIN(a, b)   ((a < b) ? (a) : (b))
 
#define MAX(a, b)   ((a > b) ? (a) : (b))
 

Functions

double get_max_error (complex double *expected, complex double *actual, int n)
 
double ran2_dp (int idum)
 
void so3_test_gen_flmn_complex (complex double *flmn, const so3_parameters_t *parameters, int seed)
 
void so3_test_gen_flmn_real (complex double *flmn, const so3_parameters_t *parameters, int seed)
 
int main (int argc, char **argv)
 

Detailed Description

Applies SO3 algorithms to perform inverse and forward Wigner transforms (respectively) to check that the original signal is reconstructed exactly (to numerical precision). Test is performed on a random signal with harmonic coefficients uniformly sampled from (-1,1), once for a real and once for a complex signal. This test is run for multiple values of L and outputs the results in CSV format (to stdout). If no value for N is given in the arguments, each test will run with N = L, otherwise all tests will be run with the given N (and tests with L < N will be skipped). L will take all powers of 2 less or equal than the given Lmax. If L0 is given, all powers of 2 less than or equal to L0 will be skipped (and L0 will be used as the lower band-limit for all transforms).

Usage
so3_test_csv [Lmax [L0 [N]]]
e.g.
so3_test 128 0 4
Defaults: L = 64, L0 = 0, N = L
To save it to a file, just use something like
so3_test_csv 64 7 4 > test.csv
Author
Martin Büttner
Jason McEwen

Macro Definition Documentation

◆ MAX

#define MAX (   a,
 
)    ((a > b) ? (a) : (b))

◆ MIN

#define MIN (   a,
 
)    ((a < b) ? (a) : (b))

◆ NREPEAT

#define NREPEAT   10

Function Documentation

◆ get_max_error()

double get_max_error ( complex double *  expected,
complex double *  actual,
int  n 
)

◆ main()

int main ( int  argc,
char **  argv 
)

◆ ran2_dp()

double ran2_dp ( int  idum)

Generate uniform deviate in range [0,1) given seed. (Using double precision.)

Note
Uniform deviate (Num rec 1992, chap 7.1), original routine said to be 'perfect'.
Parameters
[in]idumSeed.
Return values
ran_dpGenerated uniform deviate.
Author
Martin Büttner
Jason McEwen

◆ so3_test_gen_flmn_complex()

void so3_test_gen_flmn_complex ( complex double *  flmn,
const so3_parameters_t parameters,
int  seed 
)

Generate random Wigner coefficients of a complex signal.

Parameters
[out]flmnRandom spherical harmonic coefficients generated. Provide enough memory for fully padded storage, i.e. (2*N-1)*L*L elements. Unused trailing elements will be set to zero.
[in]parametersA parameters object with (at least) the following fields: L0, L, N, storage, n_mode The reality flag is ignored. Use so3_test_gen_flmn_real instead for real signals.
[in]seedInteger seed required for random number generator.
Return values
none
Author
Martin Büttner
Jason McEwen

◆ so3_test_gen_flmn_real()

void so3_test_gen_flmn_real ( complex double *  flmn,
const so3_parameters_t parameters,
int  seed 
)

Generate random Wigner coefficients of a real signal. We only generate coefficients for n >= 0, and for n = 0, we need flm0* = (-1)^(m)*fl-m0, so that fl00 has to be real.

Parameters
[out]flmnRandom spherical harmonic coefficients generated. Provide enough memory for fully padded, complex (!) storage, i.e. (2*N-1)*L*L elements. Unused trailing elements will be set to zero.
[in]parametersA parameters object with (at least) the following fields: L0, L, N, storage, n_mode The reality flag is ignored. Use so3_test_gen_flmn_complex instead for complex signals.
[in]seedInteger seed required for random number generator.
Return values
none
Author
Martin Büttner
Jason McEwen