28 #define MAX(a, b) ((a) > (b) ? (a) : (b))
48 for(
int i = 0; i < n; ++i){
if(cabs(X[i]) != 0.0){ Y = 1; i = n; } }
64 for(
int i = 0; i < n; ++i){
if(X[i] != X[i]){ Y = 0; i = n; } }
68 int main(
int argc,
char* argv[])
71 complex
double *flm_orig, *flm_syn;
72 complex
double *f_mw, *f_mw_ss, *f_gl, *f_dh;
73 double *f_mw_real, *f_mw_ss_real, *f_gl_real, *f_dh_real;
74 complex
double *f_mw_lb, *f_mw_lb_ss;
75 double *f_mw_lb_real, *f_mw_lb_ss_real;
77 complex
double *f_mw_pole, *f_mw_ss_pole;
78 complex
double f_mw_sp, f_mw_ss_np, f_mw_ss_sp;
79 double *f_mw_real_pole, *f_mw_ss_real_pole;
80 double f_mw_real_sp, f_mw_ss_real_sp, f_mw_ss_real_np, phi_sp, phi_np;
92 clock_t time_start, time_end;
97 double errors_mw_lb_ss[
NREPEAT];
98 double errors_mw_ss_pole[
NREPEAT];
101 double errors_mw_real[
NREPEAT];
102 double errors_mw_lb_real[
NREPEAT];
103 double errors_mw_real_pole[
NREPEAT];
104 double errors_mw_ss_real[
NREPEAT];
105 double errors_mw_lb_ss_real[
NREPEAT];
106 double errors_mw_ss_real_pole[
NREPEAT];
107 double errors_gl_real[
NREPEAT];
108 double errors_dh_real[
NREPEAT];
109 double durations_forward_mw[
NREPEAT];
110 double durations_inverse_mw[
NREPEAT];
111 double durations_forward_mw_lb[
NREPEAT];
112 double durations_inverse_mw_lb[
NREPEAT];
113 double durations_forward_mw_pole[
NREPEAT];
114 double durations_inverse_mw_pole[
NREPEAT];
115 double durations_forward_mw_ss[
NREPEAT];
116 double durations_inverse_mw_ss[
NREPEAT];
117 double durations_forward_mw_lb_ss[
NREPEAT];
118 double durations_inverse_mw_lb_ss[
NREPEAT];
119 double durations_forward_mw_ss_pole[
NREPEAT];
120 double durations_inverse_mw_ss_pole[
NREPEAT];
121 double durations_forward_gl[
NREPEAT];
122 double durations_inverse_gl[
NREPEAT];
123 double durations_forward_dh[
NREPEAT];
124 double durations_inverse_dh[
NREPEAT];
125 double durations_forward_mw_real[
NREPEAT];
126 double durations_inverse_mw_real[
NREPEAT];
127 double durations_forward_mw_lb_real[
NREPEAT];
128 double durations_inverse_mw_lb_real[
NREPEAT];
129 double durations_forward_mw_real_pole[
NREPEAT];
130 double durations_inverse_mw_real_pole[
NREPEAT];
131 double durations_forward_mw_ss_real[
NREPEAT];
132 double durations_inverse_mw_ss_real[
NREPEAT];
133 double durations_forward_mw_lb_ss_real[
NREPEAT];
134 double durations_inverse_mw_lb_ss_real[
NREPEAT];
135 double durations_forward_mw_ss_real_pole[
NREPEAT];
136 double durations_inverse_mw_ss_real_pole[
NREPEAT];
137 double durations_forward_gl_real[
NREPEAT];
138 double durations_inverse_gl_real[
NREPEAT];
139 double durations_forward_dh_real[
NREPEAT];
140 double durations_inverse_dh_real[
NREPEAT];
154 printf(
"Choosing default L = 128\n");
157 spin = atoi(argv[2]);
160 printf(
"Choosing default s = 0\n");
166 flm_orig = (complex
double*)calloc(L * L,
sizeof(complex
double));
168 flm_syn = (complex
double*)calloc(L * L,
sizeof(complex
double));
170 f_mw = (complex
double*)calloc(L * (2 * L - 1),
sizeof(complex double));
172 f_mw_lb = (complex
double*)calloc(L * (2 * L - 1),
sizeof(complex double));
174 f_mw_ss = (complex
double*)calloc((L + 1) * (2 * L),
sizeof(complex
double));
176 f_mw_lb_ss = (complex
double*)calloc((L + 1) * (2 * L),
sizeof(complex
double));
178 f_mw_pole = (complex
double*)calloc((L - 1) * (2 * L - 1),
sizeof(complex
double));
180 f_mw_ss_pole = (complex
double*)calloc((L - 1) * (2 * L),
sizeof(complex
double));
182 f_gl = (complex
double*)calloc(L * (2 * L - 1),
sizeof(complex double));
184 f_dh = (complex
double*)calloc((2 * L) * (2 * L - 1),
sizeof(complex
double));
186 f_mw_real = (
double*)calloc(L * (2 * L - 1),
sizeof(double));
188 f_mw_lb_real = (
double*)calloc(L * (2 * L - 1),
sizeof(double));
190 f_mw_ss_real = (
double*)calloc((L + 1) * (2 * L),
sizeof(
double));
192 f_mw_lb_ss_real = (
double*)calloc((L + 1) * (2 * L),
sizeof(
double));
194 f_mw_real_pole = (
double*)calloc((L - 1) * (2 * L - 1),
sizeof(
double));
196 f_mw_ss_real_pole = (
double*)calloc((L - 1) * (2 * L),
sizeof(
double));
198 f_gl_real = (
double*)calloc(L * (2 * L - 1),
sizeof(double));
200 f_dh_real = (
double*)calloc((2 * L) * (2 * L - 1),
sizeof(
double));
205 printf(
"SSHT test program (C implementation)\n");
206 printf(
"================================================================\n");
209 for (irepeat = 0; irepeat <
NREPEAT; irepeat++) {
216 printf(
"DH real test no. %d\n", irepeat);
219 time_start = clock();
222 durations_inverse_dh_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
224 time_start = clock();
227 durations_forward_dh_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
229 errors_dh_real[irepeat] = 0.0;
230 for (i = 0; i < L * L; i++)
231 errors_dh_real[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_dh_real[irepeat]);
233 printf(
" duration_inverse (s) = %40.4f\n",
234 durations_inverse_dh_real[irepeat]);
235 printf(
" duration_forward (s) = %40.4f\n",
236 durations_forward_dh_real[irepeat]);
237 printf(
" error = %40.5e\n\n",
238 errors_dh_real[irepeat]);
241 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
242 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
246 printf(
"GL real test no. %d\n", irepeat);
249 time_start = clock();
252 durations_inverse_gl_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
254 time_start = clock();
257 durations_forward_gl_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
259 errors_gl_real[irepeat] = 0.0;
260 for (i = 0; i < L * L; i++)
261 errors_gl_real[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_gl_real[irepeat]);
263 printf(
" duration_inverse (s) = %40.4f\n",
264 durations_inverse_gl_real[irepeat]);
265 printf(
" duration_forward (s) = %40.4f\n",
266 durations_forward_gl_real[irepeat]);
267 printf(
" error = %40.5e\n\n",
268 errors_gl_real[irepeat]);
271 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
272 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
276 printf(
"MW real test no. %d\n", irepeat);
279 time_start = clock();
281 dl_method, verbosity);
283 durations_inverse_mw_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
285 time_start = clock();
287 dl_method, verbosity);
289 durations_forward_mw_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
291 errors_mw_real[irepeat] = 0.0;
292 for (i = 0; i < L * L; i++)
293 errors_mw_real[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_real[irepeat]);
295 printf(
" duration_inverse (s) = %40.4f\n",
296 durations_inverse_mw_real[irepeat]);
297 printf(
" duration_forward (s) = %40.4f\n",
298 durations_forward_mw_real[irepeat]);
299 printf(
" error = %40.5e\n\n",
300 errors_mw_real[irepeat]);
303 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
304 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
308 printf(
"MW real (lower band-limit) test no. %d\n", irepeat);
311 time_start = clock();
313 dl_method, verbosity);
315 durations_inverse_mw_lb_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
317 time_start = clock();
319 dl_method, verbosity);
321 durations_forward_mw_lb_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
323 errors_mw_lb_real[irepeat] = 0.0;
324 for (i = 0; i < L * L; i++)
325 errors_mw_lb_real[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_lb_real[irepeat]);
327 printf(
" duration_inverse (s) = %40.4f\n",
328 durations_inverse_mw_lb_real[irepeat]);
329 printf(
" duration_forward (s) = %40.4f\n",
330 durations_forward_mw_lb_real[irepeat]);
331 printf(
" error = %40.5e\n\n",
332 errors_mw_lb_real[irepeat]);
335 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
336 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
340 printf(
"MW real pole test no. %d\n", irepeat);
343 time_start = clock();
347 dl_method, verbosity);
349 durations_inverse_mw_real_pole[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
351 time_start = clock();
355 dl_method, verbosity);
357 durations_forward_mw_real_pole[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
359 errors_mw_real_pole[irepeat] = 0.0;
360 for (i = 0; i < L * L; i++)
361 errors_mw_real_pole[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_real_pole[irepeat]);
363 printf(
" duration_inverse (s) = %40.4f\n",
364 durations_inverse_mw_real_pole[irepeat]);
365 printf(
" duration_forward (s) = %40.4f\n",
366 durations_forward_mw_real_pole[irepeat]);
367 printf(
" error = %40.5e\n\n",
368 errors_mw_real_pole[irepeat]);
371 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
372 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
376 printf(
"MW SS real test no. %d\n", irepeat);
379 time_start = clock();
381 dl_method, verbosity);
383 durations_inverse_mw_ss_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
385 time_start = clock();
387 dl_method, verbosity);
389 durations_forward_mw_ss_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
391 errors_mw_ss_real[irepeat] = 0.0;
392 for (i = 0; i < L * L; i++)
393 errors_mw_ss_real[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_ss_real[irepeat]);
395 printf(
" duration_inverse (s) = %40.4f\n",
396 durations_inverse_mw_ss_real[irepeat]);
397 printf(
" duration_forward (s) = %40.4f\n",
398 durations_forward_mw_ss_real[irepeat]);
399 printf(
" error = %40.5e\n\n",
400 errors_mw_ss_real[irepeat]);
403 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
404 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
408 printf(
"MW SS real (lower band-limit) test no. %d\n", irepeat);
411 time_start = clock();
413 dl_method, verbosity);
415 durations_inverse_mw_lb_ss_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
417 time_start = clock();
419 dl_method, verbosity);
421 durations_forward_mw_lb_ss_real[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
423 errors_mw_lb_ss_real[irepeat] = 0.0;
424 for (i = 0; i < L * L; i++)
425 errors_mw_lb_ss_real[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_lb_ss_real[irepeat]);
427 printf(
" duration_inverse (s) = %40.4f\n",
428 durations_inverse_mw_lb_ss_real[irepeat]);
429 printf(
" duration_forward (s) = %40.4f\n",
430 durations_forward_mw_lb_ss_real[irepeat]);
431 printf(
" error = %40.5e\n\n",
432 errors_mw_lb_ss_real[irepeat]);
435 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
436 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
440 printf(
"MW SS real pole test no. %d\n", irepeat);
443 time_start = clock();
448 dl_method, verbosity);
450 durations_inverse_mw_ss_real_pole[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
452 time_start = clock();
458 dl_method, verbosity);
460 durations_forward_mw_ss_real_pole[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
462 errors_mw_ss_real_pole[irepeat] = 0.0;
463 for (i = 0; i < L * L; i++)
464 errors_mw_ss_real_pole[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_ss_real_pole[irepeat]);
466 printf(
" duration_inverse (s) = %40.4f\n",
467 durations_inverse_mw_ss_real_pole[irepeat]);
468 printf(
" duration_forward (s) = %40.4f\n",
469 durations_forward_mw_ss_real_pole[irepeat]);
470 printf(
" error = %40.5e\n\n",
471 errors_mw_ss_real_pole[irepeat]);
474 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
475 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
480 printf(
"DH test no. %d\n", irepeat);
483 time_start = clock();
486 durations_inverse_dh[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
488 time_start = clock();
491 durations_forward_dh[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
493 errors_dh[irepeat] = 0.0;
494 for (i = 0; i < L * L; i++)
495 errors_dh[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_dh[irepeat]);
497 printf(
" duration_inverse (s) = %40.4f\n",
498 durations_inverse_dh[irepeat]);
499 printf(
" duration_forward (s) = %40.4f\n",
500 durations_forward_dh[irepeat]);
501 printf(
" error = %40.5e\n\n",
505 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
506 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
510 printf(
"GL test no. %d\n", irepeat);
513 time_start = clock();
516 durations_inverse_gl[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
518 time_start = clock();
521 durations_forward_gl[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
523 errors_gl[irepeat] = 0.0;
524 for (i = 0; i < L * L; i++)
525 errors_gl[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_gl[irepeat]);
527 printf(
" duration_inverse (s) = %40.4f\n",
528 durations_inverse_gl[irepeat]);
529 printf(
" duration_forward (s) = %40.4f\n",
530 durations_forward_gl[irepeat]);
531 printf(
" error = %40.5e\n\n",
535 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
536 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
540 printf(
"MW test no. %d\n", irepeat);
543 time_start = clock();
546 durations_inverse_mw[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
548 time_start = clock();
551 durations_forward_mw[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
553 errors_mw[irepeat] = 0.0;
554 for (i = 0; i < L * L; i++)
555 errors_mw[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw[irepeat]);
557 printf(
" duration_inverse (s) = %40.4f\n",
558 durations_inverse_mw[irepeat]);
559 printf(
" duration_forward (s) = %40.4f\n",
560 durations_forward_mw[irepeat]);
561 printf(
" error = %40.5e\n\n",
564 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
565 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
569 printf(
"MW lower band-limit test no. %d\n", irepeat);
573 time_start = clock();
576 durations_inverse_mw_lb[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
578 time_start = clock();
581 durations_forward_mw_lb[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
583 errors_mw_lb[irepeat] = 0.0;
584 for (i = 0; i < L * L; i++)
585 errors_mw_lb[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_lb[irepeat]);
587 printf(
" duration_inverse (s) = %40.4f\n",
588 durations_inverse_mw_lb[irepeat]);
589 printf(
" duration_forward (s) = %40.4f\n",
590 durations_forward_mw_lb[irepeat]);
591 printf(
" error = %40.5e\n\n",
592 errors_mw_lb[irepeat]);
595 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
596 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
600 printf(
"MW pole test no. %d\n", irepeat);
603 time_start = clock();
606 dl_method, verbosity);
608 durations_inverse_mw_pole[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
610 time_start = clock();
613 dl_method, verbosity);
615 durations_forward_mw_pole[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
617 errors_mw_pole[irepeat] = 0.0;
618 for (i = 0; i < L * L; i++)
619 errors_mw_pole[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_pole[irepeat]);
621 printf(
" duration_inverse (s) = %40.4f\n",
622 durations_inverse_mw_pole[irepeat]);
623 printf(
" duration_forward (s) = %40.4f\n",
624 durations_forward_mw_pole[irepeat]);
625 printf(
" error = %40.5e\n\n",
626 errors_mw_pole[irepeat]);
629 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
630 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
634 printf(
"MW SS test no. %d\n", irepeat);
637 time_start = clock();
639 dl_method, verbosity);
642 durations_inverse_mw_ss[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
644 time_start = clock();
646 dl_method, verbosity);
648 durations_forward_mw_ss[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
650 errors_mw_ss[irepeat] = 0.0;
651 for (i = 0; i < L * L; i++)
652 errors_mw_ss[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_ss[irepeat]);
654 printf(
" duration_inverse (s) = %40.4f\n",
655 durations_inverse_mw_ss[irepeat]);
656 printf(
" duration_forward (s) = %40.4f\n",
657 durations_forward_mw_ss[irepeat]);
658 printf(
" error = %40.5e\n\n",
659 errors_mw_ss[irepeat]);
662 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
663 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
667 printf(
"MW SS (lower band-limit) test no. %d\n", irepeat);
670 time_start = clock();
672 dl_method, verbosity);
675 durations_inverse_mw_lb_ss[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
677 time_start = clock();
679 dl_method, verbosity);
681 durations_forward_mw_lb_ss[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
683 errors_mw_lb_ss[irepeat] = 0.0;
684 for (i = 0; i < L * L; i++)
685 errors_mw_lb_ss[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_lb_ss[irepeat]);
687 printf(
" duration_inverse (s) = %40.4f\n",
688 durations_inverse_mw_lb_ss[irepeat]);
689 printf(
" duration_forward (s) = %40.4f\n",
690 durations_forward_mw_lb_ss[irepeat]);
691 printf(
" error = %40.5e\n\n",
692 errors_mw_lb_ss[irepeat]);
695 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
696 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
700 printf(
"MW SS pole test no. %d\n", irepeat);
703 time_start = clock();
705 &f_mw_ss_np, &phi_np,
706 &f_mw_ss_sp, &phi_sp,
708 dl_method, verbosity);
710 durations_inverse_mw_ss_pole[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
712 time_start = clock();
717 dl_method, verbosity);
719 durations_forward_mw_ss_pole[irepeat] = (time_end - time_start) / (
double)CLOCKS_PER_SEC;
721 errors_mw_ss_pole[irepeat] = 0.0;
722 for (i = 0; i < L * L; i++)
723 errors_mw_ss_pole[irepeat] =
MAX(cabs(flm_orig[i] - flm_syn[i]), errors_mw_ss_pole[irepeat]);
725 printf(
" duration_inverse (s) = %40.4f\n",
726 durations_inverse_mw_ss_pole[irepeat]);
727 printf(
" duration_forward (s) = %40.4f\n",
728 durations_forward_mw_ss_pole[irepeat]);
729 printf(
" error = %40.5e\n\n",
730 errors_mw_ss_pole[irepeat]);
732 printf(
" - Null, Nan test result (Input Harmonic Coefficients) : %d, %d\n",
null_test(flm_orig, L*L),
nan_test(flm_orig, L*L));
733 printf(
" - Null, Nan test result (Output Harmonic Coefficients) : %d, %d\n",
null_test(flm_syn, L*L),
nan_test(flm_syn, L*L));
739 printf(
"================================================================\n");
740 printf(
"Summary\n\n");
741 printf(
"NREPEAT = %40d\n",
NREPEAT);
742 printf(
"L = %40d\n", L);
743 printf(
"spin = %40d\n\n", spin);
750 tmp += durations_forward_dh_real[i];
751 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
754 tmp += durations_inverse_dh_real[i];
755 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
758 tmp += errors_dh_real[i];
759 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
764 tmp += durations_forward_gl_real[i];
765 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
768 tmp += durations_inverse_gl_real[i];
769 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
772 tmp += errors_gl_real[i];
773 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
778 tmp += durations_forward_mw_real[i];
779 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
782 tmp += durations_inverse_mw_real[i];
783 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
786 tmp += errors_mw_real[i];
787 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
789 printf(
"MW real with lower band-limit\n");
792 tmp += durations_forward_mw_lb_real[i];
793 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
796 tmp += durations_inverse_mw_lb_real[i];
797 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
800 tmp += errors_mw_lb_real[i];
801 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
803 printf(
"MW real pole\n");
806 tmp += durations_forward_mw_real_pole[i];
807 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
810 tmp += durations_inverse_mw_real_pole[i];
811 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
814 tmp += errors_mw_real_pole[i];
815 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
817 printf(
"MW SS real\n");
820 tmp += durations_forward_mw_lb_ss_real[i];
821 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
824 tmp += durations_inverse_mw_lb_ss_real[i];
825 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
828 tmp += errors_mw_lb_ss_real[i];
829 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
831 printf(
"MW SS real with lower band-limit\n");
834 tmp += durations_forward_mw_lb_ss_real[i];
835 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
838 tmp += durations_inverse_mw_lb_ss_real[i];
839 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
842 tmp += errors_mw_lb_ss_real[i];
843 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
845 printf(
"MW SS real pole\n");
848 tmp += durations_forward_mw_ss_real_pole[i];
849 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
852 tmp += durations_inverse_mw_ss_real_pole[i];
853 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
856 tmp += errors_mw_ss_real_pole[i];
857 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
863 tmp += durations_forward_dh[i];
864 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
867 tmp += durations_inverse_dh[i];
868 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
872 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
877 tmp += durations_forward_gl[i];
878 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
881 tmp += durations_inverse_gl[i];
882 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
886 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
891 tmp += durations_forward_mw[i];
892 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
895 tmp += durations_inverse_mw[i];
896 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
900 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
902 printf(
"MW with lower band-limit\n");
905 tmp += durations_forward_mw_lb[i];
906 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
909 tmp += durations_inverse_mw_lb[i];
910 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
913 tmp += errors_mw_lb[i];
914 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
919 tmp += durations_forward_mw_pole[i];
920 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
923 tmp += durations_inverse_mw_pole[i];
924 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
927 tmp += errors_mw_pole[i];
928 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
933 tmp += durations_forward_mw_ss[i];
934 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
937 tmp += durations_inverse_mw_ss[i];
938 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
941 tmp += errors_mw_ss[i];
942 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
944 printf(
"MW SS with lower band-limit\n");
947 tmp += durations_forward_mw_lb_ss[i];
948 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
951 tmp += durations_inverse_mw_lb_ss[i];
952 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
955 tmp += errors_mw_lb_ss[i];
956 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
958 printf(
"MW SS pole\n");
961 tmp += durations_forward_mw_ss_pole[i];
962 printf(
" Average forward transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
965 tmp += durations_inverse_mw_ss_pole[i];
966 printf(
" Average inverse transform time (s) = %26.4f\n", tmp / (
double)
NREPEAT);
969 tmp += errors_mw_ss_pole[i];
970 printf(
" Average max error = %26.5e\n\n", tmp / (
double)
NREPEAT);
982 free(f_mw_lb_ss_real);
985 free(f_mw_real_pole);
986 free(f_mw_ss_real_pole);
1009 int el, m, msign, i, i_op;
1011 for (el = 0; el < L; el++) {
1013 ssht_sampling_elm2ind(&i, el, m);
1014 flm[i] = (2.0 *
ran2_dp(seed) - 1.0);
1015 for (m = 1; m <= el; m++) {
1016 ssht_sampling_elm2ind(&i, el, m);
1017 flm[i] = (2.0 *
ran2_dp(seed) - 1.0) + I * (2.0 *
ran2_dp(seed) - 1.0);
1018 ssht_sampling_elm2ind(&i_op, el, -m);
1020 msign = 1 - msign - msign;
1021 flm[i_op] = msign * conj(flm[i]);
1041 int el, m, msign, i, i_op;
1043 for (el = 0; el < L0; el++) {
1045 ssht_sampling_elm2ind(&i, el, m);
1047 for (m = 1; m <= el; m++) {
1048 ssht_sampling_elm2ind(&i, el, m);
1050 ssht_sampling_elm2ind(&i, el, -m);
1055 for (el = L0; el < L; el++) {
1057 ssht_sampling_elm2ind(&i, el, m);
1058 flm[i] = (2.0 *
ran2_dp(seed) - 1.0);
1059 for (m = 1; m <= el; m++) {
1060 ssht_sampling_elm2ind(&i, el, m);
1061 flm[i] = (2.0 *
ran2_dp(seed) - 1.0) + I * (2.0 *
ran2_dp(seed) - 1.0);
1062 ssht_sampling_elm2ind(&i_op, el, -m);
1064 msign = 1 - msign - msign;
1065 flm[i_op] = msign * conj(flm[i]);
1087 ssht_sampling_elm2ind(&i_lo, abs(spin), 0);
1088 for (i = i_lo; i < L * L; i++)
1089 flm[i] = (2.0 *
ran2_dp(seed) - 1.0) + I * (2.0 *
ran2_dp(seed) - 1.0);
1110 ssht_sampling_elm2ind(&i_lo, abs(spin), 0);
1111 for (i = 0; i <
MAX(i_lo, L0 * L0); i++){ flm[i] = 0.0; }
1112 for (i =
MAX(i_lo, L0 * L0); i < L * L; i++){ flm[i] = (2.0 *
ran2_dp(seed) - 1.0) + I * (2.0 *
ran2_dp(seed) - 1.0);}
1131 int IM1 = 2147483563, IM2 = 2147483399, IMM1 = IM1 - 1,
1132 IA1 = 40014, IA2 = 40692, IQ1 = 53668, IQ2 = 52774, IR1 = 12211, IR2 = 3791,
1133 NTAB = 32, NDIV = 1 + IMM1 / NTAB;
1135 double AM = 1. / IM1, EPS = 1.2e-7, RNMX = 1. - EPS;
1137 static int iv[32], iy, idum2 = 123456789;
1141 idum = (-idum > 1 ? -idum : 1);
1143 for (j = NTAB + 8; j >= 1; j--) {
1145 idum = IA1 * (idum - k * IQ1) - k * IR1;
1154 idum = IA1 * (idum - k * IQ1) - k * IR1;
1158 idum2 = IA2 * (idum2 - k * IQ2) - k * IR2;
1160 idum2 = idum2 + IM2;
1162 iy = iv[j - 1] - idum2;
1166 return (AM * iy < RNMX ? AM * iy : RNMX);