📄 fourfs.for
字号:
SUBROUTINE fourfs(iunit,nn,ndim,isign)
INTEGER ndim,nn(ndim),isign,iunit(4),KBF
PARAMETER (KBF=128)
CU USES fourew
INTEGER j,j12,jk,k,kk,n,mm,kc,kd,ks,kr,nr,ns,nv,jx,mate(4),na,nb,
*nc,nd
REAL tempr,tempi,afa(KBF),afb(KBF),afc(KBF)
DOUBLE PRECISION wr,wi,wpr,wpi,wtemp,theta
SAVE mate
DATA mate /2,1,4,3/
n=1
do 11 j=1,ndim
n=n*nn(j)
if (nn(j).le.1)pause 'invalid dimension or wrong ndim in fourfs'
11 continue
nv=ndim
jk=nn(nv)
mm=n
ns=n/KBF
nr=ns/2
kc=0
kd=KBF/2
ks=n
call fourew(iunit,na,nb,nc,nd)
1 continue
theta=3.141592653589793d0/(isign*n/mm)
wpr=-2.d0*sin(0.5d0*theta)**2
wpi=sin(theta)
wr=1.d0
wi=0.d0
mm=mm/2
do 13 j12=1,2
kr=0
2 continue
read (iunit(na)) (afa(jx),jx=1,KBF)
read (iunit(nb)) (afb(jx),jx=1,KBF)
do 12 j=1,KBF,2
tempr=sngl(wr)*afb(j)-sngl(wi)*afb(j+1)
tempi=sngl(wi)*afb(j)+sngl(wr)*afb(j+1)
afb(j)=afa(j)-tempr
afa(j)=afa(j)+tempr
afb(j+1)=afa(j+1)-tempi
afa(j+1)=afa(j+1)+tempi
12 continue
kc=kc+kd
if (kc.eq.mm) then
kc=0
wtemp=wr
wr=wr*wpr-wi*wpi+wr
wi=wi*wpr+wtemp*wpi+wi
endif
write (iunit(nc)) (afa(jx),jx=1,KBF)
write (iunit(nd)) (afb(jx),jx=1,KBF)
kr=kr+1
if (kr.lt.nr) goto 2
if(j12.eq.1.and.ks.ne.n.and.ks.eq.KBF) then
na=mate(na)
nb=na
endif
if (nr.eq.0) goto 3
13 continue
3 call fourew(iunit,na,nb,nc,nd)
jk=jk/2
4 if (jk.eq.1) then
mm=n
nv=nv-1
jk=nn(nv)
goto 4
endif
ks=ks/2
if (ks.gt.KBF) then
do 16 j12=1,2
do 15 kr=1,ns,ks/KBF
do 14 k=1,ks,KBF
read (iunit(na)) (afa(jx),jx=1,KBF)
write (iunit(nc)) (afa(jx),jx=1,KBF)
14 continue
nc=mate(nc)
15 continue
na=mate(na)
16 continue
call fourew(iunit,na,nb,nc,nd)
goto 1
else if (ks.eq.KBF) then
nb=na
goto 1
endif
continue
j=1
5 continue
theta=3.141592653589793d0/(isign*n/mm)
wpr=-2.d0*sin(0.5d0*theta)**2
wpi=sin(theta)
wr=1.d0
wi=0.d0
mm=mm/2
ks=kd
kd=kd/2
do 18 j12=1,2
do 17 kr=1,ns
read (iunit(na)) (afc(jx),jx=1,KBF)
kk=1
k=ks+1
6 continue
tempr=sngl(wr)*afc(kk+ks)-sngl(wi)*afc(kk+ks+1)
tempi=sngl(wi)*afc(kk+ks)+sngl(wr)*afc(kk+ks+1)
afa(j)=afc(kk)+tempr
afb(j)=afc(kk)-tempr
afa(j+1)=afc(kk+1)+tempi
afb(j+1)=afc(kk+1)-tempi
j=j+2
kk=kk+2
if (kk.lt.k) goto 6
kc=kc+kd
if (kc.eq.mm) then
kc=0
wtemp=wr
wr=wr*wpr-wi*wpi+wr
wi=wi*wpr+wtemp*wpi+wi
endif
kk=kk+ks
if (kk.le.KBF) then
k=kk+ks
goto 6
endif
if (j.gt.KBF) then
write (iunit(nc)) (afa(jx),jx=1,KBF)
write (iunit(nd)) (afb(jx),jx=1,KBF)
j=1
endif
17 continue
na=mate(na)
18 continue
call fourew(iunit,na,nb,nc,nd)
jk=jk/2
if (jk.gt.1) goto 5
mm=n
7 if (nv.gt.1) then
nv=nv-1
jk=nn(nv)
if (jk.eq.1) goto 7
goto 5
endif
return
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -