00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #ifndef THYRA_SERIAL_1D_FFT_HPP
00030 #define THYRA_SERIAL_1D_FFT_HPP
00031
00032 #include "Thyra_LinearOpWithSolveBaseDecl.hpp"
00033 #include "Thyra_SingleRhsLinearOpWithSolveBaseDecl.hpp"
00034
00044 template<class RealScalar>
00045 void serial_1D_FFT( RealScalar data[], unsigned long nn, int isign )
00046 {
00047 unsigned long n,mmax,m,j,istep,i;
00048 RealScalar wtemp,wr,wpr,wpi,wi,theta;
00049 RealScalar tempr,tempi;
00050 n=nn << 1;
00051 j=1;
00052 for (i=1;i<n;i+=2) {
00053 if (j > i) {
00054 std::swap(data[j],data[i]);
00055 std::swap(data[j+1],data[i+1]);
00056 }
00057 m=nn;
00058 while (m >= 2 && j > m) {
00059 j -= m;
00060 m >>= 1;
00061 }
00062 j += m;
00063 }
00064
00065 mmax=2;
00066 while (n > mmax) {
00067 istep=mmax << 1;
00068 theta=isign*(6.28318530717959/mmax);
00069 wtemp=sin(0.5*theta);
00070 wpr = -2.0*wtemp*wtemp;
00071 wpi=sin(theta);
00072 wr=1.0;
00073 wi=0.0;
00074 for (m=1;m<mmax;m+=2) {
00075 for (i=m;i<=n;i+=istep) {
00076 j=i+mmax;
00077 tempr=wr*data[j]-wi*data[j+1];
00078 tempi=wr*data[j+1]+wi*data[j];
00079 data[j]=data[i]-tempr;
00080 data[j+1]=data[i+1]-tempi;
00081 data[i] += tempr;
00082 data[i+1] += tempi;
00083 }
00084 wr=(wtemp=wr)*wpr-wi*wpi+wr;
00085 wi=wi*wpr+wtemp*wpi+wi;
00086 }
00087 mmax=istep;
00088 }
00089 }
00090
00091 #endif // THYRA_SERIAL_1D_FFT_HPP