Rate This Document
Findability
Accuracy
Completeness
Readability

kml_fft(f)_plan_guru_split_dft_c2r

Create a plan for the n-dimensional C2R transform of multiple data sequences. The data sequence of a single FFT does not need to be contiguous and can cross steps. The input and output of the split interfaces are stored in the real and imaginary arrays, respectively.

Interface Definition

C interface:

kml_fft_plan kml_fft_plan_guru_split_dft_c2r(int rank,

const kml_fft_iodim *dims,

int howmany_rank,

const kml_fft_iodim *howmany_dims,

double *ri,

double *ii,

double *out,

unsigned flags);

kml_fftf_plan kml_fftf_plan_guru_split_dft_c2r(int rank,

const kml_fftf_iodim *dims,

int howmany_rank,

const kml_fftf_iodim *howmany_dims,

float *ri,

float *ii,

float *out,

unsigned flags);

Fortran interface:

RES = KML_FFT_PLAN_GURU_SPLIT_DFT_C2R(RANK, DIMS, HOWMANY_RANK, HOWMANY_DIMS, RI, II, OUT, FLAGS);

RES = KML_FFTF_PLAN_GURU_SPLIT_DFT_C2R(RANK, DIMS, HOWMANY_RANK, HOWMANY_DIMS, RI, II, OUT, 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 (ri, ii) and output (out). In addition, the object may also be added into the kml_fft(f)_execute_split_dft_c2r function as a parameter to perform FFT on the new input (ri, ii) and output (out).

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

  • Double precision: const kml_fft_iodim*
  • Single precision: const kml_fftf_iodim*
  • dims is a structure array whose size is rank. dims[i] contains the following members:
  • int n: FFT length of the i-th dimension.
  • int is: interval between successive elements of the i-th dimensional FFT input sequence.
  • int os: interval between successive elements of the i-th dimensional FFT output sequence.

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

  • Double precision: const kml_fft_iodim*
  • Single precision: const kml_fftf_iodim*

howmany_dims is a structure array whose size is howmany_rank. howmany_dims[i] contains the following members:

  • int n: number of pending FFTs in the i-th dimension of the howmany_rank dimension space.
  • int is: interval between successive FFT input sequences of the i-th dimension.
  • int os: interval between successive FFT output sequences of the i-th dimension.

Input

ri

  • Double precision: double*
  • Single precision: float*

Inputs the real part of the data to be transformed.

Input

ii

  • Double precision: double*
  • Single precision: float*

Inputs the imaginary part of the data to be transformed.

Input

out

  • Double precision: double*
  • Single precision: float*

Outputs the data generated using FFT.

Output

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_iodim *dims; 
    dims = (kml_fft_iodim*)kml_fft_malloc(sizeof(kml_fft_iodim) * rank); 
    dims[0].n = 2; 
    dims[0].is = 2; 
    dims[0].os = 3; 
    dims[1].n = 3; 
    dims[1].is = 1; 
    dims[1].os = 1; 
    int howmany_rank = 1; 
    kml_fft_iodim *howmany_dims; 
    howmany_dims = (kml_fft_iodim*)kml_fft_malloc(sizeof(kml_fft_iodim) * howmany_rank); 
    howmany_dims[0].n = 2; 
    howmany_dims[0].is = 2 * 2; 
    howmany_dims[0].os = 2 * 3; 
    double init[8][2] = {{120, 0}, {8, 8}, {0, 0}, {0, 16}, {0, 16}, {-8, 8}, {-8, 0}, {-8, 8}}; 
    double *ri; 
    ri = (double*)kml_fft_malloc(sizeof(double) * 8); 
    double *ii; 
    ii = (double*)kml_fft_malloc(sizeof(double) * 8); 
    for (int i = 0; i < 8; i++) { 
        ri[i] = init[i][0]; 
        ii[i] = init[i][1]; 
    } 
    double *out; 
    out = (double*)kml_fft_malloc(sizeof(double) * 12); 
    kml_fft_plan plan; 
    plan = kml_fft_plan_guru_split_dft_c2r(rank, dims, howmany_rank, howmany_dims, ri, ii, out, KML_FFT_ESTIMATE); 
    kml_fft_execute_split_dft_c2r(plan, ri, ii, out); 
 
    kml_fft_destroy_plan(plan); 
    kml_fft_free(howmany_dims); 
    kml_fft_free(dims); 
    kml_fft_free(ri); 
    kml_fft_free(ii); 
    kml_fft_free(out); 
 
    /* 
     * out = {1.360000e+02, 7.043078e+01, 1.535692e+02, 1.360000e+02, 
     *        1.258564e+02, 9.814359e+01, -4.000000e+01, -1.971281e+01, 
     *        3.571281e+01, 8.000000e+00, 8.000000e+00, 8.000000e+00} 
     */

Fortran interface:

    INTEGER(C_INT) :: RANK = 2 
    INTEGER(C_INT) :: HOWMANY_RANK = 1 
    REAL(C_DOUBLE), DIMENSION(8, 2) :: INIT 
    TYPE(KML_FFT_IODIM), POINTER :: DIMS(:), HOWMANY_DIMS(:) 
    REAL(8), POINTER :: RI(:), II(:), OUT(:) 
    TYPE(C_PTR) :: PRI,PII, POUT, PDIMS, PHOWMANY_DIMS 
    INTEGER(C_SIZE_T) :: CSIZE, RSIZE 
    CSIZE = 8 * 8 
    RSIZE = 8 * 12 
    PRI = KML_FFT_MALLOC(CSIZE) 
    PII = KML_FFT_MALLOC(CSIZE) 
    POUT = KML_FFT_MALLOC(RSIZE) 
    CALL C_F_POINTER(PRI, IN, SHAPE=[8]) 
    CALL C_F_POINTER(PII, IN, SHAPE=[8]) 
    CALL C_F_POINTER(POUT, OUT, SHAPE=[12]) 
    CSIZE = 12 * 2 
    RSIZE = 12 * 1 
    PIODIMS = KML_FFT_MALLOC(CSIZE) 
    PHOWMANY_IODIMS = KML_FFT_MALLOC(RSIZE) 
    CALL C_F_POINTER(PIODIMS, DIMS, SHAPE=[2]) 
    CALL C_F_POINTER(PHOWMANY_DIMS, HOWMANY_DIMS, SHAPE=[1]) 
    DIMS(0)%N = 2 
    DIMS(0)%IS = 2 
    DIMS(0)%OS = 3 
    DIMS(1)%N = 3 
    DIMS(1)%IS = 1 
    DIMS(1)%OS = 1 
    HOWMANY_DIMS(0)%N = 2 
    HOWMANY_DIMS(0)%IS = 2 * 2 
    HOWMANY_DIMS(0)%OS = 2 * 3 
    DATA INIT/120, 8, 0, 0, 0, -8, -8, -8,  0, 8, 0, 16, 16, 8, 0, 8/ 
    INTEGER :: I 
    DO WHILE(I <= 8)  
        RI(I) = INIT(I, 0) 
        II(I) = INIT(I, 1) 
    END DO 
    TYPE(C_PTR) :: PLAN 
    PLAN = KML_FFT_PLAN_GURU_SPLIT_DFT_C2R(RANK, DIMS, HOWMANY_RANK, HOWMANY_DIMS, RI, II, OUT, KML_FFT_ESTIMATE) 
    CALL KML_FFT_EXECUTE_SPLIT_DFT_C2R(PLAN, RI, II, OUT); 
 
    CALL KML_FFT_DESTROY_PLAN(PLAN) 
    CALL KML_FFT_FREE(PHOWMANY_DIMS) 
    CALL KML_FFT_FREE(PDIMS) 
    CALL KML_FFT_FREE(PRI) 
    CALL KML_FFT_FREE(PII) 
    CALL KML_FFT_FREE(POUT) 
    ! 
    ! OUT = /1.360000E+02, 7.043078E+01, 1.535692E+02, 1.360000E+02, 
    !        1.258564E+02, 9.814359E+01, -4.000000E+01, -1.971281E+01, 
    !        3.571281E+01, 8.000000E+00, 8.000000E+00, 8.000000E+00/ 
    !

The plan returned by kml_fft(f)_plan_guru_split_dft_c2r can use kml_fft(f)_execute to calculate the plan input or kml_fft(f)_execute_split_dft_c2r to calculate a different input. The input of a plan does not need to be initialized, but the input must be valid (cannot be NULL).