📄 module spharmt.f90
字号:
integer, intent(in) :: n, mode
real :: del, angle,pi
integer :: imode, nn, nh, i, L, la
pi = 4.*atan(1.0)
imode=iabs(mode)
nn=n
if (imode.gt.1.and.imode.lt.6) nn=n/2
del=(pi+pi)/real(nn)
L=nn+nn
do i=1,L,2
angle=0.5*real(i-1)*del
trigs(i)=cos(angle)
trigs(i+1)=sin(angle)
enddo
if (imode.eq.1) return
if (imode.eq.8) return
del=0.5*del
nh=(nn+1)/2
L=nh+nh
la=nn+nn
do i=1,L,2
angle=0.5*real(i-1)*del
trigs(la+i)=cos(angle)
trigs(la+i+1)=sin(angle)
enddo
if (imode.le.3) return
del=0.5*del
la=la+nn
if (mode.ne.5) then
do i=2,nn
angle=real(i-1)*del
trigs(la+i)=2.0*sin(angle)
enddo
return
endif
del=0.5*del
do i=2,n
angle=real(i-1)*del
trigs(la+i)=sin(angle)
enddo
end subroutine fftrig
!##########################################################################
subroutine vpassm (a,b,c,d,trigs,inc1,inc2,inc3,inc4,lot,n,ifac,la)
integer, intent(in) :: inc1, inc2, inc3, inc4, lot, n, ifac, la
real, intent(in) :: a(n),b(n),trigs(n)
real, intent(out) :: c(n),d(n)
!
! subroutine "vpassm" - multiple version of "vpassa"
! performs one pass through data
! as part of multiple complex fft routine
! a is first real input vector
! b is first imaginary input vector
! c is first real output vector
! d is first imaginary output vector
! trigs is precalculated table of sines " cosines
! inc1 is addressing increment for a and b
! inc2 is addressing increment for c and d
! inc3 is addressing increment between a"s & b"s
! inc4 is addressing increment between c"s & d"s
! lot is the number of vectors
! n is length of vectors
! ifac is current factor of n
! la is product of previous factors
!
real :: sin36=0.587785252292473
real :: cos36=0.809016994374947
real :: sin72=0.951056516295154
real :: cos72=0.309016994374947
real :: sin60=0.866025403784437
integer :: i, j, k, L, m, iink, jink, jump, ibase, jbase, igo, ijk, la1
integer :: ia, ja, ib, jb, kb, ic, jc, kc, id, jd, kd, ie, je, ke
real :: c1, s1, c2, s2, c3, s3, c4, s4
m=n/ifac
iink=m*inc1
jink=la*inc2
jump=(ifac-1)*jink
ibase=0
jbase=0
igo=ifac-1
if (igo.gt.4) return
!del go to (10,50,90,130),igo
select case (igo)
! coding for factor 2
case (1)
10 ia=1
ja=1
ib=ia+iink
jb=ja+jink
do 20 L=1,la
i=ibase
j=jbase
do 15 ijk=1,lot
c(ja+j)=a(ia+i)+a(ib+i)
d(ja+j)=b(ia+i)+b(ib+i)
c(jb+j)=a(ia+i)-a(ib+i)
d(jb+j)=b(ia+i)-b(ib+i)
i=i+inc3
j=j+inc4
15 continue
ibase=ibase+inc1
jbase=jbase+inc2
20 continue
if (la.eq.m) return
la1=la+1
jbase=jbase+jump
do 40 k=la1,m,la
kb=k+k-2
c1=trigs(kb+1)
s1=trigs(kb+2)
do 30 L=1,la
i=ibase
j=jbase
do 25 ijk=1,lot
c(ja+j)=a(ia+i)+a(ib+i)
d(ja+j)=b(ia+i)+b(ib+i)
c(jb+j)=c1*(a(ia+i)-a(ib+i))-s1*(b(ia+i)-b(ib+i))
d(jb+j)=s1*(a(ia+i)-a(ib+i))+c1*(b(ia+i)-b(ib+i))
i=i+inc3
j=j+inc4
25 continue
ibase=ibase+inc1
jbase=jbase+inc2
30 continue
jbase=jbase+jump
40 continue
! return
! coding for factor 3
case (2)
50 ia=1
ja=1
ib=ia+iink
jb=ja+jink
ic=ib+iink
jc=jb+jink
do 60 L=1,la
i=ibase
j=jbase
do 55 ijk=1,lot
c(ja+j)=a(ia+i)+(a(ib+i)+a(ic+i))
d(ja+j)=b(ia+i)+(b(ib+i)+b(ic+i))
c(jb+j)=(a(ia+i)-0.5*(a(ib+i)+a(ic+i)))-(sin60*(b(ib+i)-b(ic+i)))
c(jc+j)=(a(ia+i)-0.5*(a(ib+i)+a(ic+i)))+(sin60*(b(ib+i)-b(ic+i)))
d(jb+j)=(b(ia+i)-0.5*(b(ib+i)+b(ic+i)))+(sin60*(a(ib+i)-a(ic+i)))
d(jc+j)=(b(ia+i)-0.5*(b(ib+i)+b(ic+i)))-(sin60*(a(ib+i)-a(ic+i)))
i=i+inc3
j=j+inc4
55 continue
ibase=ibase+inc1
jbase=jbase+inc2
60 continue
if (la.eq.m) return
la1=la+1
jbase=jbase+jump
do 80 k=la1,m,la
kb=k+k-2
kc=kb+kb
c1=trigs(kb+1)
s1=trigs(kb+2)
c2=trigs(kc+1)
s2=trigs(kc+2)
do 70 L=1,la
i=ibase
j=jbase
do 65 ijk=1,lot
c(ja+j)=a(ia+i)+(a(ib+i)+a(ic+i))
d(ja+j)=b(ia+i)+(b(ib+i)+b(ic+i))
c(jb+j)= &
c1*((a(ia+i)-0.5*(a(ib+i)+a(ic+i)))-(sin60*(b(ib+i)-b(ic+i)))) &
-s1*((b(ia+i)-0.5*(b(ib+i)+b(ic+i)))+(sin60*(a(ib+i)-a(ic+i))))
d(jb+j)= &
s1*((a(ia+i)-0.5*(a(ib+i)+a(ic+i)))-(sin60*(b(ib+i)-b(ic+i)))) &
+c1*((b(ia+i)-0.5*(b(ib+i)+b(ic+i)))+(sin60*(a(ib+i)-a(ic+i))))
c(jc+j)= &
c2*((a(ia+i)-0.5*(a(ib+i)+a(ic+i)))+(sin60*(b(ib+i)-b(ic+i)))) &
-s2*((b(ia+i)-0.5*(b(ib+i)+b(ic+i)))-(sin60*(a(ib+i)-a(ic+i))))
d(jc+j)= &
s2*((a(ia+i)-0.5*(a(ib+i)+a(ic+i)))+(sin60*(b(ib+i)-b(ic+i)))) &
+c2*((b(ia+i)-0.5*(b(ib+i)+b(ic+i)))-(sin60*(a(ib+i)-a(ic+i))))
i=i+inc3
j=j+inc4
65 continue
ibase=ibase+inc1
jbase=jbase+inc2
70 continue
jbase=jbase+jump
80 continue
! return
! coding for factor 4
case (3)
90 ia=1
ja=1
ib=ia+iink
jb=ja+jink
ic=ib+iink
jc=jb+jink
id=ic+iink
jd=jc+jink
do 100 L=1,la
i=ibase
j=jbase
do 95 ijk=1,lot
c(ja+j)=(a(ia+i)+a(ic+i))+(a(ib+i)+a(id+i))
c(jc+j)=(a(ia+i)+a(ic+i))-(a(ib+i)+a(id+i))
d(ja+j)=(b(ia+i)+b(ic+i))+(b(ib+i)+b(id+i))
d(jc+j)=(b(ia+i)+b(ic+i))-(b(ib+i)+b(id+i))
c(jb+j)=(a(ia+i)-a(ic+i))-(b(ib+i)-b(id+i))
c(jd+j)=(a(ia+i)-a(ic+i))+(b(ib+i)-b(id+i))
d(jb+j)=(b(ia+i)-b(ic+i))+(a(ib+i)-a(id+i))
d(jd+j)=(b(ia+i)-b(ic+i))-(a(ib+i)-a(id+i))
i=i+inc3
j=j+inc4
95 continue
ibase=ibase+inc1
jbase=jbase+inc2
100 continue
if (la.eq.m) return
la1=la+1
jbase=jbase+jump
do 120 k=la1,m,la
kb=k+k-2
kc=kb+kb
kd=kc+kb
c1=trigs(kb+1)
s1=trigs(kb+2)
c2=trigs(kc+1)
s2=trigs(kc+2)
c3=trigs(kd+1)
s3=trigs(kd+2)
do 110 L=1,la
i=ibase
j=jbase
do 105 ijk=1,lot
c(ja+j)=(a(ia+i)+a(ic+i))+(a(ib+i)+a(id+i))
d(ja+j)=(b(ia+i)+b(ic+i))+(b(ib+i)+b(id+i))
c(jc+j)= &
c2*((a(ia+i)+a(ic+i))-(a(ib+i)+a(id+i))) &
-s2*((b(ia+i)+b(ic+i))-(b(ib+i)+b(id+i)))
d(jc+j)= &
s2*((a(ia+i)+a(ic+i))-(a(ib+i)+a(id+i))) &
+c2*((b(ia+i)+b(ic+i))-(b(ib+i)+b(id+i)))
c(jb+j)= &
c1*((a(ia+i)-a(ic+i))-(b(ib+i)-b(id+i))) &
-s1*((b(ia+i)-b(ic+i))+(a(ib+i)-a(id+i)))
d(jb+j)= &
s1*((a(ia+i)-a(ic+i))-(b(ib+i)-b(id+i))) &
+c1*((b(ia+i)-b(ic+i))+(a(ib+i)-a(id+i)))
c(jd+j)= &
c3*((a(ia+i)-a(ic+i))+(b(ib+i)-b(id+i))) &
-s3*((b(ia+i)-b(ic+i))-(a(ib+i)-a(id+i)))
d(jd+j)= &
s3*((a(ia+i)-a(ic+i))+(b(ib+i)-b(id+i))) &
+c3*((b(ia+i)-b(ic+i))-(a(ib+i)-a(id+i)))
i=i+inc3
j=j+inc4
105 continue
ibase=ibase+inc1
jbase=jbase+inc2
110 continue
jbase=jbase+jump
120 continue
! return
! coding for factor 5
case (4)
130 ia=1
ja=1
ib=ia+iink
jb=ja+jink
ic=ib+iink
jc=jb+jink
id=ic+iink
jd=jc+jink
ie=id+iink
je=jd+jink
do 140 L=1,la
i=ibase
j=jbase
do 135 ijk=1,lot
c(ja+j)=a(ia+i)+(a(ib+i)+a(ie+i))+(a(ic+i)+a(id+i))
d(ja+j)=b(ia+i)+(b(ib+i)+b(ie+i))+(b(ic+i)+b(id+i))
c(jb+j)=(a(ia+i)+cos72*(a(ib+i)+a(ie+i))-cos36*(a(ic+i)+a(id+i))) &
-(sin72*(b(ib+i)-b(ie+i))+sin36*(b(ic+i)-b(id+i)))
c(je+j)=(a(ia+i)+cos72*(a(ib+i)+a(ie+i))-cos36*(a(ic+i)+a(id+i))) &
+(sin72*(b(ib+i)-b(ie+i))+sin36*(b(ic+i)-b(id+i)))
d(jb+j)=(b(ia+i)+cos72*(b(ib+i)+b(ie+i))-cos36*(b(ic+i)+b(id+i))) &
+(sin72*(a(ib+i)-a(ie+i))+sin36*(a(ic+i)-a(id+i)))
d(je+j)=(b(ia+i)+cos72*(b(ib+i)+b(ie+i))-cos36*(b(ic+i)+b(id+i))) &
-(sin72*(a(ib+i)-a(ie+i))+sin36*(a(ic+i)-a(id+i)))
c(jc+j)=(a(ia+i)-cos36*(a(ib+i)+a(ie+i))+cos72*(a(ic+i)+a(id+i))) &
-(sin36*(b(ib+i)-b(ie+i))-sin72*(b(ic+i)-b(id+i)))
c(jd+j)=(a(ia+i)-cos36*(a(ib+i)+a(ie+i))+cos72*(a(ic+i)+a(id+i))) &
+(sin36*(b(ib+i)-b(ie+i))-sin72*(b(ic+i)-b(id+i)))
d(jc+j)=(b(ia+i)-cos36*(b(ib+i)+b(ie+i))+cos72*(b(ic+i)+b(id+i))) &
+(sin36*(a(ib+i)-a(ie+i))-sin72*(a(ic+i)-a(id+i)))
d(jd+j)=(b(ia+i)-cos36*(b(ib+i)+b(ie+i))+cos72*(b(ic+i)+b(id+i))) &
-(sin36*(a(ib+i)-a(ie+i))-sin72*(a(ic+i)-a(id+i)))
i=i+inc3
j=j+inc4
135 continue
ibase=ibase+inc1
jbase=jbase+inc2
140 continue
if (la.eq.m) return
la1=la+1
jbase=jbase+jump
do 160 k=la1,m,la
kb=k+k-2
kc=kb+kb
kd=kc+kb
ke=kd+kb
c1=trigs(kb+1)
s1=trigs(kb+2)
c2=trigs(kc+1)
s2=trigs(kc+2)
c3=trigs(kd+1)
s3=trigs(kd+2)
c4=trigs(ke+1)
s4=trigs(ke+2)
do 150 L=1,la
i=ibase
j=jbase
do 145 ijk=1,lot
c(ja+j)=a(ia+i)+(a(ib+i)+a(ie+i))+(a(ic+i)+a(id+i))
d(ja+j)=b(ia+i)+(b(ib+i)+b(ie+i))+(b(ic+i)+b(id+i))
c(jb+j)= &
c1*((a(ia+i)+cos72*(a(ib+i)+a(ie+i))-cos36*(a(ic+i)+a(id+i))) &
-(sin72*(b(ib+i)-b(ie+i))+sin36*(b(ic+i)-b(id+i)))) &
-s1*((b(ia+i)+cos72*(b(ib+i)+b(ie+i))-cos36*(b(ic+i)+b(id+i))) &
+(sin72*(a(ib+i)-a(ie+i))+sin36*(a(ic+i)-a(id+i))))
d(jb+j)= &
s1*((a(ia+i)+cos72*(a(ib+i)+a(ie+i))-cos36*(a(ic+i)+a(id+i))) &
-(sin72*(b(ib+i)-b(ie+i))+sin36*(b(ic+i)-b(id+i)))) &
+c1*((b(ia+i)+cos72*(b(ib+i)+b(ie+i))-cos36*(b(ic+i)+b(id+i))) &
+(sin72*(a(ib+i)-a(ie+i))+sin36*(a(ic+i)-a(id+i))))
c(je+j)= &
c4*((a(ia+i)+cos72*(a(ib+i)+a(ie+i))-cos36*(a(ic+i)+a(id+i))) &
+(sin72*(b(ib+i)-b(ie+i))+sin36*(b(ic+i)-b(id+i)))) &
-s4*((b(ia+i)+cos72*(b(ib+i)+b(ie+i))-cos36*(b(ic+i)+b(id+i))) &
-(sin72*(a(ib+i)-a(ie+i))+sin36*(a(ic+i)-a(id+i))))
d(je+j)= &
s4*((a(ia+i)+cos72*(a(ib+i)+a(ie+i))-cos36*(a(ic+i)+a(id+i))) &
+(sin72*(b(ib+i)-b(ie+i))+sin36*(b(ic+i)-b(id+i)))) &
+c4*((b(ia+i)+cos72*(b(ib+i)+b(ie+i))-cos36*(b(ic+i)+b(id+i))) &
-(sin72*(a(ib+i)-a(ie+i))+sin36*(a(ic+i)-a(id+i))))
c(jc+j)= &
c2*((a(ia+i)-cos36*(a(ib+i)+a(ie+i))+cos72*(a(ic+i)+a(id+i))) &
-(sin36*(b(ib+i)-b(ie+i))-sin72*(b(ic+i)-b(id+i)))) &
-s2*((b(ia+i)-cos36*(b(ib+i)+b(ie+i))+cos72*(b(ic+i)+b(id+i))) &
+(sin36*(a(ib+i)-a(ie+i))-sin72*(a(ic+i)-a(id+i))))
d(jc+j)= &
s2*((a(ia+i)-cos36*(a(ib+i)+a(ie+i))+cos72*(a(ic+i)+a(id+i))) &
-(sin36*(b(ib+i)-b(ie+i))-sin72*(b(ic+i)-b(id+i)))) &
+c2*((b(ia+i)-cos36*(b(ib+i)+b(ie+i))+cos72*(b(ic+i)+b(id+i))) &
+(sin36*(a(ib+i)-a(ie+i))-sin72*(a(ic+i)-a(id+i))))
c(jd+j)= &
c3*((a(ia+i)-cos36*(a(ib+i)+a(ie+i))+cos72*(a(ic+i)+a(id+i))) &
+(sin36*(b(ib+i)-b(ie+i))-sin72*(b(ic+i)-b(id+i)))) &
-s3*((b(ia+i)-cos36*(b(ib+i)+b(ie+i))+cos72*(b(ic+i)+b(id+i))) &
-(sin36*(a(ib+i)-a(ie+i))-sin72*(a(ic+i)-a(id+i))))
d(jd+j)= &
s3*((a(ia+i)-cos36*(a(ib+i)+a(ie+i))+cos72*(a(ic+i)+a(id+i))) &
+(sin36*(b(ib+i)-b(ie+i))-sin72*(b(ic+i)-b(id+i)))) &
+c3*((b(ia+i)-cos36*(b(ib+i)+b(ie+i))+cos72*(b(ic+i)+b(id+i))) &
-(sin36*(a(ib+i)-a(ie+i))-sin72*(a(ic+i)-a(id+i))))
i=i+inc3
j=j+inc4
145 continue
ibase=ibase+inc1
jbase=jbase+inc2
150 continue
jbase=jbase+jump
160 continue
end select
end subroutine vpassm
end module spharmt
!Welcome!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -