subroutine kxspace(ac,as) c implicit none ! force every variable's type to be declared. ! (This is useful as a check for typographical errors.) include 'itg.par' include 'itg.cmn' real as(lz,mz,nz,nspecz),ac(lz,mz,nz,nspecz) c declare local workspace real ar(lz*mz*nz) real ai(lz*mz*nz) real trig(2*lz) ! NAG workspace real work(2*lz*mz*nz) ! Nag workspace real pfilter(lz*mz*nz) ! filter c integer ifail ! NAG error code character init*10 data init / 'Initial' / real dealias(lz-1) ! De-alias grid. 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, pfilter, nmodes, dealias c start executable code-- c******************************************************************** c initialize some arrays only once per run-- c if(init .eq. 'Initial') then nmodes=nd*md c c Define de-aliasing grid-- c do 1 l=0,ld-2 if(l.le.(ld-1)/4 .or. l.ge.3*(ld-1)/4) then dealias(l+1)=1. else dealias(l+1)=0. endif 1 continue c ifail=0 index=0 do 2 l=1,ld-1 do 2 n=1,nd do 2 m=1,md index=index+1 c c Filter out high kx's-- c pfilter(index)=dealias(l) 2 continue endif c end of initialization section c********************************************************************* c reorder for NAG's usage-- imode=0 do 20 n=1,nd do 20 m=1,md imode=imode+1 do 20 l=1,ld-1 index=imode+(l-1)*nmodes ar(index)=ac(l,m,n,1) ai(index)=as(l,m,n,1) 20 continue c do Fourier Transform-- ifail=0 call c06frE(nmodes,ld-1,ar,ai,init,trig,work,ifail) init='Subsequent' c do 50 index=1,nmodes*(ld-1) ar(index)=ar(index)*pfilter(index) ai(index)=-ai(index)*pfilter(index) !c.c. for inverse FFT 50 continue call c06frE(nmodes,ld-1,ar,ai,init,trig,work,ifail) c c reorder-- imode=0 do 70 n=1,nd do 70 m=1,md imode=imode+1 do 70 l=1,ld-1 index=imode+(l-1)*nmodes ac(l,m,n,1)=ar(index) as(l,m,n,1)=-ai(index) !c.c. for inverse FFT 70 continue call bcon(ac,as,1,0) c return end