kml_fft(f)_plan_guru64_split_dft_r2c
Create a plan for the n-dimensional R2C transform of multiple data sequences.
The data sequence of a single FFT does not need to be contiguous and can be stridden. The input and output of the split interfaces are stored in the real and imaginary arrays, respectively. Different from kml_fft_plan_guru_split_dft_r2c, kml_fft_plan_guru64_split_dft_r2c allows some parameters to be 64-bit integers.
Interface Definition
C interface:
kml_fft_plan kml_fft_plan_guru64_split_dft_r2c(int rank, const kml_fft_iodim64 *dims, int howmany_rank, const kml_fft_iodim64 *howmany_dims, double *in, double *ro, double *io, unsigned flags);
kml_fftf_plan kml_fftf_plan_guru64_split_dft_r2c(int rank, const kml_fftf_iodim64 *dims, int howmany_rank, const kml_fftf_iodim64 *howmany_dims, float *in, float *ro, float *io, unsigned flags);
Fortran interface:
RES = KML_FFT_PLAN_GURU64_SPLIT_DFT_R2C(RANK, DIMS, HOWMANY_RANK, HOWMANY_DIMS, IN, RO, IO, FLAGS);
RES = KML_FFTF_PLAN_GURU64_SPLIT_DFT_R2C(RANK, DIMS, HOWMANY_RANK, HOWMANY_DIMS, IN, RO, IO, FLAGS);
Return Value
The function returns a structure pointer of the kml_fft(f)_plan type. This object is used as a parameter in the kml_fft(f)_execute function to perform FFT on the current input (in) and output (ro, io). In addition, the object may also be added into the kml_fft(f)_execute_split_dft_r2c function as a parameter to perform FFT on the new input (in) and output (ro, io).
If this function returns a non-null pointer, the plan has been successfully executed. Otherwise, the plan failed to be executed.
Parameters
Parameter |
Data Type |
Description |
Input/Output |
|---|---|---|---|
rank |
int |
Dimension of a single FFT sequence. Constraint: 1 ≤ rank ≤ 3. |
Input |
dims |
|
dims is a structure array whose size is rank. dims[i] contains the following members:
Constraint: dims[i].n ≥ 1, for i in 0 to rank - 1. |
Input |
howmany_rank |
int |
The memory allocation between multiple rank-dimension FFTs is described by the howmany_dims array of the howmany_rank dimension. howmany_rank indicates the number of dimensions required by the memory access mode of the start address of each rank-dimension FFT to be calculated. Constraint: 0 ≤ howmany_rank ≤ 3. |
Input |
howmany_dims |
|
howmany_dims is a structure array whose size is howmany_rank. howmany_dims[i] contains the following members:
|
Input |
in |
|
Inputs the data to be transformed. |
Input |
ro |
|
Outputs the real part of the data to be transformed. |
Input |
io |
|
Outputs the imaginary part of the data to be transformed. |
Input |
flags |
unsigned int |
A planning option, not in use. |
Input |
Dependencies
C: "kfft.h"
Fortran: "kfft.f03"
Examples
C interface:
int rank = 2;
kml_fft_iodim64 *dims;
dims = (kml_fft_iodim64*)kml_fft_malloc(sizeof(kml_fft_iodim64) * rank);
dims[0].n = 2;
dims[0].is = 3;
dims[0].os = 2;
dims[1].n = 3;
dims[1].is = 1;
dims[1].os = 1;
int howmany_rank = 1;
kml_fft_iodim64 *howmany_dims;
howmany_dims = (kml_fft_iodim64*)kml_fft_malloc(sizeof(kml_fft_iodim64) * howmany_rank);
howmany_dims[0].n = 2;
howmany_dims[0].is = 2 * 3;
howmany_dims[0].os = 2 * 2;
double init[12] = {120, 8, 0, 0, 0, -8, -8, -8, -16, 0, -40, -8};
double *in;
in = (double*)kml_fft_malloc(sizeof(double) * 12);
for (int i = 0; i < 12; i++) {
in[i] = init[i];
}
kml_fft_plan plan;
double *ro;
double *io;
ro = (double*)kml_fft_malloc(sizeof(double) * 8);
io = (double*)kml_fft_malloc(sizeof(double) * 8);
plan = kml_fft_plan_guru64_split_dft_r2c(rank, dims, howmany_rank, howmany_dims, in, ro, io, KML_FFT_ESTIMATE);
kml_fft_execute_split_dft_r2c(plan, in, ro, io);
kml_fft_destroy_plan(plan);
kml_fft_free(howmany_dims);
kml_fft_free(dims);
kml_fft_free(in);
kml_fft_free(ro);
kml_fft_free(io);
/*
* ro = {1.200000e+02, 1.200000e+02, 1.360000e+02, 1.120000e+02,
* -8.000000e+01, 2.800000e+01, 1.600000e+01, -2.000000e+01}
*/
/*
* io = {0.000000e+00, -1.385641e+01, 0.000000e+00, 0.000000e+00,
* 0.000000e+00, 2.078461e+01, 0.000000e+00, -3.464102e+01}
*/
Fortran interface:
INTEGER(C_INT) :: RANK = 2
INTEGER(C_INT) :: HOWMANY_RANK = 1
TYPE(KML_FFT_IODIM64), POINTER :: DIMS(:), HOWMANY_DIMS(:)
REAL(C_DOUBLE), DIMENSION(12) :: INIT
TYPE(C_DOUBLE), POINTER :: IN(:), RO(:), IO(:)
TYPE(C_PTR) :: PIN, PRO, PIO, PDIMS, PHOWMANY_DIMS
INTEGER(C_SIZE_T) :: SIZE1, SIZE2, SIZE3, SIZE4
SIZE1 = 8 * 12
SIZE2 = 8 * 8
SIZE3 = 24 * RANK
SIZE4 = 24 * HOWMANY_RANK
PDIMS = KML_FFT_MALLOC(SIZE3)
PHOWMANY_DIMS = KML_FFT_MALLOC(SIZE4)
PIN = KML_FFT_MALLOC(SIZE1)
PRO = KML_FFT_MALLOC(SIZE2)
PRI = KML_FFT_MALLOC(SIZE2)
CALL C_F_POINTER(PIN, IN, SHAPE=[12])
CALL C_F_POINTER(PRO, RO, SHAPE=[8])
CALL C_F_POINTER(PIO, IO, SHAPE=[8])
CALL C_F_POINTER(PDIMS, DIMS, SHAPE=[RANK])
CALL C_F_POINTER(PHOWMANY_DIMS, HOWMANY_DIMS, SHAPE=[HOWMANY_RANK])
DIMS(0)%N = 2
DIMS(0)%IS = 3
DIMS(0)%OS = 2
DIMS(1)%N = 3
DIMS(1)%IS = 1
DIMS(1)%OS = 1
HOWMANY_DIMS(0)%N = 2
HOWMANY_DIMS(0)%IS = 2 * 3
HOWMANY_DIMS(0)%OS = 2 * 3
DATA INIT/120, 8, 0, 0, 0, -8, -8, -8, -16, 0, -40, -8/
INTEGER :: I
DO WHILE(I <= 12)
IN(I) = INIT(I)
END DO
TYPE(C_PTR) :: PLAN
PLAN = KML_FFT_PLAN_GURU64_SPLIT_DFT_R2C(RANK, DIMS, HOWMANY_RANK, HOWMANY_DIMS, IN, RO, IO, KML_FFT_ESTIMATE)
CALL KML_FFT_EXECUTE_SPLIT_DFT_R2C(PLAN, IN, RO, IO)
CALL KML_FFT_DESTROY_PLAN(PLAN)
CALL KML_FFT_FREE(PHOWMANY_DIMS)
CALL KML_FFT_FREE(PDIMS)
CALL KML_FFT_FREE(PIN)
CALL KML_FFT_FREE(PRO)
CALL KML_FFT_FREE(PIO)
!
! RO = /1.200000E+02, 1.200000E+02, 1.360000E+02, 1.120000E+02,
! -8.000000E+01, 2.800000E+01, 1.600000E+01, -2.000000E+01/
!
!
! IO = /0.000000E+00, -1.385641E+01, 0.000000E+00, 0.000000E+00,
! 0.000000E+00, 2.078461E+01, 0.000000E+00, -3.464102E+01/
!