69 #include "sll_working_precision.h"
70 #include "sll_assert.h"
71 #include "sll_memory.h"
72 #include "sll_errors.h"
76 use,
intrinsic :: iso_c_binding, only: &
125 fftw_plan,
private :: fftw
126 logical :: normalized
127 sll_int32 :: direction
128 sll_int32 :: problem_rank
129 sll_int32,
allocatable :: problem_shape(:)
131 sll_comp64,
allocatable,
private :: scratch(:)
132 sll_int32,
private :: transform_type
171 print *,
'The library used is FFTW'
178 sll_int32,
intent(in) :: n
179 complex(C_DOUBLE_COMPLEX),
pointer :: data(:)
181 type(c_ptr) :: ptr_data
184 ptr_data = fftw_alloc_complex(int(n, kind=c_size_t))
185 call c_f_pointer(ptr_data,
data, [n])
188 sll_warning(
'sll_f_fft_allocate_aligned_complex',
'Aligned allocation only supported by F2003. Usual allocation.')
197 sll_int32,
intent(in) :: n
198 real(c_double),
pointer :: data(:)
200 type(c_ptr) :: ptr_data
203 ptr_data = fftw_alloc_real(int(n, kind=c_size_t))
204 call c_f_pointer(ptr_data,
data, [n])
207 sll_warning(
'sll_f_fft_allocate_aligned_real',
'Aligned allocation only supported by F2003. Usual allocation.')
216 complex(C_DOUBLE_COMPLEX),
pointer :: data(:)
219 type(c_ptr) :: ptr_data
220 ptr_data = c_loc(
data(1))
221 call fftw_free(ptr_data)
224 sll_warning(
'sll_s_fft_deallocate_aligned_complex',
'Aligned deallocation only supported by F2003. Usual deallocation.')
233 real(c_double),
pointer :: data(:)
236 type(c_ptr) :: ptr_data
237 ptr_data = c_loc(
data(1))
238 call fftw_free(ptr_data)
241 sll_warning(
'sll_s_fft_deallocate_aligned_real',
'Aligned deallocation only supported by F2003. Usual deallocation.')
252 sll_int32,
intent(out) :: k_list(0:)
256 n = plan%problem_shape(1)
258 if (
size(k_list) /= n)
then
259 sll_error(
"sll_s_fft_get_k_list_c2c_1d",
"k_list must have n elements")
262 k_list(0:n/2) = [(k, k=0, n/2)]
263 k_list(n/2 + 1:n - 1) = [(k - n, k=n/2 + 1, n - 1)]
273 sll_int32,
intent(out) :: k_list(0:)
277 n = plan%problem_shape(1)
279 if (
size(k_list) /= n)
then
280 sll_error(
"sll_s_fft_get_k_list_r2r_1d",
"k_list must have n elements")
283 k_list(0:n/2) = [(k, k=0, n/2)]
284 k_list(n/2 + 1:n - 1) = [(n - k, k=n/2 + 1, n - 1)]
294 sll_int32,
intent(out) :: k_list(0:)
298 n_2 = plan%problem_shape(1)/2
300 if (
size(k_list) /= n_2 + 1)
then
301 sll_error(
"sll_s_fft_get_k_list_r2c_1d",
"k_list must have n/2+1 elements")
304 k_list(:) = [(k, k=0, n_2)]
313 sll_real64,
intent(in) ::
data(0:)
314 sll_int32,
intent(in) :: k
318 n = plan%problem_shape(1)
320 if (k == 0) then; ck = cmplx(
data(k), 0.0_f64, kind=f64)
321 else if (k <= (n + 1)/2 - 1) then; ck = cmplx(
data(k),
data(n - k), kind=f64)
322 else if (k == n/2) then; ck = cmplx(
data(k), 0.0_f64, kind=f64)
323 else if (k <= n - 1) then; ck = cmplx(
data(n - k), -
data(k), kind=f64)
325 sll_error(
"sll_f_fft_get_mode_r2c_1d",
"k must be between 0 and n-1")
335 sll_real64,
intent(inout) ::
data(0:)
336 sll_comp64,
intent(in) :: ck
337 sll_int32,
intent(in) :: k
340 n = plan%problem_shape(1)
342 if (k == 0) then;
data(0) = real(ck)
343 else if (k <= (n + 1)/2 - 1) then;
data(k) = real(ck);
data(n - k) = aimag(ck)
344 else if (k == n/2) then;
data(k) = real(ck)
345 else if (k <= n - 1) then;
data(n - k) = real(ck);
data(k) = -aimag(ck)
347 sll_error(
"sll_s_fft_set_mode_c2r_1d",
"k must be between 0 and n-1")
363 sll_int32,
intent(in) :: nx
364 sll_comp64,
intent(inout) :: array_in(:)
365 sll_comp64,
intent(inout) :: array_out(:)
366 sll_int32,
intent(in) :: direction
367 logical,
optional,
intent(in) :: normalized
368 logical,
optional,
intent(in) :: aligned
372 sll_int32,
optional,
intent(in) :: optimization
376 sll_int32 :: flag_fftw
379 plan%direction = direction
380 if (
present(normalized))
then
381 plan%normalized = normalized
383 plan%normalized = .false.
386 if (
present(optimization))
then
387 flag_fftw = optimization
389 flag_fftw = fftw_estimate
391 if (
present(aligned))
then
392 if (aligned .EQV. .false.)
then
393 flag_fftw = flag_fftw + fftw_unaligned
396 flag_fftw = flag_fftw + fftw_unaligned
398 plan%problem_rank = 1
399 sll_allocate(plan%problem_shape(1), ierr)
400 plan%problem_shape = (/nx/)
403 plan%fftw = fftw_plan_dft_1d(nx, array_in, array_out, direction, flag_fftw)
405 call dfftw_plan_dft_1d(plan%fftw, nx, array_in, array_out, direction, flag_fftw)
415 sll_comp64,
intent(inout) :: array_in(:)
416 sll_comp64,
intent(inout) :: array_out(:)
422 call fftw_execute_dft(plan%fftw, array_in, array_out)
424 if (plan%normalized .EQV. .true.)
then
425 factor = 1.0_f64/real(plan%problem_shape(1), kind=f64)
426 array_out = cmplx(factor, 0.0, f64)*array_out
441 sll_int32,
intent(in) :: nx
442 sll_int32,
intent(in) :: ny
443 sll_comp64,
intent(inout) :: array_in(0:, 0:)
444 sll_comp64,
intent(inout) :: array_out(0:, 0:)
445 sll_int32,
intent(in) :: direction
446 logical,
optional,
intent(in) :: normalized
447 logical,
optional,
intent(in) :: aligned
448 sll_int32,
optional,
intent(in) :: optimization
452 sll_int32 :: flag_fftw
455 plan%direction = direction
456 if (
present(normalized))
then
457 plan%normalized = normalized
459 plan%normalized = .false.
462 if (
present(optimization))
then
463 flag_fftw = optimization
465 flag_fftw = fftw_estimate
467 if (
present(aligned))
then
468 if (aligned .EQV. .false.)
then
469 flag_fftw = flag_fftw + fftw_unaligned
472 flag_fftw = flag_fftw + fftw_unaligned
474 plan%problem_rank = 2
475 sll_allocate(plan%problem_shape(2), ierr)
476 plan%problem_shape = (/nx, ny/)
481 plan%fftw = fftw_plan_dft_2d(ny, nx, array_in, array_out, direction, flag_fftw)
483 call dfftw_plan_dft_2d(plan%fftw, ny, nx, array_in, array_out, direction, flag_fftw)
493 sll_comp64,
intent(inout) :: array_in(0:, 0:)
494 sll_comp64,
intent(inout) :: array_out(0:, 0:)
498 call fftw_execute_dft(plan%fftw, array_in, array_out)
500 if (plan%normalized .EQV. .true.)
then
501 factor = 1.0_f64/real(plan%problem_shape(1)*plan%problem_shape(2), kind=f64)
502 array_out = cmplx(factor, 0.0, f64)*array_out
516 subroutine sll_s_fft_init_c2c_3d(plan, nx, ny, nz, array_in, array_out, direction, normalized, aligned, optimization)
518 sll_int32,
intent(in) :: nx
519 sll_int32,
intent(in) :: ny
520 sll_int32,
intent(in) :: nz
521 sll_comp64,
intent(inout) :: array_in(0:, 0:, 0:)
522 sll_comp64,
intent(inout) :: array_out(0:, 0:, 0:)
523 sll_int32,
intent(in) :: direction
524 logical,
optional,
intent(in) :: normalized
525 logical,
optional,
intent(in) :: aligned
526 sll_int32,
optional,
intent(in) :: optimization
530 sll_int32 :: flag_fftw
533 plan%direction = direction
534 if (
present(normalized))
then
535 plan%normalized = normalized
537 plan%normalized = .false.
540 if (
present(optimization))
then
541 flag_fftw = optimization
543 flag_fftw = fftw_estimate
545 if (
present(aligned))
then
546 if (aligned .EQV. .false.)
then
547 flag_fftw = flag_fftw + fftw_unaligned
550 flag_fftw = flag_fftw + fftw_unaligned
552 plan%problem_rank = 3
553 sll_allocate(plan%problem_shape(3), ierr)
554 plan%problem_shape = [nx, ny, nz]
559 plan%fftw = fftw_plan_dft_3d(nz, ny, nx, array_in, array_out, direction, flag_fftw)
561 call dfftw_plan_dft_3d(plan%fftw, nz, ny, nx, array_in, array_out, direction, flag_fftw)
571 sll_comp64,
intent(inout) :: array_in(0:, 0:, 0:)
572 sll_comp64,
intent(inout) :: array_out(0:, 0:, 0:)
576 call fftw_execute_dft(plan%fftw, array_in, array_out)
578 if (plan%normalized)
then
579 factor = 1.0_f64/real(plan%problem_shape(1)*plan%problem_shape(2)*plan%problem_shape(3), kind=f64)
580 array_out = cmplx(factor, 0.0, f64)*array_out
596 sll_int32,
intent(in) :: nx
597 sll_real64,
intent(inout) :: array_in(:)
598 sll_real64,
intent(inout) :: array_out(:)
599 sll_int32,
intent(in) :: direction
600 logical,
optional,
intent(in) :: normalized
601 logical,
optional,
intent(in) :: aligned
602 sll_int32,
optional,
intent(in) :: optimization
606 sll_int32 :: flag_fftw
609 plan%direction = direction
610 if (
present(normalized))
then
611 plan%normalized = normalized
613 plan%normalized = .false.
616 if (
present(optimization))
then
617 flag_fftw = optimization
619 flag_fftw = fftw_estimate
621 if (
present(aligned))
then
622 if (aligned .EQV. .false.)
then
623 flag_fftw = flag_fftw + fftw_unaligned
626 flag_fftw = flag_fftw + fftw_unaligned
628 plan%problem_rank = 1
629 sll_allocate(plan%problem_shape(1), ierr)
630 plan%problem_shape = (/nx/)
634 plan%fftw = fftw_plan_r2r_1d(nx, array_in, array_out, fftw_r2hc, flag_fftw)
639 allocate (plan%scratch(nx/2 + 1))
640 call dfftw_plan_dft_r2c_1d(plan%fftw, nx, array_in, plan%scratch, flag_fftw)
641 sll_warning(
'sll_s_fft_init_r2r_1d',
'R2HC not supported without FFTW_F2003. Use implementation based on r2c/c2r transform.')
645 plan%fftw = fftw_plan_r2r_1d(nx, array_in, array_out, fftw_hc2r, flag_fftw)
650 allocate (plan%scratch(nx/2 + 1))
651 call dfftw_plan_dft_c2r_1d(plan%fftw, nx, plan%scratch, array_out, flag_fftw)
652 sll_warning(
'sll_s_fft_init_r2r_1d',
'HC2R not supported without FFTW_F2003. Use implementation based on r2c/c2r transform.')
662 sll_real64,
intent(inout) :: array_in(:)
663 sll_real64,
intent(inout) :: array_out(:)
673 call fftw_execute_r2r(plan%fftw, array_in, array_out)
675 if (plan%normalized .EQV. .true.)
then
676 factor = 1.0_f64/real(plan%problem_shape(1), kind=f64)
677 array_out = factor*array_out
684 array_out(1) = real(plan%scratch(1), f64)
685 array_out(plan%problem_shape(1)/2 + 1) = real(plan%scratch((plan%problem_shape(1)/2 + 1)), f64)
686 do j = 1, plan%problem_shape(1)/2 - 1
690 do j = 0, plan%problem_shape(1)/2
711 sll_int32,
intent(in) :: nx
712 sll_real64,
intent(inout) :: array_in(:)
713 sll_comp64,
intent(out) :: array_out(:)
714 logical,
optional,
intent(in) :: normalized
715 logical,
optional,
intent(in) :: aligned
716 sll_int32,
optional,
intent(in) :: optimization
720 sll_int32 :: flag_fftw
724 if (
present(normalized))
then
725 plan%normalized = normalized
727 plan%normalized = .false.
730 if (
present(optimization))
then
731 flag_fftw = optimization
733 flag_fftw = fftw_estimate
735 if (
present(aligned))
then
736 if (aligned .EQV. .false.)
then
737 flag_fftw = flag_fftw + fftw_unaligned
740 flag_fftw = flag_fftw + fftw_unaligned
742 plan%problem_rank = 1
743 sll_allocate(plan%problem_shape(1), ierr)
744 plan%problem_shape = (/nx/)
747 plan%fftw = fftw_plan_dft_r2c_1d(nx, array_in, array_out, flag_fftw)
749 call dfftw_plan_dft_r2c_1d(plan%fftw, nx, array_in, array_out, flag_fftw)
756 sll_real64,
intent(inout) :: array_in(:)
757 sll_comp64,
intent(out) :: array_out(:)
763 call fftw_execute_dft_r2c(plan%fftw, array_in, array_out)
765 if (plan%normalized .EQV. .true.)
then
766 factor = 1.0_f64/real(plan%problem_shape(1), kind=f64)
767 array_out = cmplx(factor, 0.0, kind=f64)*array_out
776 sll_int32,
intent(in) :: nx
777 sll_int32,
intent(in) :: ny
778 sll_real64,
intent(inout) :: array_in(:, :)
779 sll_comp64,
intent(out) :: array_out(:, :)
780 logical,
optional,
intent(in) :: normalized
781 logical,
optional,
intent(in) :: aligned
782 sll_int32,
optional,
intent(in) :: optimization
786 sll_int32 :: flag_fftw
790 if (
present(normalized))
then
791 plan%normalized = normalized
793 plan%normalized = .false.
796 if (
present(optimization))
then
797 flag_fftw = optimization
799 flag_fftw = fftw_estimate
801 if (
present(aligned))
then
802 if (aligned .EQV. .false.)
then
803 flag_fftw = flag_fftw + fftw_unaligned
806 flag_fftw = flag_fftw + fftw_unaligned
809 plan%problem_rank = 2
810 sll_allocate(plan%problem_shape(2), ierr)
811 plan%problem_shape = (/nx, ny/)
814 plan%fftw = fftw_plan_dft_r2c_2d(ny, nx, array_in, array_out, fftw_estimate + fftw_unaligned)
816 call dfftw_plan_dft_r2c_2d(plan%fftw, nx, ny, array_in, array_out, fftw_estimate)
826 sll_real64,
intent(inout) :: array_in(:, :)
827 sll_comp64,
intent(out) :: array_out(:, :)
834 nx = plan%problem_shape(1)
835 ny = plan%problem_shape(2)
837 if ((
size(array_in, dim=1) .ne. nx) .and. (
size(array_in, dim=2) .ne. ny))
then
838 print *,
'Error in file sll_m_fft.F90'
839 print *,
' in subroutine fft_apply_r2c_2d'
840 print *,
' array_in size problem'
842 else if (
size(array_in, dim=1) .ne. nx/2 + 1 .and.
size(array_in, dim=2) .ne. ny)
then
843 print *,
'Error in file sll_m_fft.F90'
844 print *,
' in subroutine fft_apply_r2c_2d'
845 print *,
' array_out size problem'
849 call fftw_execute_dft_r2c(plan%fftw, array_in, array_out)
851 if (plan%normalized .EQV. .true.)
then
852 factor = 1.0_f64/real(nx*ny, kind=f64)
853 array_out = cmplx(factor, 0.0, kind=f64)*array_out
868 sll_int32,
intent(in) :: nx
869 sll_comp64,
intent(inout) :: array_in(:)
870 sll_real64,
intent(out) :: array_out(:)
871 logical,
optional,
intent(in) :: normalized
872 logical,
optional,
intent(in) :: aligned
873 sll_int32,
optional,
intent(in) :: optimization
877 sll_int32 :: flag_fftw
881 if (
present(normalized))
then
882 plan%normalized = normalized
884 plan%normalized = .false.
887 if (
present(optimization))
then
888 flag_fftw = optimization
890 flag_fftw = fftw_estimate
892 if (
present(aligned))
then
893 if (aligned .EQV. .false.)
then
894 flag_fftw = flag_fftw + fftw_unaligned
897 flag_fftw = flag_fftw + fftw_unaligned
899 plan%problem_rank = 1
900 sll_allocate(plan%problem_shape(1), ierr)
901 plan%problem_shape = (/nx/)
904 plan%fftw = fftw_plan_dft_c2r_1d(nx, array_in, array_out, flag_fftw)
906 call dfftw_plan_dft_c2r_1d(plan%fftw, nx, array_in, array_out, flag_fftw)
916 sll_comp64,
intent(inout) :: array_in(:)
917 sll_real64,
intent(inout) :: array_out(:)
923 call fftw_execute_dft_c2r(plan%fftw, array_in, array_out)
925 if (plan%normalized .EQV. .true.)
then
926 factor = 1.0_f64/real(plan%problem_shape(1), kind=f64)
927 array_out = factor*array_out
936 sll_int32,
intent(in) :: nx
937 sll_int32,
intent(in) :: ny
938 sll_comp64,
intent(inout) :: array_in(:, :)
939 sll_real64,
intent(out) :: array_out(:, :)
940 logical,
optional,
intent(in) :: normalized
941 logical,
optional,
intent(in) :: aligned
942 sll_int32,
optional,
intent(in) :: optimization
946 sll_int32 :: flag_fftw
950 if (
present(normalized))
then
951 plan%normalized = normalized
953 plan%normalized = .false.
956 if (
present(optimization))
then
957 flag_fftw = optimization
959 flag_fftw = fftw_estimate
961 if (
present(aligned))
then
962 if (aligned .EQV. .false.)
then
963 flag_fftw = flag_fftw + fftw_unaligned
966 flag_fftw = flag_fftw + fftw_unaligned
969 plan%problem_rank = 2
970 sll_allocate(plan%problem_shape(2), ierr)
971 plan%problem_shape = (/nx, ny/)
973 plan%fftw = fftw_plan_dft_c2r_2d(ny, nx, array_in, array_out, fftw_estimate + fftw_unaligned)
975 call dfftw_plan_dft_c2r_2d(plan%fftw, nx, ny, array_in, array_out, fftw_estimate)
984 sll_comp64,
intent(inout) :: array_in(1:, 1:)
985 sll_real64,
intent(out) :: array_out(1:, 1:)
992 nx = plan%problem_shape(1)
993 ny = plan%problem_shape(2)
994 call fftw_execute_dft_c2r(plan%fftw, array_in(1:nx/2 + 1, 1:ny), array_out(1:nx, 1:ny))
996 if (plan%normalized .EQV. .true.)
then
997 factor = 1.0_f64/real(nx*ny, kind=f64)
998 array_out = factor*array_out
1009 call fftw_destroy_plan(plan%fftw)
1010 if (
allocated(plan%problem_shape))
then
1011 deallocate (plan%problem_shape)
subroutine, public sll_s_fft_get_k_list_r2r_1d(plan, k_list)
Get a list of the k modes in an r2r FFT k_list = [0, 1, 2, ..., n/2, (n+1)/2-1, .....
subroutine, public sll_s_fft_exec_r2c_1d(plan, array_in, array_out)
Compute fast Fourier transform in real to complex mode.
subroutine, public sll_s_fft_free(plan)
Delete a plan.
integer(c_int), parameter, public sll_p_fft_wisdom_only
subroutine, public sll_s_fft_init_c2c_2d(plan, nx, ny, array_in, array_out, direction, normalized, aligned, optimization)
Create new 2d complex to complex plan.
subroutine, public sll_s_fft_init_r2c_1d(plan, nx, array_in, array_out, normalized, aligned, optimization)
Create new 1d real to complex plan for forward FFT.
subroutine, public sll_s_fft_print_defaultlib()
Function to print the FFT library behind the interface.
integer(c_int), parameter, public sll_p_fft_exhaustive
FFTW planning-rigor flag FFTW_EXHAUSTIVE (more optimization than PATIENT) NOTE: planner overwrites th...
integer, parameter p_fftw_c2c_1d
subroutine, public sll_s_fft_exec_c2c_2d(plan, array_in, array_out)
Compute fast Fourier transform in complex to complex mode.
subroutine, public sll_s_fft_deallocate_aligned_complex(data)
Function to deallocate an aligned complex array.
subroutine, public sll_s_fft_exec_c2r_1d(plan, array_in, array_out)
Compute fast Fourier transform in complex to real mode.
integer, parameter p_fftw_r2c_2d
integer(c_int), parameter, public sll_p_fft_estimate
FFTW planning-rigor flag FFTW_ESTIMATE (simple heuristic for planer) [value 64]. This is our default ...
integer, parameter, public sll_p_fft_forward
Flag to specify forward FFT (negative sign) [value -1].
subroutine, public sll_s_fft_exec_c2r_2d(plan, array_in, array_out)
Compute fast Fourier transform in complex to real mode.
subroutine, public sll_s_fft_init_c2r_1d(plan, nx, array_in, array_out, normalized, aligned, optimization)
Create new 1d complex to real plan for backward FFT.
integer(c_int), parameter, public sll_p_fft_patient
FFTW planning-rigor flag FFTW_PATIENT (more optimizaton than MEASURE) NOTE: planner overwrites the in...
subroutine, public sll_s_fft_set_mode_c2r_1d(plan, data, ck, k)
Subroutine to set a complex mode to the real representation of r2r.
integer, parameter p_fftw_c2c_3d
real(c_double) function, dimension(:), pointer, public sll_f_fft_allocate_aligned_real(n)
Function to allocate an aligned real array.
subroutine, public sll_s_fft_init_c2c_3d(plan, nx, ny, nz, array_in, array_out, direction, normalized, aligned, optimization)
Create new 3d complex to complex plan.
subroutine, public sll_s_fft_get_k_list_r2c_1d(plan, k_list)
Get a list of the k modes in an r2c FFT k_list = [0, 1, 2, ..., n/2].
integer, parameter p_fftw_c2r_1d
subroutine, public sll_s_fft_get_k_list_c2c_1d(plan, k_list)
Get a list of the k modes in a c2c FFT k_list = [0, 1, 2, ..., n/2, (n/2+1)-n, ......
subroutine, public sll_s_fft_init_c2r_2d(plan, nx, ny, array_in, array_out, normalized, aligned, optimization)
Create new 2d real to complex plan for backward FFT.
subroutine, public sll_s_fft_init_r2r_1d(plan, nx, array_in, array_out, direction, normalized, aligned, optimization)
Create new 1d real to real plan.
subroutine, public sll_s_fft_exec_c2c_1d(plan, array_in, array_out)
Compute fast Fourier transform in complex to complex mode.
subroutine, public sll_s_fft_exec_r2c_2d(plan, array_in, array_out)
Compute fast Fourier transform in real to complex mode.
subroutine, public sll_s_fft_deallocate_aligned_real(data)
Function to deallocate an aligned real array.
integer, parameter p_fftw_r2r_1d
integer, parameter p_fftw_r2r_2d
subroutine, public sll_s_fft_exec_c2c_3d(plan, array_in, array_out)
Compute fast Fourier transform in complex to complex mode.
subroutine, public sll_s_fft_init_c2c_1d(plan, nx, array_in, array_out, direction, normalized, aligned, optimization)
Create new 1d complex to complex plan.
subroutine, public sll_s_fft_init_r2c_2d(plan, nx, ny, array_in, array_out, normalized, aligned, optimization)
Create new 2d complex to real plan for forward FFT.
integer, parameter, public sll_p_fft_backward
Flag to specify backward FFT (positive sign) [value 1].
subroutine, public sll_s_fft_exec_r2r_1d(plan, array_in, array_out)
Compute fast Fourier transform in real to real mode.
integer, parameter p_fftw_c2r_2d
integer, parameter p_fftw_c2c_2d
complex(kind=f64) function, public sll_f_fft_get_mode_r2c_1d(plan, data, k)
Function to reconstruct a complex FFT mode from the data of a r2r transform.
integer(c_int), parameter, public sll_p_fft_measure
FFTW planning-rigor flag FFTW_MEASURE (optimized plan) NOTE: planner overwrites the input array durin...
integer, parameter p_fftw_r2c_1d
complex(c_double_complex) function, dimension(:), pointer, public sll_f_fft_allocate_aligned_complex(n)
Function to allocate an aligned complex array.
Type for FFT plan in SeLaLib.