subroutine flrfft(isave,ac,as,bc,bs,isign,wgt) c implicit none include 'itg.par' include 'itg.cmn' c define the arguments real ac(lz,mz,nz,nspecz),as(lz,mz,nz,nspecz) real bc(lz,mz,nz,nspecz),bs(lz,mz,nz,nspecz) c declare local workspace real ar(lz*mz*nz),ai(lz*mz*nz) real br(lz*mz*nz),bi(lz*mz*nz) c real trig(2*lz) ! NAG workspace real work(2*lz*mz*nz) ! Nag workspace real wgt(lz*mz*nz) ! flr weight integer ifail ! NAG error code integer isign,isave character init*10 data init / 'Initial' / c declare other local variables integer nmodes,imode,n,m,l,index c ensure that some local variables are saved for future calls save init, trig, ar, ai c start executable code c******************************************************************** nmodes=nd*md if(isave.eq.0) then c reorder field for NAG's usage imode=0 do 1 n=1,nd do 1 m=1,md imode=imode+1 do 1 l=1,ld-1 index=imode+(l-1)*nmodes ar(index)=ac(l,m,n,1) ai(index)=as(l,m,n,1) 1 continue c c do Fourier Transform c ifail=0 call c06frE(nmodes,ld-1,ar,ai,init,trig,work,ifail) init='Subsequent' endif c c isign = 1 -> straight FFT with weight c if(isign.eq.1) then do 2 n=1,nmodes*(ld-1) br(n)=ar(n)*wgt(n) bi(n)=-ai(n)*wgt(n) !c.c. for inverse FFT 2 continue c c isign = 2 -> use for i*wgt*field c else if(isign.eq.2) then do 3 n=1,nmodes*(ld-1) br(n)=-ai(n)*wgt(n) bi(n)=-ar(n)*wgt(n) !c.c. for inverse FFT 3 continue c c isign = 4 -> use for field*abs(k) c else if(isign.eq.4) then do 4 n=1,nmodes*(ld-1) br(n)=ar(n)*abs(wgt(n)) bi(n)=-ai(n)*abs(wgt(n)) !c.c. for inverse FFT 4 continue endif c call c06frE(nmodes,ld-1,br,bi,init,trig,work,ifail) c c reorder c imode=0 do 10 n=1,nd do 10 m=1,md imode=imode+1 do 10 l=1,ld-1 index=imode+(l-1)*nmodes bc(l,m,n,1)=br(index) bs(l,m,n,1)=-bi(index) !c.c. for inverse FFT 10 continue c c enforce b.c.'s if necessary c if(isign.eq.1) call bcon(bc,bs,1,0) c return end