subroutine kparfft(x1,y1,iabs) c c c calculates kpar * x and kpar * y c c or |kpar| * x and |kpar| * y if iabs=1 c include 'itg.par' include 'itg.cmn' real x1(lz,mz,nz,nspecz),y1(lz,mz,nz,nspecz) integer l,iabs,ifail,m,n,imode,nmodes complex a(lz,mz*nz),b(lz,mz*nz),i real scale,work(4*lz*mz*nz) integer isign,nwork,ntablekp nmodes=ldb*nd*md scale=1.0/sqrt(float(ldb)) nwork=4*lz*mz*nz ntablekp=100+2*lz i=(0.0,1.0) do m=1,md do n=1,nd imode=n+(m-1)*nd do l=1,ldb a(l,imode)=cmplx(x1(l,m,n,1),-y1(l,m,n,1)) enddo enddo enddo isign=-1 call xmcfft(isign,ldb,md*nd,scale,a,1,lz,b,1,lz,tablekp, & ntablekp,work,nwork) if (iabs.eq.0) then do imode=1,md*nd do l=1,ldb a(l,imode)=i*kpar(l)*b(l,imode) enddo enddo else do imode=1,md*nd do l=1,ldb a(l,imode)=abs(kpar(l))*b(l,imode) enddo enddo endif isign=1 call xmcfft(isign,ldb,md*nd,scale,a,1,lz,b,1,lz,tablekp, & ntablekp,work,nwork) do m=1,md do n=1,nd imode=n+(m-1)*nd do l=1,ldb x1(l,m,n,1)=real(b(l,imode)) y1(l,m,n,1)=-aimag(b(l,imode)) enddo enddo enddo return end