Skip to content
Snippets Groups Projects
rc2dfft.c 2.59 KiB
#include "genfft.h"

/**
*   NAME:     rc2dfft
*
*   DESCRIPTION: 2 Dimensional real to complex FFT
*
*   USAGE:
*         void rc2dfft(REAL *rdata, complex *cdata, int nr, int nc, 
*                      int ldr, int ldc, int sign)
*
*   INPUT:  - *rdata: real 2D input array
*           -     nr: number of real (fast) samples to be transformed
*           -     nc: number of complex (slow) samples to be transformed
*           -    ldr: leading dimension (number of real samples)
*           -    ldc: leading dimension (number of complex samples)
*           -   sign: sign of the Fourier kernel
*
*   OUTPUT: - *data: complex 2D output array unscaled
*
*   NOTES: Optimized system dependent FFT's implemented for:
*          - CRAY T3D and T3E
*          - CRAY T90
*          - CRAY J90
*          - SGI/CRAY ORIGIN 2000 (scsl)
*          - SGI Power Challenge (complib.sgimath)
*          - inplace FFT from Mayer and SU (see file fft_mayer.c)
*
*   AUTHOR:
*           Jan Thorbecke (janth@xs4all.nl)
*           The Netherlands
*
*----------------------------------------------------------------------
*  REVISION HISTORY:
*  VERSION        AUTHOR          DATE         COMMENT
*    1.0       Jan Thorbecke    July  '97    Initial version
*
----------------------------------------------------------------------*/

void rc2dfft(REAL *rdata, complex *cdata, int nr, int nc, int ldr, int ldc, int sign)
{
#if defined(HAVE_LIBSCS)
	static int nr_prev=0, nc_prev=0;
	int   isys=0, ntable, nwork, zero=0;
	static float *work, *table;
	float scale=1.0;
#else
	int i, j, nf;
	complex *tmp;
#endif

#if defined(HAVE_LIBSCS)
	if (nr != nr_prev || nc != nc_prev) {
		nwork = nr*nc;
		ntable = 15+nr+2*(15+nc);
		if (work) free (work);
		if (table) free (table);
		work  = (float *)malloc(nwork*sizeof(float));
		table = (float *)malloc(ntable*sizeof(float));
		scfft2d_(&zero,&nr,&nc,&scale,rdata,&ldr,cdata,&ldc,table,work,&isys);
		nr_prev = nr;
		nc_prev = nc;
	}

	scfft2d_(sign,&nr,&nc,&scale,rdata,&ldr,cdata,&ldc,table,work,&isys);

#else 
	rcmfft(rdata, cdata, nr, nc, ldr, ldc, sign);
	tmp = (complex *)malloc(nc*sizeof(complex));
	nf = (nr+2)/2;
	for (i=0; i<nf; i++) {
		for (j=0; j<nc; j++) tmp[j] = cdata[j*ldc+i];
		cc1fft(tmp, nc, sign);
		for (j=0; j<nc; j++) cdata[j*ldc+i] = tmp[j];
	}
	free (tmp);
#endif

	return;
}

/****************** FORTRAN SHELL *****************/

#ifdef DF_CAPFNAMES
#define nrc2dfft FNAME(RC2DFFTF)
#else
#define nrc2dfft FNAME(rc2dfftf)
#endif

void nrc2dfft(REAL *rdata, complex *cdata, int *nr, int *nc, int *ldr, int *ldc, int *sign)
{
	rc2dfft(rdata, cdata, *nr, *nc, *ldr, *ldc, *sign);

	return;
}