void fourn(Doub *data, VecInt_I &nn, const Int isign) { Int idim,i1,i2,i3,i2rev,i3rev,ip1,ip2,ip3,ifp1,ifp2; Int ibit,k1,k2,n,nprev,nrem,ntot=1,ndim=nn.size(); Doub tempi,tempr,theta,wi,wpi,wpr,wr,wtemp; for (idim=0;idim=0;idim--) { n=nn[idim]; nrem=ntot/(n*nprev); ip1=nprev << 1; ip2=ip1*n; ip3=ip2*nrem; i2rev=0; for (i2=0;i2> 1; while (ibit >= ip1 && i2rev+1 > ibit) { i2rev -= ibit; ibit >>= 1; } i2rev += ibit; } ifp1=ip1; while (ifp1 < ip2) { ifp2=ifp1 << 1; theta=isign*6.28318530717959/(ifp2/ip1); wtemp=sin(0.5*theta); wpr= -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (i3=0;i3> 1; if (isign == 1) { fourn(data,nn,isign); k1=0; for (i1=0;i1>1);i3+=2) { k1=i1*nn2*nn3; k3=j1*nn2*nn3; for (i2=0;i2