From 5b7884bf5ac56324ff52a3e427ef68c350193b09 Mon Sep 17 00:00:00 2001
From: JBrackenhoff <J.A.Brackenhoff@tudelft.nl>
Date: Wed, 10 Jun 2020 19:49:52 +0200
Subject: [PATCH] fftlib

---
 FFTlib/wkykx2yxt.c | 113 +++++++++++++++++++++++++++++++++++++++++++++
 FFTlib/yxt2wkykx.c | 108 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 221 insertions(+)
 create mode 100644 FFTlib/wkykx2yxt.c
 create mode 100644 FFTlib/yxt2wkykx.c

diff --git a/FFTlib/wkykx2yxt.c b/FFTlib/wkykx2yxt.c
new file mode 100644
index 0000000..109a4aa
--- /dev/null
+++ b/FFTlib/wkykx2yxt.c
@@ -0,0 +1,113 @@
+#include "genfft.h"
+
+/**
+NAME:   wkx2xt
+
+DESCRIPTION:
+        2 Dimensional complex to real FFT (omega,kx -> x,t) with scaling
+
+USAGE:
+        void wkx2xt(complex *cdata, REAL *rdata, int nt, int nx,
+                    int ldc, int ldr, int xorig)
+
+INPUT:
+        - *cdata: complex 2D input array [nf][nkx]
+        -     nt: number of real (fast) output samples
+        -     nx: number of complex (slow) samples to be transformed
+        -    ldc: leading dimension (number of complex samples)
+        -    ldr: leading dimension (number of real samples)
+        -  xorig: trace number of origin of x-axis first trace # 0 
+
+OUTPUT: - *rdata: real 2D output array scaled [nx][nt]
+
+AUTHOR:
+           Jan Thorbecke (janth@xs4all.nl)
+           The Netherlands
+----------------------------------------------------------------------*/
+
+void wkykx2yxt(complex *cdata, REAL *rdata, long nt, long nx, long ny, long ldt, long ldx, long ldy, long xorig, long yorig)
+{
+	int     i, j, k, ld1, sign, nxorig, nyorig;
+	REAL   scl;
+	complex *cdum;
+
+
+	assert ( (xorig >= 0) && (xorig < nx) );
+	assert ( (yorig >= 0) && (yorig < ny) );
+	scl = 1.0/(nt*nx*ny);
+	ld1 = (nt+2)/2;
+	nxorig = nx-xorig;
+	nyorig = ny-yorig;
+
+    cdum = (complex *)malloc(ld1*ldx*ldy*sizeof(complex));    
+
+	sign = -1;
+	// ctrans [nkx][nf][nky]
+	for (i = 0; i < ldx; i++) {
+		for (j = 0; j < ld1; j++) {
+			for (k = 0; k < ldy; k++) {
+				cdum[i*ld1*ldy+j*ldy+k] = cdata[j*ldy*ldx+k*ldx+i];
+			}
+		}
+		ccmfft(&cdum[i*ld1*ldy], ny, ld1, ldy, sign);
+	}
+
+	// cdata [nf][nky][nkx]
+	for (k = 0; k < ldy; k++) {
+		for (j = 0; j < ld1; j++) {
+			for (i = 0; i < ldx; i++) {
+				cdata[k*ld1*ldx+j*ldx+i] = cdum[i*ld1*ldy+j*ldy+k];
+			}
+		}
+		ccmfft(&cdata[k*ld1*ldx], nx, ld1, ldx, sign);
+	}
+	free(cdum);
+
+	cdum = (complex *)malloc(ld1*nx*ny*sizeof(complex));
+	if (cdum == NULL) fprintf(stderr,"wkx2xt: memory allocation error\n");
+	
+    //cdum [ny][nx][nf]
+	for (j = 0; j < ld1; j++) {
+        for (k = 0; k < nyorig; k++) {
+            for (i = 0; i < nxorig; i++) {
+                cdum[(k+yorig)*nx*ld1+(i+xorig)*ld1+j] = cdata[k*ld1*ldx+j*ldx+i];
+            }
+            for(i = 0; i < xorig; i++) {
+                cdum[(k+yorig)*nx*ld1+i*ld1+j] = cdata[k*ld1*ldx+j*ldx+i+nxorig];
+            }
+        }
+        for (k = 0; k < yorig; k++) {
+            for (i = 0; i < nxorig; i++) {
+                cdum[k*nx*ld1+(i+xorig)*ld1+j] = cdata[k*ld1*ldx+j*ldx+i];
+            }
+            for(i = 0; i < xorig; i++) {
+                cdum[k*nx*ld1+i*ld1+j] = cdata[k*ld1*ldx+j*ldx+i+nxorig];
+            }
+        }
+	}
+
+	sign = 1;
+	crmfft(cdum, rdata, nt, nx*ny, ld1, ldt, sign);
+
+	for(i = 0; i < nx*ny*ldt; i++) rdata[i] *= scl;
+
+	free(cdum);
+
+	return;
+}
+
+/****************** FORTRAN SHELL *****************/
+
+#ifdef DF_CAPFNAMES
+#define nwkykx2yxt	FNAME(WKYKX2YXTF)
+#else
+#define nwkykx2yxt	FNAME(wkykx2yxtf)
+#endif
+
+void nwkykx2yxt(complex *cdata, REAL *rdata, int *nt, int *nx, int *ny, int *ldt, int *ldx, int *ldy, int *xorig, int *yorig)
+{
+
+	wkykx2yxt(cdata, rdata, *nt, *nx, *ny, *ldt, *ldx, *ldy, *xorig, *yorig);
+
+	return;
+}
diff --git a/FFTlib/yxt2wkykx.c b/FFTlib/yxt2wkykx.c
new file mode 100644
index 0000000..53a236b
--- /dev/null
+++ b/FFTlib/yxt2wkykx.c
@@ -0,0 +1,108 @@
+#include "genfft.h"
+
+/**
+NAME:   xt2wkx
+
+DESCRIPTION:
+        2 Dimensional real to complex FFT (x,t -> omega,kx) with scaling
+
+USAGE:
+        void xt2wkx(REAL *rdata, complex *cdata, int nt, int nx,
+                    int ldr, int ldc, int xorig)
+
+INPUT:
+        - *rdata: real 2D input array [ny][nx][nt]
+        -     nt: number of real (fast) output samples
+        -     nx: number of complex (slow) samples to be transformed
+        -     ny: number of complex (slow) samples to be transformed
+        -    ldt: leading dimension (number of real samples)
+        -    ldx: leading dimension (number of complex samples)
+        -    ldy: leading dimension (number of complex samples)
+        -  xorig: trace number of origin of x-axis first trace # 0
+        -  yorig: trace number of origin of y-axis first trace # 0
+
+OUTPUT: - *cdata: complex 2D output array scaled [nf][nky][nkx]
+
+AUTHOR:
+           Jan Thorbecke (janth@xs4all.nl)
+           The Netherlands
+----------------------------------------------------------------------*/
+
+void yxt2wkykx(REAL *rdata, complex *cdata, long nt, long nx, long ny, long ldt, long ldx, long ldy, long xorig, long yorig)
+{
+	long     i, j, k, ld1, sign;
+	complex *cdum;
+
+	assert ( (xorig >= 0) && (xorig < nx) );
+	assert ( (yorig >= 0) && (yorig < ny) );
+	ld1 = (nt+2)/2;
+	cdum = (complex *)malloc(ld1*nx*ny*sizeof(complex));
+	if (cdum == NULL) fprintf(stderr,"yxt2wkykx: memory allocation error\n");
+
+	sign = -1;
+	rcmfft(rdata, cdum, nt, nx*ny, ldt, ld1, sign);
+
+	// cdata[nky][nf][nkx] = cdum[ny][nx][nf]
+	for(j = 0; j < ld1; j++) {
+		for(k = yorig; k < ny; k++) {
+			for(i = xorig; i < nx; i++) {
+				cdata[(k-yorig)*ld1*ldx+j*ldx+(i-xorig)] = cdum[k*nx*ld1+i*ld1+j];
+			}
+			for(i = 0; i < xorig; i++) {
+				cdata[(k-yorig)*ld1*ldx+j*ldx+(nx-xorig+i)] = cdum[k*nx*ld1+i*ld1+j];
+			}
+		}
+		for(k = 0; k < yorig; k++) {
+			for(i = xorig; i < nx; i++) {
+				cdata[(ny-yorig+k)*ld1*ldx+j*ldx+(i-xorig)] = cdum[k*nx*ld1+i*ld1+j];
+			}
+			for(i = 0; i < xorig; i++) {
+				cdata[(ny-yorig+k)*ld1*ldx+j*ldx+(nx-xorig+i)] = cdum[k*nx*ld1+i*ld1+j];
+			}
+		}
+	}
+
+	free(cdum);
+
+	cdum = (complex *)malloc(ld1*ldx*ldy*sizeof(complex));
+
+	sign = 1;
+	// cdum[nkx][nf][nky] = cdata[nky][nf][nkx]
+	for (k = 0; k < ldy; k++) {
+		ccmfft(&cdata[k*ld1*ldx], nx, ld1, ldx, sign);
+		for (j = 0; j < ld1; j++) {
+			for (i = 0; i < ldx; i++) {
+				cdum[i*ld1*ldy+j*ldy+k] = cdata[k*ld1*ldx+j*ldx+i];
+			}
+		}
+	}
+
+	// cdata [nf][nky][nkx] = cdum[nkx][nf][nky]
+	for (i = 0; i < ldx; i++) {
+		ccmfft(&cdum[i*ld1*ldy], ny, ld1, ldy, sign);
+		for (j = 0; j < ld1; j++) {
+			for (k = 0; k < ldy; k++) {
+				cdata[j*ldy*ldx+k*ldx+i] = cdum[i*ld1*ldy+j*ldy+k];
+			}
+		}
+	}
+	free(cdum);
+
+	return;
+}
+
+/****************** FORTRAN SHELL *****************/
+
+#ifdef DF_CAPFNAMES
+#define nynxt2wkykx FNAME(YXT2WKYKXF)
+#else
+#define nynxt2wkykx FNAME(yxt2wkykxf)
+#endif
+
+void nynxt2wkykx(REAL *rdata, complex *cdata, int *nt, int *nx, int *ny, int *ldt, int *ldx, int *ldy, int *xorig, int *yorig)
+{
+
+	yxt2wkykx(rdata, cdata, *nt, *nx, *ny, *ldt, *ldx, *ldy, *xorig, *yorig);
+
+	return;
+}
-- 
GitLab