19 integer,
intent(in) :: n
20 integer :: m,p,nleft,nfactors,square_free
32 if(mod(nleft,p)==0)
then
37 square_free=square_free*p
38 do while(mod(nleft,p)==0)
54 square_free=square_free*nleft
83 integer,
intent(in) :: n
84 character(len=128) :: description
85 character(len=24) :: item
86 integer :: left,p,power,used
90 write(description,
'(i0)') n
99 do while(mod(left,p)==0)
107 write(item,
'(i0,a,i0)') p,
'^',power
109 if(used>0) description=trim(description)//
' * '
110 description=trim(description)//trim(item)
120 write(item,
'(i0)') left
121 if(used>0) description=trim(description)//
' * '
122 description=trim(description)//trim(item)
124 if(len_trim(description)==0) description=
'1'
152 double complex,
intent(inout) :: data(:,:)
153 logical,
intent(in) :: inverse
154 double precision,
allocatable :: ar(:),ai(:)
155 integer :: n1,n2,ntot,isign
160 error stop
'fft_2d: unsupported transform size'
163 allocate(ar(ntot),ai(ntot))
164 ar=reshape(dble(data),[ntot])
165 ai=reshape(dimag(data),[ntot])
171 call fft_raw(ar,ai,ntot,n1,n1,isign)
172 call fft_raw(ar,ai,ntot,n2,ntot,isign)
173 data=reshape(dcmplx(ar,ai),shape(data))
174 if(inverse) data=data/dble(ntot)
249 double precision :: a(*),b(*)
253 dimension nfac(11),np(209)
255 dimension at(23),ck(23),bt(23),sk(23)
256 double precision :: c72,s72,s120,rad,radf,sd,cd,ak,bk,c1
257 double precision :: s1,aj,bj,akp,ajp,ajm,akm,bkp,bkm,bjp,bjm,aa
258 double precision :: bb,sk,ck,at,bt,s3,c3,s2,c2
259 integer :: i,ii,maxp,maxf,n,inc,isn,nt,ntot,ks,nspan,kspan,nn,jc,jf,m
260 integer :: k,j,jj,nfac,kt,np,kk,k1,k2,k3,k4,kspnn
274 c72=0.30901699437494742d0
275 s72=0.95105651629515357d0
276 s120=0.86602540378443865d0
277 rad=6.2831853071796d0
278 if(isn .ge. 0)
go to 10
288 radf=rad*dble(jc)*0.5d0
298 20
if(k-(k/16)*16 .eq. 0)
go to 15
305 30
if(mod(k,jj) .eq. 0)
go to 25
308 if(jj .le. k)
go to 30
309 if(k .gt. 4)
go to 40
314 40
if(k-(k/4)*4 .ne. 0)
go to 50
320 60
if(mod(k,j) .ne. 0)
go to 70
325 if(j .le. k)
go to 60
326 80
if(kt .eq. 0)
go to 100
331 if(j .ne. 0)
go to 90
333 100 sd=radf/dble(kspan)
338 if(nfac(i) .ne. 2)
go to 400
350 if(kk .le. nn)
go to 210
352 if(kk .le. jc)
go to 210
353 if(kk .gt. kspan)
go to 800
364 if(kk .lt. nt)
go to 230
368 if(kk .gt. k2)
go to 230
371 c1=2.d0-(ak**2+s1**2)
375 if(kk .lt. k2)
go to 230
378 if(kk .le. jc+jc)
go to 220
391 aj=(a(k1)-a(k2))*s120
392 bj=(b(k1)-b(k2))*s120
398 if(kk .lt. nn)
go to 320
400 if(kk .le. kspan)
go to 320
403 400
if(nfac(i) .ne. 4)
go to 600
423 if(isn .lt. 0)
go to 450
428 if(s1 .eq. 0.d0)
go to 460
429 430 a(k1)=akp*c1-bkp*s1
436 if(kk .le. nt)
go to 420
437 440 c2=c1-(cd*c1+sd*s1)
439 c1=2.d0-(c2**2+s1**2)
447 if(kk .le. kspan)
go to 420
449 if(kk .le. jc)
go to 410
450 if(kspan .eq. jc)
go to 800
456 if(s1 .ne. 0)
go to 430
464 if(kk .le. nt)
go to 420
502 if(kk .lt. nn)
go to 520
504 if(kk .le. kspan)
go to 520
510 if(k .eq. 3)
go to 320
511 if(k .eq. 5)
go to 510
512 if(k .eq. jf)
go to 640
517 if(jf .gt. maxf)
go to 998
521 630 ck(j)=ck(k)*c1+sk(k)*s1
522 sk(j)=ck(k)*s1-sk(k)*c1
527 if(j .lt. k)
go to 630
546 if(k1 .lt. k2)
go to 650
567 if(jj .gt. jf) jj=jj-jf
568 if(k .lt. jf)
go to 670
575 if(j .lt. k)
go to 660
577 if(kk .le. nn)
go to 640
579 if(kk .le. kspan)
go to 640
581 700
if(i .eq. m)
go to 800
592 if(kk .le. nt)
go to 730
597 if(kk .le. kspnn)
go to 730
600 c1=2.d0-(c2**2+s1**2)
604 if(kk .le. kspan)
go to 720
606 if(kk .le. jc+jc)
go to 710
611 if(kt .eq. 0)
go to 890
616 810 np(j+1)=np(j)/nfac(j)
617 np(k)=np(k+1)*nfac(j)
620 if(j .lt. k)
go to 810
626 if(n .ne. ntot)
go to 850
636 if(k2 .lt. ks)
go to 820
640 if(k2 .gt. np(j))
go to 830
642 840
if(kk .lt. k2)
go to 820
645 if(k2 .lt. ks)
go to 840
646 if(kk .lt. ks)
go to 830
659 if(kk .lt. k)
go to 860
662 if(kk .lt. nt)
go to 850
665 if(k2 .lt. ks)
go to 850
669 if(k2 .gt. np(j))
go to 870
671 880
if(kk .lt. k2)
go to 850
674 if(k2 .lt. ks)
go to 880
675 if(kk .lt. ks)
go to 870
677 890
if(2*kt+1 .ge. m)
return
682 900 nfac(j)=nfac(j)*nfac(j+1)
684 if(j .ne. kt)
go to 900
687 if(nn .gt. maxp)
go to 998
696 if(jj .ge. k2)
go to 902
702 if(j .le. nn)
go to 904
709 if(kk .ne. j)
go to 910
713 if(kk .lt. 0)
go to 914
714 if(kk .ne. j)
go to 910
716 if(j .ne. nn)
go to 914
721 if(np(j) .lt. 0)
go to 924
724 if(jj .gt. maxf) kspan=maxf
734 if(k1 .ne. kk)
go to 928
742 if(k1 .ne. kk)
go to 936
744 if(k .ne. j)
go to 932
751 if(k1 .ne. kk)
go to 940
752 if(jj .ne. 0)
go to 926
753 if(j .ne. 1)
go to 924
757 if(nt .ge. 0)
go to 924
763 999
format(44h0array bounds exceeded within
subroutine fft)
subroutine, public fft_2d_real_imag(ar, ai, inverse)
In-place two-dimensional FFT on split real/imaginary storage. This avoids allocation and copying in r...