subroutine kparfft(f,iabs) c c Changing code to default complex notation. bdorland c c calculates i * kpar * f if iabs=-1 c calculates kpar * f if iabs=0 c calculates |kpar|* f if iabs=1 c calculates -i * |kpar|* f if iabs=2 c and f/(1+s_par**4*kpar**4) if iabs=13 c include 'itg.par' include 'itg.cmn' integer l,m,n,iabs,imode complex a(lz*nconz,mz*nz*nspecz),b(lz*nconz,mz*nz*nspecz), . f(lz,mz,nz,nspecz) complex c(lz*nconz),d(lz*nconz) real scale,work(4*lz*mz*nz*nspecz),kparl real ttablekp(101+2*lz*nconz) real sgpar integer isign,nwork,ntablekp nwork=4*lz*mz*nz*nspecz if(iabs.le.0) then do l=1,ldb sgpar=gpar enddo else do l=1,ldb sgpar=abs(gpar) enddo endif c c easiest to use switch for iperiod=3 c if (iperiod.eq.3) then c c do ndom FFTs, of length scon(ndom), with ncon(ndom) modes c do j=1,ndom ntablekp=101+2*lz*nconz scale=1.0/sqrt(float(ldb*scon(j))) do k=1,ntablekp ttablekp(k)=tablekp(j,k) enddo do k=1,ncon(j)*scon(j) do i=1,nspecies m=mmcon(j,k) n=nncon(j,k) imode=mcon(m,n)+(i-1)*ncon(j) do l=1,ldb a(l+ldb*(conpos(m,n)-1),imode)=f(l,m,n,i) enddo enddo enddo isign=-1 c c if number of transforms too small, use cfft c if (ncon(j)*nspecies.lt.2) then do l=1,ldb*scon(j) c(l)=a(l,1) enddo call cfft(isign,ldb*scon(j),scale,c,1, & d,1,ttablekp,ntablekp,work,nwork) do l=1,ldb*scon(j) b(l,1)=d(l) enddo else call xmcfft(isign,ldb*scon(j), & ncon(j)*nspecies,scale,a,1,lz*nconz, & b,1,lz*nconz,ttablekp,ntablekp,work,nwork) endif if (iabs.eq.-1) then do imode=1,ncon(j)*nspecies c for some reason, CRAY tries to vectorize n loop by default: cfpp$ select (vector) do l=1,ldb*scon(j) a(l,imode)=ii*kpar(l,j)*b(l,imode) enddo enddo else if (iabs.eq.0) then do imode=1,ncon(j)*nspecies cfpp$ select (vector) do l=1,ldb*scon(j) a(l,imode)=kpar(l,j)*b(l,imode) enddo enddo else if (iabs.eq.1) then do imode=1,ncon(j)*nspecies cfpp$ select (vector) do l=1,ldb*scon(j) a(l,imode)=abs(kpar(l,j))*b(l,imode) enddo enddo else if (iabs.eq.2) then do imode=1,ncon(j)*nspecies cfpp$ select (vector) do l=1,ldb*scon(j) a(l,imode)=-ii*abs(kpar(l,j))*b(l,imode) enddo enddo else if (iabs.eq.13) then do imode=1,ncon(j)*nspecies c fpp$ select (vector) do l=1,ldb*scon(j) a(l,imode)=b(l,imode) . /(1+(sgpar*kpar(l,j)*s_par)**4) enddo enddo endif isign=1 c c if number of transforms too small, use cfft c if (ncon(j)*nspecies.lt.2) then do l=1,ldb*scon(j) c(l)=a(l,1) enddo call cfft(isign,ldb*scon(j),scale,c,1, & d,1,ttablekp,ntablekp,work,nwork) do l=1,ldb*scon(j) b(l,1)=d(l) enddo else call xmcfft(isign,ldb*scon(j), & ncon(j)*nspecies,scale,a,1,lz*nconz, & b,1,lz*nconz,ttablekp,ntablekp,work,nwork) endif if(iabs.lt.10) then do k=1,ncon(j)*scon(j) do i=1,nspecies m=mmcon(j,k) n=nncon(j,k) imode=mcon(m,n)+(i-1)*ncon(j) do l=1,ldb f(l,m,n,i)=b(l+ldb*(conpos(m,n)-1),imode)*sgpar enddo enddo enddo else do k=1,ncon(j)*scon(j) do i=1,nspecies m=mmcon(j,k) n=nncon(j,k) imode=mcon(m,n)+(i-1)*ncon(j) do l=1,ldb f(l,m,n,i)=b(l+ldb*(conpos(m,n)-1),imode) enddo enddo enddo endif if (ncycle.eq.1) then do k=1,ntablekp tablekp(j,k)=ttablekp(k) enddo endif enddo else c c non-connected way for iperiod=0,1,2 c scale=1.0/sqrt(float(ldb)) nwork=4*lz*mz*nz*nspecz ntablekp=100+2*lz do i=1,nspecies do m=1,md do n=1,nd imode=n+(m-1)*nd+(i-1)*md*nd do l=1,ldb a(l,imode)=f(l,m,n,i) enddo enddo enddo enddo isign=-1 call xmcfft(isign,ldb,md*nd*nspecies,scale,a,1,lz,b,1,lz, & tablekp,ntablekp,work,nwork) if (iabs.eq.-1) then do imode=1,md*nd*nspecies do l=1,ldb a(l,imode)=ii*kpar(l,1)*b(l,imode) enddo enddo else if (iabs.eq.0) then do imode=1,md*nd*nspecies do l=1,ldb a(l,imode)=kpar(l,1)*b(l,imode) enddo enddo else if (iabs.eq.1) then do imode=1,md*nd*nspecies do l=1,ldb a(l,imode)=abs(kpar(l,1))*b(l,imode) enddo enddo else if (iabs.eq.2) then do imode=1,md*nd*nspecies do l=1,ldb a(l,imode)=-ii*abs(kpar(l,1))*b(l,imode) enddo enddo else if (iabs.eq.13) then do imode=1,md*nd*nspecies do l=1,ldb a(l,imode)=b(l,imode) . /(1+(sgpar*kpar(l,1)*s_par)**4) enddo enddo endif isign=1 call xmcfft(isign,ldb,md*nd*nspecies,scale,a,1,lz,b,1,lz, & tablekp,ntablekp,work,nwork) if(iabs.lt.10) then do i=1,nspecies do m=1,md do n=1,nd imode=n+(m-1)*nd+(i-1)*md*nd do l=1,ldb f(l,m,n,i)=b(l,imode)*sgpar enddo enddo enddo enddo else do i=1,nspecies do m=1,md do n=1,nd imode=n+(m-1)*nd+(i-1)*md*nd do l=1,ldb f(l,m,n,i)=b(l,imode) enddo enddo enddo enddo endif endif return end