FUNCTION pimach(dum)
!***BEGIN PROLOGUE PIMACH
!
! This subprogram supplies the value of the constant PI correct to
! machine precision where
!
! PI=3.1415926535897932384626433832795028841971693993751058209749446
!***ROUTINES CALLED (NONE)
!***END PROLOGUE PIMACH
!
!***FIRST EXECUTABLE STATEMENT PIMACH
pimach = 3.14159265358979
RETURN
END FUNCTION pimach
SUBROUTINE vcost(m,n,x,xt,mdimx,wsave) 8,1
!***BEGIN PROLOGUE VCOST
!***DATE WRITTEN 860701 (YYMMDD)
!***REVISION DATE 900509 (YYMMDD)
!***CATEGORY NO. J1A3
!***KEYWORDS FAST FOURIER TRANSFORM, COSINE TRANSFORM, MULTIPLE
! SEQUENCES
!***AUTHOR BOISVERT, R. F. (NIST)
!***PURPOSE Cosine transform of one or more real, even sequences.
!***DESCRIPTION
!
! Subroutine VCOST computes the discrete Fourier cosine transform
! of M even sequences X(J,I), J=1,...,M. The transform is defined
! below at output parameter X.
!
! The array WSAVE which is used by subroutine VCOST must be
! initialized by calling subroutine VCOSTI(N,WSAVE).
!
! Input Parameters
!
! M the number of sequences to be transformed.
!
! N the length of the sequence to be transformed. N must be
! greater than 1. The method is most efficient when N-1 is
! is a product of small primes.
!
! X an array of size at least X(MDIMX,N) which contains the
! the sequences to be transformed. The sequences are stored
! in the ROWS of X. Thus, the Jth sequence is stored in
! X(J,I), I=1,..,N.
!
! XT a work array of size at least XT(MDIMX,N-1).
!
! MDIMX the first dimension of the array X exactly as it appears in
! the calling program.
!
! WSAVE a work array which must be dimensioned at least 3*N+15
! in the program that calls VCOST. The WSAVE array must be
! initialized by calling subroutine VCOSTI(N,WSAVE), and a
! different WSAVE array must be used for each different
! value of N. This initialization does not have to be
! repeated so long as N remains unchanged. Thus subsequent
! transforms can be obtained faster than the first.
!
! Output Parameters
!
! X For I=1,...,N and J=1,...,M
!
! X(J,I) = ( X(J,1)+(-1)**(I-1)*X(J,N)
!
! + the sum from K=2 to K=N-1
!
! 2*X(J,K)*COS((K-1)*(I-1)*PI/(N-1)) )/SQRT(2*(N-1))
!
! WSAVE contains initialization calculations which must not be
! destroyed between calls of VCOST.
!
! -----------------------------------------------------------------
!
! NOTE - A call of VCOST followed immediately by another call
! of VCOST will return the original sequences X. Thus,
! VCOST is the correctly normalized inverse of itself.
!
! -----------------------------------------------------------------
!
! VCOST is a straightforward extension of the subprogram COST to
! handle M simultaneous sequences. The scaling of the sequences
! computed by VCOST is different than that of COST. COST was
! originally developed by P. N. Swarztrauber of NCAR.
!
!***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
! Computations, (G. Rodrigue, ed.), Academic Press, 1982,
! pp. 51-83.
!***ROUTINES CALLED VRFFTF
!***END PROLOGUE VCOST
DIMENSION x(mdimx,*), xt(mdimx,*), wsave(*)
!***FIRST EXECUTABLE STATEMENT VCOST
IF (m <= 0) GO TO 900
IF (n <= 1) GO TO 900
IF (n > 3) GO TO 400
IF (n == 3) GO TO 300
!
! CASE N = 2
!
scale = SQRT(0.50E0)
DO j=1,m
x1h = scale*(x(j,1)+x(j,2))
x(j,2) = scale*(x(j,1)-x(j,2))
x(j,1) = x1h
END DO
GO TO 900
!
! CASE N = 3
!
300 CONTINUE
scale = 0.50E0
DO j=1,m
x1p3 = x(j,1)+x(j,3)
tx2 = x(j,2)+x(j,2)
x(j,2) = scale*(x(j,1)-x(j,3))
x(j,1) = scale*(x1p3+tx2)
x(j,3) = scale*(x1p3-tx2)
END DO
GO TO 900
!
! CASE N .GT. 3
!
! ... PREPROCESSING
!
400 CONTINUE
nm1 = n-1
np1 = n+1
ns2 = n/2
DO j=1,m
xt(j,1) = x(j,1)-x(j,n)
x(j,1) = x(j,1)+x(j,n)
END DO
DO k=2,ns2
kc = np1-k
DO j=1,m
t1 = x(j,k)+x(j,kc)
t2 = x(j,k)-x(j,kc)
xt(j,1) = xt(j,1)+wsave(kc)*t2
t2 = wsave(k)*t2
x(j,k) = t1-t2
x(j,kc) = t1+t2
END DO
END DO
modn = MOD(n,2)
IF (modn /= 0) THEN
DO j=1,m
x(j,ns2+1) = x(j,ns2+1)+x(j,ns2+1)
END DO
END IF
DO j=1,m
x(j,n) = xt(j,1)
END DO
!
! ... REAL PERIODIC TRANSFORM
!
CALL vrfftf
(m,nm1,x,xt,mdimx,wsave(np1))
!
! ... POSTPROCESSING
!
factor = 1.0/SQRT(REAL(nm1))
DO j=1,m
xt(j,1) = x(j,2)
x(j,2) = factor*x(j,n)
END DO
DO i=4,n,2
DO j=1,m
xi = x(j,i)
x(j,i) = x(j,i-2)-x(j,i-1)
x(j,i-1) = xt(j,1)
xt(j,1) = xi
END DO
END DO
IF (modn /= 0) THEN
DO j=1,m
x(j,n) = xt(j,1)
END DO
END IF
!
! ... NORMALIZATION
!
scale = SQRT(0.5)
DO i=1,n
DO j=1,m
x(j,i) = scale*x(j,i)
END DO
END DO
!
! EXIT
!
900 CONTINUE
RETURN
END SUBROUTINE vcost
SUBROUTINE vcosti(n,wsave) 8,1
!***BEGIN PROLOGUE VCOSTI
!***DATE WRITTEN 860701 (YYMMDD)
!***REVISION DATE 900509 (YYMMDD)
!***CATEGORY NO. J1A3
!***KEYWORDS FAST FOURIER TRANSFORM, COSINE TRANSFORM, MULTIPLE
! SEQUENCES
!***AUTHOR BOISVERT, R. F. (NIST)
!***PURPOSE Initialize for VCOST.
!***DESCRIPTION
!
! Subroutine VCOSTI initializes the array WSAVE which is used in
! subroutine VCOST. The prime factorization of N together with
! a tabulation of the trigonometric functions are computed and
! stored in WSAVE.
!
! Input Parameter
!
! N the length of the sequence to be transformed. The method
! is most efficient when N-1 is a product of small primes.
!
! Output Parameter
!
! WSAVE a work array which must be dimensioned at least 3*N+15.
! Different WSAVE arrays are required for different values
! of N. The contents of WSAVE must not be changed between
! calls of VCOST.
!
! -----------------------------------------------------------------
!
! VCOSTI is a straightforward extension of the subprogram COSTI to
! handle M simultaneous sequences. COSTI was originally developed
! by P. N. Swarztrauber of NCAR.
!
!***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
! Computations, (G. Rodrigue, ed.), Academic Press, 1982,
! pp. 51-83.
!***ROUTINES CALLED VRFFTI
!***END PROLOGUE VCOSTI
DIMENSION wsave(*)
!***FIRST EXECUTABLE STATEMENT VCOSTI
pi = pimach(1.0)
IF (n <= 3) RETURN
nm1 = n-1
np1 = n+1
ns2 = n/2
dt = pi/REAL(nm1)
fk = 0.
DO k=2,ns2
fk = fk+1.
wsave(k) = 2.*SIN(fk*dt)
END DO
fk = 0.
DO k=2,ns2
kc = np1-k
fk = fk+1.
wsave(kc) = 2.*COS(fk*dt)
END DO
CALL vrffti
(nm1,wsave(n+1))
RETURN
END SUBROUTINE vcosti
SUBROUTINE vradb2 (mp,ido,l1,cc,ch,mdimc,wa1) 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION cc(mdimc,ido,2,l1) ,ch(mdimc,ido,l1,2), &
wa1(ido)
DO k=1,l1
DO m=1,mp
ch(m,1,k,1) = cc(m,1,1,k)+cc(m,ido,2,k)
ch(m,1,k,2) = cc(m,1,1,k)-cc(m,ido,2,k)
END DO
END DO
IF (ido-2 < 0) THEN
GO TO 107
ELSE IF (ido-2 == 0) THEN
GO TO 105
END IF
idp2 = ido+2
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
ch(m,i-1,k,1) = cc(m,i-1,1,k)+cc(m,ic-1,2,k)
ch(m,i,k,1) = cc(m,i,1,k)-cc(m,ic,2,k)
ch(m,i-1,k,2) = wa1(i-2)*(cc(m,i-1,1,k)-cc(m,ic-1,2,k)) &
-wa1(i-1)*(cc(m,i,1,k)+cc(m,ic,2,k))
ch(m,i,k,2) = wa1(i-2)*(cc(m,i,1,k)+cc(m,ic,2,k))+wa1(i-1) &
*(cc(m,i-1,1,k)-cc(m,ic-1,2,k))
END DO
END DO
END DO
IF (MOD(ido,2) == 1) RETURN
105 DO k=1,l1
DO m=1,mp
ch(m,ido,k,1) = cc(m,ido,1,k)+cc(m,ido,1,k)
ch(m,ido,k,2) = -(cc(m,1,2,k)+cc(m,1,2,k))
END DO
END DO
107 RETURN
END SUBROUTINE vradb2
SUBROUTINE vradb3 (mp,ido,l1,cc,ch,mdimc,wa1,wa2) 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION cc(mdimc,ido,3,l1) ,ch(mdimc,ido,l1,3), &
wa1(ido) ,wa2(ido)
arg=2.*pimach(1.0)/3.
taur=COS(arg)
taui=SIN(arg)
DO k=1,l1
DO m=1,mp
ch(m,1,k,1) = cc(m,1,1,k)+2.*cc(m,ido,2,k)
ch(m,1,k,2) = cc(m,1,1,k)+(2.*taur)*cc(m,ido,2,k) &
-(2.*taui)*cc(m,1,3,k)
ch(m,1,k,3) = cc(m,1,1,k)+(2.*taur)*cc(m,ido,2,k) &
+2.*taui*cc(m,1,3,k)
END DO
END DO
IF (ido == 1) RETURN
idp2 = ido+2
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
ch(m,i-1,k,1) = cc(m,i-1,1,k)+(cc(m,i-1,3,k)+cc(m,ic-1,2,k))
ch(m,i,k,1) = cc(m,i,1,k)+(cc(m,i,3,k)-cc(m,ic,2,k))
ch(m,i-1,k,2) = wa1(i-2)* &
((cc(m,i-1,1,k)+taur*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))- &
(taui*(cc(m,i,3,k)+cc(m,ic,2,k)))) &
-wa1(i-1)* &
((cc(m,i,1,k)+taur*(cc(m,i,3,k)-cc(m,ic,2,k)))+ &
(taui*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))))
ch(m,i,k,2) = wa1(i-2)* &
((cc(m,i,1,k)+taur*(cc(m,i,3,k)-cc(m,ic,2,k)))+ &
(taui*(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))) &
+wa1(i-1)* &
((cc(m,i-1,1,k)+taur*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))- &
(taui*(cc(m,i,3,k)+cc(m,ic,2,k))))
ch(m,i-1,k,3) = wa2(i-2)* &
((cc(m,i-1,1,k)+taur*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))+ &
(taui*(cc(m,i,3,k)+cc(m,ic,2,k)))) &
-wa2(i-1)* &
((cc(m,i,1,k)+taur*(cc(m,i,3,k)-cc(m,ic,2,k)))- &
(taui*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))))
ch(m,i,k,3) = wa2(i-2)* &
((cc(m,i,1,k)+taur*(cc(m,i,3,k)-cc(m,ic,2,k)))- &
(taui*(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))) &
+wa2(i-1)* &
((cc(m,i-1,1,k)+taur*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))+ &
(taui*(cc(m,i,3,k)+cc(m,ic,2,k))))
END DO
END DO
END DO
RETURN
END SUBROUTINE vradb3
SUBROUTINE vradb4 (mp,ido,l1,cc,ch,mdimc,wa1,wa2,wa3) 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION cc(mdimc,ido,4,l1) ,ch(mdimc,ido,l1,4) , &
wa1(ido) ,wa2(ido) ,wa3(ido)
sqrt2=SQRT(2.)
DO k=1,l1
DO m=1,mp
ch(m,1,k,3) = (cc(m,1,1,k)+cc(m,ido,4,k)) &
-(cc(m,ido,2,k)+cc(m,ido,2,k))
ch(m,1,k,1) = (cc(m,1,1,k)+cc(m,ido,4,k)) &
+(cc(m,ido,2,k)+cc(m,ido,2,k))
ch(m,1,k,4) = (cc(m,1,1,k)-cc(m,ido,4,k)) &
+(cc(m,1,3,k)+cc(m,1,3,k))
ch(m,1,k,2) = (cc(m,1,1,k)-cc(m,ido,4,k)) &
-(cc(m,1,3,k)+cc(m,1,3,k))
END DO
END DO
IF (ido-2 < 0) THEN
GO TO 107
ELSE IF (ido-2 == 0) THEN
GO TO 105
END IF
idp2 = ido+2
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
ch(m,i-1,k,1) = (cc(m,i-1,1,k)+cc(m,ic-1,4,k)) &
+(cc(m,i-1,3,k)+cc(m,ic-1,2,k))
ch(m,i,k,1) = (cc(m,i,1,k)-cc(m,ic,4,k)) &
+(cc(m,i,3,k)-cc(m,ic,2,k))
ch(m,i-1,k,2)=wa1(i-2)*((cc(m,i-1,1,k)-cc(m,ic-1,4,k)) &
-(cc(m,i,3,k)+cc(m,ic,2,k)))-wa1(i-1) &
*((cc(m,i,1,k)+cc(m,ic,4,k))+(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))
ch(m,i,k,2)=wa1(i-2)*((cc(m,i,1,k)+cc(m,ic,4,k)) &
+(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))+wa1(i-1) &
*((cc(m,i-1,1,k)-cc(m,ic-1,4,k))-(cc(m,i,3,k)+cc(m,ic,2,k)))
ch(m,i-1,k,3)=wa2(i-2)*((cc(m,i-1,1,k)+cc(m,ic-1,4,k)) &
-(cc(m,i-1,3,k)+cc(m,ic-1,2,k)))-wa2(i-1) &
*((cc(m,i,1,k)-cc(m,ic,4,k))-(cc(m,i,3,k)-cc(m,ic,2,k)))
ch(m,i,k,3)=wa2(i-2)*((cc(m,i,1,k)-cc(m,ic,4,k)) &
-(cc(m,i,3,k)-cc(m,ic,2,k)))+wa2(i-1) &
*((cc(m,i-1,1,k)+cc(m,ic-1,4,k))-(cc(m,i-1,3,k) &
+cc(m,ic-1,2,k)))
ch(m,i-1,k,4)=wa3(i-2)*((cc(m,i-1,1,k)-cc(m,ic-1,4,k)) &
+(cc(m,i,3,k)+cc(m,ic,2,k)))-wa3(i-1) &
*((cc(m,i,1,k)+cc(m,ic,4,k))-(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))
ch(m,i,k,4)=wa3(i-2)*((cc(m,i,1,k)+cc(m,ic,4,k)) &
-(cc(m,i-1,3,k)-cc(m,ic-1,2,k)))+wa3(i-1) &
*((cc(m,i-1,1,k)-cc(m,ic-1,4,k))+(cc(m,i,3,k)+cc(m,ic,2,k)))
END DO
END DO
END DO
IF (MOD(ido,2) == 1) RETURN
105 CONTINUE
DO k=1,l1
DO m=1,mp
ch(m,ido,k,1) = (cc(m,ido,1,k)+cc(m,ido,3,k)) &
+(cc(m,ido,1,k)+cc(m,ido,3,k))
ch(m,ido,k,2) = sqrt2*((cc(m,ido,1,k)-cc(m,ido,3,k)) &
-(cc(m,1,2,k)+cc(m,1,4,k)))
ch(m,ido,k,3) = (cc(m,1,4,k)-cc(m,1,2,k)) &
+(cc(m,1,4,k)-cc(m,1,2,k))
ch(m,ido,k,4) = -sqrt2*((cc(m,ido,1,k)-cc(m,ido,3,k)) &
+(cc(m,1,2,k)+cc(m,1,4,k)))
END DO
END DO
107 RETURN
END SUBROUTINE vradb4
SUBROUTINE vradb5 (mp,ido,l1,cc,ch,mdimc,wa1,wa2,wa3,wa4) 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION cc(mdimc,ido,5,l1) ,ch(mdimc,ido,l1,5), &
wa1(ido) ,wa2(ido) ,wa3(ido) ,wa4(ido)
arg=2.*pimach(1.0)/5.
tr11=COS(arg)
ti11=SIN(arg)
tr12=COS(2.*arg)
ti12=SIN(2.*arg)
DO k=1,l1
DO m=1,mp
ch(m,1,k,1) = cc(m,1,1,k)+2.*cc(m,ido,2,k)+2.*cc(m,ido,4,k)
ch(m,1,k,2) = (cc(m,1,1,k)+tr11*2.*cc(m,ido,2,k) &
+tr12*2.*cc(m,ido,4,k))-(ti11*2.*cc(m,1,3,k) &
+ti12*2.*cc(m,1,5,k))
ch(m,1,k,3) = (cc(m,1,1,k)+tr12*2.*cc(m,ido,2,k) &
+tr11*2.*cc(m,ido,4,k))-(ti12*2.*cc(m,1,3,k) &
-ti11*2.*cc(m,1,5,k))
ch(m,1,k,4) = (cc(m,1,1,k)+tr12*2.*cc(m,ido,2,k) &
+tr11*2.*cc(m,ido,4,k))+(ti12*2.*cc(m,1,3,k) &
-ti11*2.*cc(m,1,5,k))
ch(m,1,k,5) = (cc(m,1,1,k)+tr11*2.*cc(m,ido,2,k) &
+tr12*2.*cc(m,ido,4,k))+(ti11*2.*cc(m,1,3,k) &
+ti12*2.*cc(m,1,5,k))
END DO
END DO
IF (ido == 1) RETURN
idp2 = ido+2
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
ch(m,i-1,k,1) = cc(m,i-1,1,k)+(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) &
+(cc(m,i-1,5,k)+cc(m,ic-1,4,k))
ch(m,i,k,1) = cc(m,i,1,k)+(cc(m,i,3,k)-cc(m,ic,2,k)) &
+(cc(m,i,5,k)-cc(m,ic,4,k))
ch(m,i-1,k,2) = wa1(i-2)*((cc(m,i-1,1,k)+tr11* &
(cc(m,i-1,3,k)+cc(m,ic-1,2,k))+tr12 &
*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))-(ti11*(cc(m,i,3,k) &
+cc(m,ic,2,k))+ti12*(cc(m,i,5,k)+cc(m,ic,4,k)))) &
-wa1(i-1)*((cc(m,i,1,k)+tr11*(cc(m,i,3,k)-cc(m,ic,2,k)) &
+tr12*(cc(m,i,5,k)-cc(m,ic,4,k)))+(ti11*(cc(m,i-1,3,k) &
-cc(m,ic-1,2,k))+ti12*(cc(m,i-1,5,k)-cc(m,ic-1,4,k))))
ch(m,i,k,2) = wa1(i-2)*((cc(m,i,1,k)+tr11*(cc(m,i,3,k) &
-cc(m,ic,2,k))+tr12*(cc(m,i,5,k)-cc(m,ic,4,k))) &
+(ti11*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))+ti12 &
*(cc(m,i-1,5,k)-cc(m,ic-1,4,k))))+wa1(i-1) &
*((cc(m,i-1,1,k)+tr11*(cc(m,i-1,3,k) &
+cc(m,ic-1,2,k))+tr12*(cc(m,i-1,5,k)+cc(m,ic-1,4,k))) &
-(ti11*(cc(m,i,3,k)+cc(m,ic,2,k))+ti12 &
*(cc(m,i,5,k)+cc(m,ic,4,k))))
ch(m,i-1,k,3) = wa2(i-2) &
*((cc(m,i-1,1,k)+tr12*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) &
+tr11*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))-(ti12*(cc(m,i,3,k) &
+cc(m,ic,2,k))-ti11*(cc(m,i,5,k)+cc(m,ic,4,k)))) &
-wa2(i-1) &
*((cc(m,i,1,k)+tr12*(cc(m,i,3,k)- &
cc(m,ic,2,k))+tr11*(cc(m,i,5,k)-cc(m,ic,4,k))) &
+(ti12*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))-ti11 &
*(cc(m,i-1,5,k)-cc(m,ic-1,4,k))))
ch(m,i,k,3) = wa2(i-2) &
*((cc(m,i,1,k)+tr12*(cc(m,i,3,k)- &
cc(m,ic,2,k))+tr11*(cc(m,i,5,k)-cc(m,ic,4,k))) &
+(ti12*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))-ti11 &
*(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) &
+wa2(i-1) &
*((cc(m,i-1,1,k)+tr12*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) &
+tr11*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))-(ti12*(cc(m,i,3,k) &
+cc(m,ic,2,k))-ti11*(cc(m,i,5,k)+cc(m,ic,4,k))))
ch(m,i-1,k,4) = wa3(i-2) &
*((cc(m,i-1,1,k)+tr12*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) &
+tr11*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))+(ti12*(cc(m,i,3,k) &
+cc(m,ic,2,k))-ti11*(cc(m,i,5,k)+cc(m,ic,4,k)))) &
-wa3(i-1) &
*((cc(m,i,1,k)+tr12*(cc(m,i,3,k)- &
cc(m,ic,2,k))+tr11*(cc(m,i,5,k)-cc(m,ic,4,k))) &
-(ti12*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))-ti11 &
*(cc(m,i-1,5,k)-cc(m,ic-1,4,k))))
ch(m,i,k,4) = wa3(i-2) &
*((cc(m,i,1,k)+tr12*(cc(m,i,3,k)- &
cc(m,ic,2,k))+tr11*(cc(m,i,5,k)-cc(m,ic,4,k))) &
-(ti12*(cc(m,i-1,3,k)-cc(m,ic-1,2,k))-ti11 &
*(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) &
+wa3(i-1) &
*((cc(m,i-1,1,k)+tr12*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) &
+tr11*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))+(ti12*(cc(m,i,3,k) &
+cc(m,ic,2,k))-ti11*(cc(m,i,5,k)+cc(m,ic,4,k))))
ch(m,i-1,k,5) = wa4(i-2) &
*((cc(m,i-1,1,k)+tr11*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) &
+tr12*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))+(ti11*(cc(m,i,3,k) &
+cc(m,ic,2,k))+ti12*(cc(m,i,5,k)+cc(m,ic,4,k)))) &
-wa4(i-1) &
*((cc(m,i,1,k)+tr11*(cc(m,i,3,k)-cc(m,ic,2,k)) &
+tr12*(cc(m,i,5,k)-cc(m,ic,4,k)))-(ti11*(cc(m,i-1,3,k) &
-cc(m,ic-1,2,k))+ti12*(cc(m,i-1,5,k)-cc(m,ic-1,4,k))))
ch(m,i,k,5) = wa4(i-2) &
*((cc(m,i,1,k)+tr11*(cc(m,i,3,k)-cc(m,ic,2,k)) &
+tr12*(cc(m,i,5,k)-cc(m,ic,4,k)))-(ti11*(cc(m,i-1,3,k) &
-cc(m,ic-1,2,k))+ti12*(cc(m,i-1,5,k)-cc(m,ic-1,4,k)))) &
+wa4(i-1) &
*((cc(m,i-1,1,k)+tr11*(cc(m,i-1,3,k)+cc(m,ic-1,2,k)) &
+tr12*(cc(m,i-1,5,k)+cc(m,ic-1,4,k)))+(ti11*(cc(m,i,3,k) &
+cc(m,ic,2,k))+ti12*(cc(m,i,5,k)+cc(m,ic,4,k))))
END DO
END DO
END DO
RETURN
END SUBROUTINE vradb5
SUBROUTINE vradbg (mp,ido,ip,l1,idl1,cc,c1,c2,ch,ch2, & 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
! &
mdimc,wa)
DIMENSION ch(mdimc,ido,l1,ip) ,cc(mdimc,ido,ip,l1) , &
c1(mdimc,ido,l1,ip) ,c2(mdimc,idl1,ip), &
ch2(mdimc,idl1,ip) ,wa(ido)
tpi=2.*pimach(1.0)
arg = tpi/FLOAT(ip)
dcp = COS(arg)
dsp = SIN(arg)
idp2 = ido+2
nbd = (ido-1)/2
ipp2 = ip+2
ipph = (ip+1)/2
IF (ido < l1) GO TO 103
DO k=1,l1
DO i=1,ido
DO m=1,mp
ch(m,i,k,1) = cc(m,i,1,k)
END DO
END DO
END DO
GO TO 106
103 DO i=1,ido
DO k=1,l1
DO m=1,mp
ch(m,i,k,1) = cc(m,i,1,k)
END DO
END DO
END DO
106 DO j=2,ipph
jc = ipp2-j
j2 = j+j
DO k=1,l1
DO m=1,mp
ch(m,1,k,j) = cc(m,ido,j2-2,k)+cc(m,ido,j2-2,k)
ch(m,1,k,jc) = cc(m,1,j2-1,k)+cc(m,1,j2-1,k)
END DO
END DO
END DO
IF (ido == 1) GO TO 116
IF (nbd < l1) GO TO 112
DO j=2,ipph
jc = ipp2-j
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
ch(m,i-1,k,j) = cc(m,i-1,2*j-1,k)+cc(m,ic-1,2*j-2,k)
ch(m,i-1,k,jc) = cc(m,i-1,2*j-1,k)-cc(m,ic-1,2*j-2,k)
ch(m,i,k,j) = cc(m,i,2*j-1,k)-cc(m,ic,2*j-2,k)
ch(m,i,k,jc) = cc(m,i,2*j-1,k)+cc(m,ic,2*j-2,k)
END DO
END DO
END DO
END DO
GO TO 116
112 DO j=2,ipph
jc = ipp2-j
DO i=3,ido,2
ic = idp2-i
DO k=1,l1
DO m=1,mp
ch(m,i-1,k,j) = cc(m,i-1,2*j-1,k)+cc(m,ic-1,2*j-2,k)
ch(m,i-1,k,jc) = cc(m,i-1,2*j-1,k)-cc(m,ic-1,2*j-2,k)
ch(m,i,k,j) = cc(m,i,2*j-1,k)-cc(m,ic,2*j-2,k)
ch(m,i,k,jc) = cc(m,i,2*j-1,k)+cc(m,ic,2*j-2,k)
END DO
END DO
END DO
END DO
116 ar1 = 1.
ai1 = 0.
DO l=2,ipph
lc = ipp2-l
ar1h = dcp*ar1-dsp*ai1
ai1 = dcp*ai1+dsp*ar1
ar1 = ar1h
DO ik=1,idl1
DO m=1,mp
c2(m,ik,l) = ch2(m,ik,1)+ar1*ch2(m,ik,2)
c2(m,ik,lc) = ai1*ch2(m,ik,ip)
END DO
END DO
dc2 = ar1
ds2 = ai1
ar2 = ar1
ai2 = ai1
DO j=3,ipph
jc = ipp2-j
ar2h = dc2*ar2-ds2*ai2
ai2 = dc2*ai2+ds2*ar2
ar2 = ar2h
DO ik=1,idl1
DO m=1,mp
c2(m,ik,l) = c2(m,ik,l)+ar2*ch2(m,ik,j)
c2(m,ik,lc) = c2(m,ik,lc)+ai2*ch2(m,ik,jc)
END DO
END DO
END DO
END DO
DO j=2,ipph
DO ik=1,idl1
DO m=1,mp
ch2(m,ik,1) = ch2(m,ik,1)+ch2(m,ik,j)
END DO
END DO
END DO
DO j=2,ipph
jc = ipp2-j
DO k=1,l1
DO m=1,mp
ch(m,1,k,j) = c1(m,1,k,j)-c1(m,1,k,jc)
ch(m,1,k,jc) = c1(m,1,k,j)+c1(m,1,k,jc)
END DO
END DO
END DO
IF (ido == 1) GO TO 132
IF (nbd < l1) GO TO 128
DO j=2,ipph
jc = ipp2-j
DO k=1,l1
DO i=3,ido,2
DO m=1,mp
ch(m,i-1,k,j) = c1(m,i-1,k,j)-c1(m,i,k,jc)
ch(m,i-1,k,jc) = c1(m,i-1,k,j)+c1(m,i,k,jc)
ch(m,i,k,j) = c1(m,i,k,j)+c1(m,i-1,k,jc)
ch(m,i,k,jc) = c1(m,i,k,j)-c1(m,i-1,k,jc)
END DO
END DO
END DO
END DO
GO TO 132
128 DO j=2,ipph
jc = ipp2-j
DO i=3,ido,2
DO k=1,l1
DO m=1,mp
ch(m,i-1,k,j) = c1(m,i-1,k,j)-c1(m,i,k,jc)
ch(m,i-1,k,jc) = c1(m,i-1,k,j)+c1(m,i,k,jc)
ch(m,i,k,j) = c1(m,i,k,j)+c1(m,i-1,k,jc)
ch(m,i,k,jc) = c1(m,i,k,j)-c1(m,i-1,k,jc)
END DO
END DO
END DO
END DO
132 CONTINUE
IF (ido == 1) RETURN
DO ik=1,idl1
DO m=1,mp
c2(m,ik,1) = ch2(m,ik,1)
END DO
END DO
DO j=2,ip
DO k=1,l1
DO m=1,mp
c1(m,1,k,j) = ch(m,1,k,j)
END DO
END DO
END DO
IF (nbd > l1) GO TO 139
is = -ido
DO j=2,ip
is = is+ido
idij = is
DO i=3,ido,2
idij = idij+2
DO k=1,l1
DO m=1,mp
c1(m,i-1,k,j) = wa(idij-1)*ch(m,i-1,k,j)-wa(idij)* &
ch(m,i,k,j)
c1(m,i,k,j) = wa(idij-1)*ch(m,i,k,j)+wa(idij)* &
ch(m,i-1,k,j)
END DO
END DO
END DO
END DO
GO TO 143
139 is = -ido
DO j=2,ip
is = is+ido
DO k=1,l1
idij = is
DO i=3,ido,2
idij = idij+2
DO m=1,mp
c1(m,i-1,k,j) = wa(idij-1)*ch(m,i-1,k,j)-wa(idij)* &
ch(m,i,k,j)
c1(m,i,k,j) = wa(idij-1)*ch(m,i,k,j)+wa(idij)* &
ch(m,i-1,k,j)
END DO
END DO
END DO
END DO
143 RETURN
END SUBROUTINE vradbg
SUBROUTINE vradf2 (mp,ido,l1,cc,ch,mdimc,wa1) 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION ch(mdimc,ido,2,l1) ,cc(mdimc,ido,l1,2) , &
wa1(ido)
DO k=1,l1
DO m=1,mp
ch(m,1,1,k) = cc(m,1,k,1)+cc(m,1,k,2)
ch(m,ido,2,k) = cc(m,1,k,1)-cc(m,1,k,2)
END DO
END DO
IF (ido-2 < 0) THEN
GO TO 107
ELSE IF (ido-2 == 0) THEN
GO TO 105
END IF
idp2 = ido+2
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
ch(m,i,1,k) = cc(m,i,k,1)+(wa1(i-2)*cc(m,i,k,2)- &
wa1(i-1)*cc(m,i-1,k,2))
ch(m,ic,2,k) = (wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* &
cc(m,i-1,k,2))-cc(m,i,k,1)
ch(m,i-1,1,k) = cc(m,i-1,k,1)+(wa1(i-2)*cc(m,i-1,k,2)+ &
wa1(i-1)*cc(m,i,k,2))
ch(m,ic-1,2,k) = cc(m,i-1,k,1)-(wa1(i-2)*cc(m,i-1,k,2)+ &
wa1(i-1)*cc(m,i,k,2))
END DO
END DO
END DO
IF (MOD(ido,2) == 1) RETURN
105 DO k=1,l1
DO m=1,mp
ch(m,1,2,k) = -cc(m,ido,k,2)
ch(m,ido,1,k) = cc(m,ido,k,1)
END DO
END DO
107 RETURN
END SUBROUTINE vradf2
SUBROUTINE vradf3 (mp,ido,l1,cc,ch,mdimc,wa1,wa2) 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION ch(mdimc,ido,3,l1) ,cc(mdimc,ido,l1,3) , &
wa1(ido) ,wa2(ido)
arg=2.*pimach(1.0)/3.
taur=COS(arg)
taui=SIN(arg)
DO k=1,l1
DO m=1,mp
ch(m,1,1,k) = cc(m,1,k,1)+(cc(m,1,k,2)+cc(m,1,k,3))
ch(m,1,3,k) = taui*(cc(m,1,k,3)-cc(m,1,k,2))
ch(m,ido,2,k) = cc(m,1,k,1)+taur* &
(cc(m,1,k,2)+cc(m,1,k,3))
END DO
END DO
IF (ido == 1) RETURN
idp2 = ido+2
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
ch(m,i-1,1,k) = cc(m,i-1,k,1)+((wa1(i-2)*cc(m,i-1,k,2)+ &
wa1(i-1)*cc(m,i,k,2))+(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* &
cc(m,i,k,3)))
ch(m,i,1,k) = cc(m,i,k,1)+((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* &
cc(m,i-1,k,2))+(wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* &
cc(m,i-1,k,3)))
ch(m,i-1,3,k) = (cc(m,i-1,k,1)+taur*((wa1(i-2)* &
cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2))+(wa2(i-2)* &
cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3))))+(taui*((wa1(i-2)* &
cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2))-(wa2(i-2)* &
cc(m,i,k,3)-wa2(i-1)*cc(m,i-1,k,3))))
ch(m,ic-1,2,k) = (cc(m,i-1,k,1)+taur*((wa1(i-2)* &
cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2))+(wa2(i-2)* &
cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3))))-(taui*((wa1(i-2)* &
cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2))-(wa2(i-2)* &
cc(m,i,k,3)-wa2(i-1)*cc(m,i-1,k,3))))
ch(m,i,3,k) = (cc(m,i,k,1)+taur*((wa1(i-2)*cc(m,i,k,2)- &
wa1(i-1)*cc(m,i-1,k,2))+(wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* &
cc(m,i-1,k,3))))+(taui*((wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* &
cc(m,i,k,3))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* &
cc(m,i,k,2))))
ch(m,ic,2,k) = (taui*((wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* &
cc(m,i,k,3))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* &
cc(m,i,k,2))))-(cc(m,i,k,1)+taur*((wa1(i-2)*cc(m,i,k,2)- &
wa1(i-1)*cc(m,i-1,k,2))+(wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* &
cc(m,i-1,k,3))))
END DO
END DO
END DO
RETURN
END SUBROUTINE vradf3
SUBROUTINE vradf4 (mp,ido,l1,cc,ch,mdimc,wa1,wa2,wa3) 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION cc(mdimc,ido,l1,4) ,ch(mdimc,ido,4,l1) , &
wa1(ido) ,wa2(ido) ,wa3(ido)
hsqt2=SQRT(2.)/2.
DO k=1,l1
DO m=1,mp
ch(m,1,1,k) = (cc(m,1,k,2)+cc(m,1,k,4)) &
+(cc(m,1,k,1)+cc(m,1,k,3))
ch(m,ido,4,k) = (cc(m,1,k,1)+cc(m,1,k,3)) &
-(cc(m,1,k,2)+cc(m,1,k,4))
ch(m,ido,2,k) = cc(m,1,k,1)-cc(m,1,k,3)
ch(m,1,3,k) = cc(m,1,k,4)-cc(m,1,k,2)
END DO
END DO
IF (ido-2 < 0) THEN
GO TO 107
ELSE IF (ido-2 == 0) THEN
GO TO 105
END IF
idp2 = ido+2
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
ch(m,i-1,1,k) = ((wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* &
cc(m,i,k,2))+(wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* &
cc(m,i,k,4)))+(cc(m,i-1,k,1)+(wa2(i-2)*cc(m,i-1,k,3)+ &
wa2(i-1)*cc(m,i,k,3)))
ch(m,ic-1,4,k) = (cc(m,i-1,k,1)+(wa2(i-2)*cc(m,i-1,k,3)+ &
wa2(i-1)*cc(m,i,k,3)))-((wa1(i-2)*cc(m,i-1,k,2)+ &
wa1(i-1)*cc(m,i,k,2))+(wa3(i-2)*cc(m,i-1,k,4)+ &
wa3(i-1)*cc(m,i,k,4)))
ch(m,i,1,k) = ((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* &
cc(m,i-1,k,2))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4)))+(cc(m,i,k,1)+(wa2(i-2)*cc(m,i,k,3)- &
wa2(i-1)*cc(m,i-1,k,3)))
ch(m,ic,4,k) = ((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* &
cc(m,i-1,k,2))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4)))-(cc(m,i,k,1)+(wa2(i-2)*cc(m,i,k,3)- &
wa2(i-1)*cc(m,i-1,k,3)))
ch(m,i-1,3,k) = ((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* &
cc(m,i-1,k,2))-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4)))+(cc(m,i-1,k,1)-(wa2(i-2)*cc(m,i-1,k,3)+ &
wa2(i-1)*cc(m,i,k,3)))
ch(m,ic-1,2,k) = (cc(m,i-1,k,1)-(wa2(i-2)*cc(m,i-1,k,3)+ &
wa2(i-1)*cc(m,i,k,3)))-((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* &
cc(m,i-1,k,2))-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4)))
ch(m,i,3,k) = ((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* &
cc(m,i,k,4))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* &
cc(m,i,k,2)))+(cc(m,i,k,1)-(wa2(i-2)*cc(m,i,k,3)- &
wa2(i-1)*cc(m,i-1,k,3)))
ch(m,ic,2,k) = ((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* &
cc(m,i,k,4))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* &
cc(m,i,k,2)))-(cc(m,i,k,1)-(wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* &
cc(m,i-1,k,3)))
END DO
END DO
END DO
IF (MOD(ido,2) == 1) RETURN
105 CONTINUE
DO k=1,l1
DO m=1,mp
ch(m,ido,1,k) = (hsqt2*(cc(m,ido,k,2)-cc(m,ido,k,4)))+ &
cc(m,ido,k,1)
ch(m,ido,3,k) = cc(m,ido,k,1)-(hsqt2*(cc(m,ido,k,2)- &
cc(m,ido,k,4)))
ch(m,1,2,k) = (-hsqt2*(cc(m,ido,k,2)+cc(m,ido,k,4)))- &
cc(m,ido,k,3)
ch(m,1,4,k) = (-hsqt2*(cc(m,ido,k,2)+cc(m,ido,k,4)))+ &
cc(m,ido,k,3)
END DO
END DO
107 RETURN
END SUBROUTINE vradf4
SUBROUTINE vradf5 (mp,ido,l1,cc,ch,mdimc,wa1,wa2,wa3,wa4) 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION cc(mdimc,ido,l1,5) ,ch(mdimc,ido,5,l1) , &
wa1(ido) ,wa2(ido) ,wa3(ido) ,wa4(ido)
arg=2.*pimach(1.0)/5.
tr11=COS(arg)
ti11=SIN(arg)
tr12=COS(2.*arg)
ti12=SIN(2.*arg)
DO k=1,l1
DO m=1,mp
ch(m,1,1,k) = cc(m,1,k,1)+(cc(m,1,k,5)+cc(m,1,k,2))+ &
(cc(m,1,k,4)+cc(m,1,k,3))
ch(m,ido,2,k) = cc(m,1,k,1)+tr11*(cc(m,1,k,5)+cc(m,1,k,2))+ &
tr12*(cc(m,1,k,4)+cc(m,1,k,3))
ch(m,1,3,k) = ti11*(cc(m,1,k,5)-cc(m,1,k,2))+ti12* &
(cc(m,1,k,4)-cc(m,1,k,3))
ch(m,ido,4,k) = cc(m,1,k,1)+tr12*(cc(m,1,k,5)+cc(m,1,k,2))+ &
tr11*(cc(m,1,k,4)+cc(m,1,k,3))
ch(m,1,5,k) = ti12*(cc(m,1,k,5)-cc(m,1,k,2))-ti11* &
(cc(m,1,k,4)-cc(m,1,k,3))
END DO
END DO
IF (ido == 1) RETURN
idp2 = ido+2
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
ch(m,i-1,1,k) = cc(m,i-1,k,1)+((wa1(i-2)*cc(m,i-1,k,2)+ &
wa1(i-1)*cc(m,i,k,2))+(wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)* &
cc(m,i,k,5)))+((wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* &
cc(m,i,k,3))+(wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4)))
ch(m,i,1,k) = cc(m,i,k,1)+((wa1(i-2)*cc(m,i,k,2)-wa1(i-1)* &
cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* &
cc(m,i-1,k,5)))+((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* &
cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4)))
ch(m,i-1,3,k) = cc(m,i-1,k,1)+tr11* &
( wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2) &
+wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)*cc(m,i,k,5))+tr12* &
( wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3) &
+wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4))+ti11* &
( wa1(i-2)*cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2) &
-(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)*cc(m,i-1,k,5)))+ti12* &
( wa2(i-2)*cc(m,i,k,3)-wa2(i-1)*cc(m,i-1,k,3) &
-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)*cc(m,i-1,k,4)))
ch(m,ic-1,2,k) = cc(m,i-1,k,1)+tr11* &
( wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2) &
+wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)*cc(m,i,k,5))+tr12* &
( wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3) &
+wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4))-(ti11* &
( wa1(i-2)*cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2) &
-(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)*cc(m,i-1,k,5)))+ti12* &
( wa2(i-2)*cc(m,i,k,3)-wa2(i-1)*cc(m,i-1,k,3) &
-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)*cc(m,i-1,k,4))))
ch(m,i,3,k) = (cc(m,i,k,1)+tr11*((wa1(i-2)*cc(m,i,k,2)- &
wa1(i-1)*cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* &
cc(m,i-1,k,5)))+tr12*((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* &
cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4))))+(ti11*((wa4(i-2)*cc(m,i-1,k,5)+ &
wa4(i-1)*cc(m,i,k,5))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* &
cc(m,i,k,2)))+ti12*((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* &
cc(m,i,k,4))-(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* &
cc(m,i,k,3))))
ch(m,ic,2,k) = (ti11*((wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)* &
cc(m,i,k,5))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* &
cc(m,i,k,2)))+ti12*((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* &
cc(m,i,k,4))-(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* &
cc(m,i,k,3))))-(cc(m,i,k,1)+tr11*((wa1(i-2)*cc(m,i,k,2)- &
wa1(i-1)*cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* &
cc(m,i-1,k,5)))+tr12*((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* &
cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4))))
ch(m,i-1,5,k) = (cc(m,i-1,k,1)+tr12*((wa1(i-2)* &
cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2))+(wa4(i-2)* &
cc(m,i-1,k,5)+wa4(i-1)*cc(m,i,k,5)))+tr11*((wa2(i-2)* &
cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3))+(wa3(i-2)* &
cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4))))+(ti12*((wa1(i-2)* &
cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2))-(wa4(i-2)*cc(m,i,k,5)- &
wa4(i-1)*cc(m,i-1,k,5)))-ti11*((wa2(i-2)*cc(m,i,k,3)- &
wa2(i-1)*cc(m,i-1,k,3))-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4))))
ch(m,ic-1,4,k) = (cc(m,i-1,k,1)+tr12*((wa1(i-2)* &
cc(m,i-1,k,2)+wa1(i-1)*cc(m,i,k,2))+(wa4(i-2)* &
cc(m,i-1,k,5)+wa4(i-1)*cc(m,i,k,5)))+tr11*((wa2(i-2)* &
cc(m,i-1,k,3)+wa2(i-1)*cc(m,i,k,3))+(wa3(i-2)* &
cc(m,i-1,k,4)+wa3(i-1)*cc(m,i,k,4))))-(ti12*((wa1(i-2)* &
cc(m,i,k,2)-wa1(i-1)*cc(m,i-1,k,2))-(wa4(i-2)*cc(m,i,k,5)- &
wa4(i-1)*cc(m,i-1,k,5)))-ti11*((wa2(i-2)*cc(m,i,k,3)- &
wa2(i-1)*cc(m,i-1,k,3))-(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4))))
ch(m,i,5,k) = (cc(m,i,k,1)+tr12*((wa1(i-2)*cc(m,i,k,2)- &
wa1(i-1)*cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* &
cc(m,i-1,k,5)))+tr11*((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* &
cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4))))+(ti12*((wa4(i-2)*cc(m,i-1,k,5)+ &
wa4(i-1)*cc(m,i,k,5))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* &
cc(m,i,k,2)))-ti11*((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* &
cc(m,i,k,4))-(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* &
cc(m,i,k,3))))
ch(m,ic,4,k) = (ti12*((wa4(i-2)*cc(m,i-1,k,5)+wa4(i-1)* &
cc(m,i,k,5))-(wa1(i-2)*cc(m,i-1,k,2)+wa1(i-1)* &
cc(m,i,k,2)))-ti11*((wa3(i-2)*cc(m,i-1,k,4)+wa3(i-1)* &
cc(m,i,k,4))-(wa2(i-2)*cc(m,i-1,k,3)+wa2(i-1)* &
cc(m,i,k,3))))-(cc(m,i,k,1)+tr12*((wa1(i-2)*cc(m,i,k,2)- &
wa1(i-1)*cc(m,i-1,k,2))+(wa4(i-2)*cc(m,i,k,5)-wa4(i-1)* &
cc(m,i-1,k,5)))+tr11*((wa2(i-2)*cc(m,i,k,3)-wa2(i-1)* &
cc(m,i-1,k,3))+(wa3(i-2)*cc(m,i,k,4)-wa3(i-1)* &
cc(m,i-1,k,4))))
END DO
END DO
END DO
RETURN
END SUBROUTINE vradf5
SUBROUTINE vradfg (mp,ido,ip,l1,idl1,cc,c1,c2,ch,ch2,mdimc,wa) 2
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION ch(mdimc,ido,l1,ip) ,cc(mdimc,ido,ip,l1) , &
c1(mdimc,ido,l1,ip) ,c2(mdimc,idl1,ip), &
ch2(mdimc,idl1,ip) ,wa(ido)
tpi=2.*pimach(1.0)
arg = tpi/FLOAT(ip)
dcp = COS(arg)
dsp = SIN(arg)
ipph = (ip+1)/2
ipp2 = ip+2
idp2 = ido+2
nbd = (ido-1)/2
IF (ido == 1) GO TO 119
DO ik=1,idl1
DO m=1,mp
ch2(m,ik,1) = c2(m,ik,1)
END DO
END DO
DO j=2,ip
DO k=1,l1
DO m=1,mp
ch(m,1,k,j) = c1(m,1,k,j)
END DO
END DO
END DO
IF (nbd > l1) GO TO 107
is = -ido
DO j=2,ip
is = is+ido
idij = is
DO i=3,ido,2
idij = idij+2
DO k=1,l1
DO m=1,mp
ch(m,i-1,k,j) = wa(idij-1)*c1(m,i-1,k,j)+wa(idij) &
*c1(m,i,k,j)
ch(m,i,k,j) = wa(idij-1)*c1(m,i,k,j)-wa(idij) &
*c1(m,i-1,k,j)
END DO
END DO
END DO
END DO
GO TO 111
107 is = -ido
DO j=2,ip
is = is+ido
DO k=1,l1
idij = is
DO i=3,ido,2
idij = idij+2
DO m=1,mp
ch(m,i-1,k,j) = wa(idij-1)*c1(m,i-1,k,j)+wa(idij) &
*c1(m,i,k,j)
ch(m,i,k,j) = wa(idij-1)*c1(m,i,k,j)-wa(idij) &
*c1(m,i-1,k,j)
END DO
END DO
END DO
END DO
111 IF (nbd < l1) GO TO 115
DO j=2,ipph
jc = ipp2-j
DO k=1,l1
DO i=3,ido,2
DO m=1,mp
c1(m,i-1,k,j) = ch(m,i-1,k,j)+ch(m,i-1,k,jc)
c1(m,i-1,k,jc) = ch(m,i,k,j)-ch(m,i,k,jc)
c1(m,i,k,j) = ch(m,i,k,j)+ch(m,i,k,jc)
c1(m,i,k,jc) = ch(m,i-1,k,jc)-ch(m,i-1,k,j)
END DO
END DO
END DO
END DO
GO TO 121
115 DO j=2,ipph
jc = ipp2-j
DO i=3,ido,2
DO k=1,l1
DO m=1,mp
c1(m,i-1,k,j) = ch(m,i-1,k,j)+ch(m,i-1,k,jc)
c1(m,i-1,k,jc) = ch(m,i,k,j)-ch(m,i,k,jc)
c1(m,i,k,j) = ch(m,i,k,j)+ch(m,i,k,jc)
c1(m,i,k,jc) = ch(m,i-1,k,jc)-ch(m,i-1,k,j)
END DO
END DO
END DO
END DO
GO TO 121
119 DO ik=1,idl1
DO m=1,mp
c2(m,ik,1) = ch2(m,ik,1)
END DO
END DO
121 DO j=2,ipph
jc = ipp2-j
DO k=1,l1
DO m=1,mp
c1(m,1,k,j) = ch(m,1,k,j)+ch(m,1,k,jc)
c1(m,1,k,jc) = ch(m,1,k,jc)-ch(m,1,k,j)
END DO
END DO
END DO
!
ar1 = 1.
ai1 = 0.
DO l=2,ipph
lc = ipp2-l
ar1h = dcp*ar1-dsp*ai1
ai1 = dcp*ai1+dsp*ar1
ar1 = ar1h
DO ik=1,idl1
DO m=1,mp
ch2(m,ik,l) = c2(m,ik,1)+ar1*c2(m,ik,2)
ch2(m,ik,lc) = ai1*c2(m,ik,ip)
END DO
END DO
dc2 = ar1
ds2 = ai1
ar2 = ar1
ai2 = ai1
DO j=3,ipph
jc = ipp2-j
ar2h = dc2*ar2-ds2*ai2
ai2 = dc2*ai2+ds2*ar2
ar2 = ar2h
DO ik=1,idl1
DO m=1,mp
ch2(m,ik,l) = ch2(m,ik,l)+ar2*c2(m,ik,j)
ch2(m,ik,lc) = ch2(m,ik,lc)+ai2*c2(m,ik,jc)
END DO
END DO
END DO
END DO
DO j=2,ipph
DO ik=1,idl1
DO m=1,mp
ch2(m,ik,1) = ch2(m,ik,1)+c2(m,ik,j)
END DO
END DO
END DO
!
IF (ido < l1) GO TO 132
DO k=1,l1
DO i=1,ido
DO m=1,mp
cc(m,i,1,k) = ch(m,i,k,1)
END DO
END DO
END DO
GO TO 135
132 DO i=1,ido
DO k=1,l1
DO m=1,mp
cc(m,i,1,k) = ch(m,i,k,1)
END DO
END DO
END DO
135 DO j=2,ipph
jc = ipp2-j
j2 = j+j
DO k=1,l1
DO m=1,mp
cc(m,ido,j2-2,k) = ch(m,1,k,j)
cc(m,1,j2-1,k) = ch(m,1,k,jc)
END DO
END DO
END DO
IF (ido == 1) RETURN
IF (nbd < l1) GO TO 141
DO j=2,ipph
jc = ipp2-j
j2 = j+j
DO k=1,l1
DO i=3,ido,2
ic = idp2-i
DO m=1,mp
cc(m,i-1,j2-1,k) = ch(m,i-1,k,j)+ch(m,i-1,k,jc)
cc(m,ic-1,j2-2,k) = ch(m,i-1,k,j)-ch(m,i-1,k,jc)
cc(m,i,j2-1,k) = ch(m,i,k,j)+ch(m,i,k,jc)
cc(m,ic,j2-2,k) = ch(m,i,k,jc)-ch(m,i,k,j)
END DO
END DO
END DO
END DO
RETURN
141 DO j=2,ipph
jc = ipp2-j
j2 = j+j
DO i=3,ido,2
ic = idp2-i
DO k=1,l1
DO m=1,mp
cc(m,i-1,j2-1,k) = ch(m,i-1,k,j)+ch(m,i-1,k,jc)
cc(m,ic-1,j2-2,k) = ch(m,i-1,k,j)-ch(m,i-1,k,jc)
cc(m,i,j2-1,k) = ch(m,i,k,j)+ch(m,i,k,jc)
cc(m,ic,j2-2,k) = ch(m,i,k,jc)-ch(m,i,k,j)
END DO
END DO
END DO
END DO
RETURN
END SUBROUTINE vradfg
SUBROUTINE vrfftb(m,n,r,rt,mdimr,wsave),1
!***BEGIN PROLOGUE VRFFTB
!***DATE WRITTEN 850801 (YYMMDD)
!***REVISION DATE 900509 (YYMMDD)
!***CATEGORY NO. J1A1
!***KEYWORDS FAST FOURIER TRANSFORM, REAL PERIODIC TRANSFORM,
! FOURIER SYNTHESIS, BACKWARD TRANSFORM, MULTIPLE SEQUENCES
!***AUTHOR SWEET, R.A. (NIST) AND LINDGREN, L.L. (NIST)
!***PURPOSE Backward real periodic transform, M sequences.
!***DESCRIPTION
!
! Subroutine VRFFTB computes the synthesis (backward transform) of a
! number of real periodic sequences from their Fourier coefficients.
! Specifically, for each set of independent Fourier coefficients
! F(K), the corresponding real periodic sequence is computed.
!
! The array WSAVE which is used by subroutine VRFFTB must be
! initialized by calling subroutine VRFFTI(N,WSAVE).
!
!
! Input Parameters
!
! M the number of sets of coefficients.
!
! N the length of the sequences of coefficients to be
! transformed. The method is most efficient when N is a
! product of small primes, however n may be any positive
! integer.
!
! R areal two-dimensional array of size MDIMX x N containing the
! coefficients to be transformed. Each set of coefficients
! F(K), K\0,1,..,N-1, is stored as a ROW of R. Specifically,
! the I-th set of independent Fourier coefficients is stored
!
! R(I,1) = REAL( F(I,0) ),
!
! R(I,2*K) = REAL( F(I,K) )
!
! R(I,2*K+1) = IMAG( F(I,K) )
!
! for K = 1, 2, . . . , M-1,
!
! and, when N is even,
!
! R(I,N) = REAL( F(I,N/2) ).
!
! RT a real two-dimensional work array of size MDIMX x N.
!
! MDIMR the row (or first) dimension of the arrays R and RT exactly
! as they appear in the calling program. This parameter is
! used to specify the variable dimension of these arrays.
!
! WSAVE a real one-dimensional work array which must be dimensioned
! at least N+15. The WSAVE array must be initialized by
! calling subroutine VRFFTI. A different WSAVE array must be
! used for each different value of N. This initialization does
! not have to be repeated so long as N remains unchanged. The
! same WSAVE array may be used by VRFFTB and VRFFTB.
!
! Output Parameters
!
! R contains M real periodic sequences corresponding to the given
! coefficients. Specifically, the I-th row of R contains the
! real periodic sequence corresponding to the I-th set of
! independent Fourier coefficients F(I,K) stored as
!
! R(I,J) = X(I,J-1) , J = 1, 2, . . . , N, where
!
! X(I,J) = SQRT(1/N)* F(I,0) + (-1)**J*F(I,N/2)
! + 2*SUM(K=1,M)[ REAL(F(I,2K))*COS(2K*J*PI/N)
! - IMAG(F(I,2K+1))*SIN(2K*J*PI/N) ] ,
!
! when N is even, and
!
! X(I,J) = SQRT(1/N)* F(I,0) +
! 2*SUM(K=1,M)[ REAL(F(I,2K))*COS(2K*J*PI/N)
! - IMAG(F(I,2K+1))*SIN(2K*J*PI/N) ] ,
!
! when N is odd.
!
! WSAVE contains results which must not be destroyed between calls
! to VRFFTF or VRFFTB.
!
! -----------------------------------------------------------------
!
! NOTE - A call of VRFFTF followed immediately by a call of
! of VRFFTB will return the original sequences R. Thus,
! VRFFTB is the correctly normalized inverse of VRFFTF.
!
! -----------------------------------------------------------------
!
! VRFFTB is a straightforward extension of the subprogram RFFTB to
! handle M simultaneous sequences. RFFTB was originally developed
! by P. N. Swarztrauber of NCAR.
!
!
! * * * * * * * * * * * * * * * * * * * * *
! * *
! * PROGRAM SPECIFICATIONS *
! * *
! * * * * * * * * * * * * * * * * * * * * *
!
!
! DIMENSION OF R(MDIMR,N), RT(MDIMR,N), WSAVE(N+15)
! ARGUMENTS
!
! LATEST AUGUST 1, 1985
! REVISION
!
! SUBPROGRAMS VRFFTI, VRFTI1, VRFFTF, VRFTF1, VRADF2, VRADF3,
! REQUIRED VRADF4, VRADF5, VRADFG, VRFFTB, VRFTB1, VRADB2,
! VRADB3, VRADB4, VRADB5, VRADBG, PIMACH
!
! SPECIAL NONE
! CONDITIONS
!
! COMMON NONE
! BLOCKS
!
! I/O NONE
!
! PRECISION SINGLE
!
! SPECIALIST ROLAND SWEET
!
! LANGUAGE FORTRAN
!
! HISTORY WRITTEN BY LINDA LINDGREN AND ROLAND SWEET AT THE
! NATIONAL BUREAU OF STANDARDS (BOULDER).
!
! ALGORITHM A REAL VARIANT OF THE STOCKHAM AUTOSORT VERSION
! OF THE COOLEY-TUKEY FAST FOURIER TRANSFORM.
!
! PORTABILITY AMERICAN NATIONAL STANDARDS INSTITUTE FORTRAN 77.
! THE ONLY MACHINE DEPENDENT CONSTANT IS LOCATED IN
! THE FUNCTION PIMACH.
!
! REQUIRED COS,SIN
! RESIDENT
! ROUTINES
!
!
!***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
! Computations, (G. Rodrigue, ed.), Academic Press, 1982,
! pp. 51-83.
!***ROUTINES CALLED VRFTB1
!***END PROLOGUE VRFFTB
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION r(mdimr,n),rt(mdimr,n),wsave(n+15)
IF (n == 1) RETURN
CALL vrftb1
(m,n,r,rt,mdimr,wsave(1),wsave(n+1))
RETURN
END SUBROUTINE vrfftb
SUBROUTINE vrfftf (m,n,r,rt,mdimr,wsave) 1,1
!***BEGIN PROLOGUE VRFFTF
!***DATE WRITTEN 850801 (YYMMDD)
!***REVISION DATE 900509 (YYMMDD)
!***CATEGORY NO. J1A1
!***KEYWORDS FAST FOURIER TRANSFORM, REAL PERIODIC TRANSFORM,
! FOURIER ANALYSIS, FORWARD TRANSFORM, MULTIPLE SEQUENCES
!***AUTHOR SWEET, R.A. (NIST) AND LINDGREN, L.L. (NIST)
!***PURPOSE Forward real periodic transform, M sequences.
!***DESCRIPTION
!
! Subroutine VRFFTF computes the Fourier coefficients (forward
! transform) of a number of real periodic sequences. Specifically,
! for each sequence the subroutine claculates the independent
! Fourier coefficients described below at output parameter R.
!
! The array WSAVE which is used by subroutine VRFFTF must be
! initialized by calling subroutine VRFFTI(N,WSAVE).
!
!
! Input Parameters
!
! M the number of sequences to be transformed.
!
! N the length of the sequences to be transformed. The method
! is most efficient when N is a product of small primes,
! however n may be any positive integer.
!
! R areal two-dimensional array of size MDIMX x N containing the
! the sequences to be transformed. The sequences are stored
! in the ROWS of R. Thus, the I-th sequence to be transformed,
! X(I,J), J=0,1,...,N-1, is stored as
!
! R(I,J) = X(I,J-1) , J=1, 2, . . . , N.
!
! RT a real two-dimensional work array of size MDIMX x N.
!
! MDIMR the row (or first) dimension of the arrays R and RT exactly
! as they appear in the calling program. This parameter is
! used to specify the variable dimension of these arrays.
!
! WSAVE a real one-dimensional work array which must be dimensioned
! at least N+15. The WSAVE array must be initialized by
! calling subroutine VRFFTI. A different WSAVE array must be
! used for each different value of N. This initialization does
! not have to be repeated so long as N remains unchanged. The
! same WSAVE array may be used by VRFFTF and VRFFTB.
!
! Output Parameters
!
! R contains the Fourier coefficients F(K) for each of the M
! input sequences. Specifically, row I of R, R(I,J),
! J=1,2,..,N, contains the independent Fourier coefficients
! F(I,K), for the I-th input sequence stored as
!
! R(I,1) = REAL( F(I,0) ),
! = SQRT(1/N)*SUM(J=0,N-1)[ X(I,J) ],
!
! R(I,2*K) = REAL( F(I,K) )
! = SQRT(1/N)*SUM(J=0,N-1)[X(I,J)*COS(2J*K*PI/N)]
!
! R(I,2*K+1) = IMAG( F(I,K) )
! =-SQRT(1/N)*SUM(J=0,N-1)[X(I,J)*SIN(2J*K*PI/N)]
!
! for K = 1, 2, . . . , M-1,
!
! and, when N is even,
!
! R(I,N) = REAL( F(I,N/2) ).
! = SQRT(1/N)*SUM(J=0,N-1)[ (-1)**J*X(I,J) ].
!
! WSAVE contains results which must not be destroyed between calls
! to VRFFTF or VRFFTB.
!
! -----------------------------------------------------------------
!
! NOTE - A call of VRFFTF followed immediately by a call of
! of VRFFTB will return the original sequences R. Thus,
! VRFFTB is the correctly normalized inverse of VRFFTF.
!
! -----------------------------------------------------------------
!
! VRFFTF is a straightforward extension of the subprogram RFFTF to
! handle M simultaneous sequences. RFFTF was originally developed
! by P. N. Swarztrauber of NCAR.
!
!
! * * * * * * * * * * * * * * * * * * * * *
! * *
! * PROGRAM SPECIFICATIONS *
! * *
! * * * * * * * * * * * * * * * * * * * * *
!
!
! DIMENSION OF R(MDIMR,N), RT(MDIMR,N), WSAVE(N+15)
! ARGUMENTS
!
! LATEST AUGUST 1, 1985
! REVISION
!
! SUBPROGRAMS VRFFTI, VRFTI1, VRFFTF, VRFTF1, VRADF2, VRADF3,
! REQUIRED VRADF4, VRADF5, VRADFG, VRFFTB, VRFTB1, VRADB2,
! VRADB3, VRADB4, VRADB5, VRADBG, PIMACH
!
! SPECIAL NONE
! CONDITIONS
!
! COMMON NONE
! BLOCKS
!
! I/O NONE
!
! PRECISION SINGLE
!
! SPECIALIST ROLAND SWEET
!
! LANGUAGE FORTRAN
!
! HISTORY WRITTEN BY LINDA LINDGREN AND ROLAND SWEET AT THE
! NATIONAL BUREAU OF STANDARDS (BOULDER).
!
! ALGORITHM A REAL VARIANT OF THE STOCKHAM AUTOSORT VERSION
! OF THE COOLEY-TUKEY FAST FOURIER TRANSFORM.
!
! PORTABILITY AMERICAN NATIONAL STANDARDS INSTITUTE FORTRAN 77.
! THE ONLY MACHINE DEPENDENT CONSTANT IS LOCATED IN
! THE FUNCTION PIMACH.
!
! REQUIRED COS,SIN
! RESIDENT
! ROUTINES
!
!
!***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
! Computations, (G. Rodrigue, ed.), Academic Press, 1982,
! pp. 51-83.
!***ROUTINES CALLED VRFTF1
!***END PROLOGUE VRFFTF
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION r(mdimr,n) ,rt(mdimr,n) ,wsave(n+15)
!***FIRST EXECUTABLE STATEMENT VRFFTF
IF (n == 1) RETURN
CALL vrftf1
(m,n,r,rt,mdimr,wsave(1),wsave(n+1))
RETURN
END SUBROUTINE vrfftf
SUBROUTINE vrffti (n,wsave) 1,1
!***BEGIN PROLOGUE VRFFTI
!***DATE WRITTEN 860701 (YYMMDD)
!***REVISION DATE 900509 (YYMMDD)
!***CATEGORY NO. J1A1
!***KEYWORDS FAST FOURIER TRANSFORM, REAL PERIODIC TRANSFORM,
! MULTIPLE SEQUENCES
!***AUTHOR SWEET, R.A. (NIST) AND LINDGREN, L.L. (NIST)
!***PURPOSE Initialization for VRFFTF and VRFFTB.
!***DESCRIPTION
!
! Subroutine VRFFTI initializes the array WSAVE which is used in
! both VRFFTF and VRFFTB. The prime factorization of N together with
! a tabulation of certain trigonometric functions are computed and
! stored in the array WSAVE.
!
! Input Parameter
!
! N the length of the sequence to be transformed. There is no
! restriction on N.
!
! Output Parameter
!
! WSAVE a work array which must be dimensioned at least N+15.
! The same work array can be used for both VRFFTF and VRFFTB
! as long as N remains unchanged. Different WSAVE arrays
! are required for different values of N. The contents of
! WSAVE must not be changed between calls of VRFFTF or VRFFTB.
!
!
! * * * * * * * * * * * * * * * * * * * * *
! * *
! * PROGRAM SPECIFICATIONS *
! * *
! * * * * * * * * * * * * * * * * * * * * *
!
!
! DIMENSION OF R(MDIMR,N), RT(MDIMR,N), WSAVE(N+15)
! ARGUMENTS
!
! LATEST AUGUST 1, 1985
! REVISION
!
! SUBPROGRAMS VRFFTI, VRFTI1, VRFFTF, VRFTF1, VRADF2, VRADF3,
! REQUIRED VRADF4, VRADF5, VRADFG, VRFFTB, VRFTB1, VRADB2,
! VRADB3, VRADB4, VRADB5, VRADBG, PIMACH
!
! SPECIAL NONE
! CONDITIONS
!
! COMMON NONE
! BLOCKS
!
! I/O NONE
!
! PRECISION SINGLE
!
! SPECIALIST ROLAND SWEET
!
! LANGUAGE FORTRAN
!
! HISTORY WRITTEN BY LINDA LINDGREN AND ROLAND SWEET AT THE
! NATIONAL BUREAU OF STANDARDS (BOULDER).
!
! ALGORITHM A REAL VARIANT OF THE STOCKHAM AUTOSORT VERSION
! OF THE COOLEY-TUKEY FAST FOURIER TRANSFORM.
!
! PORTABILITY AMERICAN NATIONAL STANDARDS INSTITUTE FORTRAN 77.
! THE ONLY MACHINE DEPENDENT CONSTANT IS LOCATED IN
! THE FUNCTION PIMACH.
!
! REQUIRED COS,SIN
! RESIDENT
! ROUTINES
!
!
!***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
! Computations, (G. Rodrigue, ed.), Academic Press, 1982,
! pp. 51-83.
!***ROUTINES CALLED VRFTI1
!***END PROLOGUE VRFFTI
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION wsave(n+15)
!***FIRST EXECUTABLE STATEMENT VRFFTI
IF (n == 1) RETURN
CALL vrfti1
(n,wsave(1),wsave(n+1))
RETURN
END SUBROUTINE vrffti
SUBROUTINE vrftb1 (m,n,c,ch,mdimc,wa,fac) 1,10
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION ch(mdimc,n), c(mdimc,n), wa(n) ,fac(15)
nf = fac(2)
na = 0
l1 = 1
iw = 1
DO k1=1,nf
ip = fac(k1+2)
l2 = ip*l1
ido = n/l2
idl1 = ido*l1
IF (ip /= 4) GO TO 103
ix2 = iw+ido
ix3 = ix2+ido
IF (na /= 0) GO TO 101
CALL vradb4
(m,ido,l1,c,ch,mdimc,wa(iw),wa(ix2),wa(ix3))
GO TO 102
101 CALL vradb4
(m,ido,l1,ch,c,mdimc,wa(iw),wa(ix2),wa(ix3))
102 na = 1-na
GO TO 115
103 IF (ip /= 2) GO TO 106
IF (na /= 0) GO TO 104
CALL vradb2
(m,ido,l1,c,ch,mdimc,wa(iw))
GO TO 105
104 CALL vradb2
(m,ido,l1,ch,c,mdimc,wa(iw))
105 na = 1-na
GO TO 115
106 IF (ip /= 3) GO TO 109
ix2 = iw+ido
IF (na /= 0) GO TO 107
CALL vradb3
(m,ido,l1,c,ch,mdimc,wa(iw),wa(ix2))
GO TO 108
107 CALL vradb3
(m,ido,l1,ch,c,mdimc,wa(iw),wa(ix2))
108 na = 1-na
GO TO 115
109 IF (ip /= 5) GO TO 112
ix2 = iw+ido
ix3 = ix2+ido
ix4 = ix3+ido
IF (na /= 0) GO TO 110
CALL vradb5
(m,ido,l1,c,ch,mdimc,wa(iw),wa(ix2),wa(ix3),wa(ix4))
GO TO 111
110 CALL vradb5
(m,ido,l1,ch,c,mdimc,wa(iw),wa(ix2),wa(ix3),wa(ix4))
111 na = 1-na
GO TO 115
112 IF (na /= 0) GO TO 113
CALL vradbg
(m,ido,ip,l1,idl1,c,c,c,ch,ch,mdimc,wa(iw))
GO TO 114
113 CALL vradbg
(m,ido,ip,l1,idl1,ch,ch,ch,c,c,mdimc,wa(iw))
114 IF (ido == 1) na = 1-na
115 l1 = l2
iw = iw+(ip-1)*ido
END DO
scale=SQRT(1./n)
IF (na == 0) GO TO 118
DO j=1,n
DO i=1,m
c(i,j) = scale*ch(i,j)
END DO
END DO
RETURN
118 DO j=1,n
DO i=1,m
c(i,j)=scale*c(i,j)
END DO
END DO
RETURN
END SUBROUTINE vrftb1
SUBROUTINE vrftf1 (m,n,c,ch,mdimc,wa,fac) 1,10
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION ch(mdimc,n) ,c(mdimc,n) ,wa(n) ,fac(15)
nf = fac(2)
na = 1
l2 = n
iw = n
DO k1=1,nf
kh = nf-k1
ip = fac(kh+3)
l1 = l2/ip
ido = n/l2
idl1 = ido*l1
iw = iw-(ip-1)*ido
na = 1-na
IF (ip /= 4) GO TO 102
ix2 = iw+ido
ix3 = ix2+ido
IF (na /= 0) GO TO 101
CALL vradf4
(m,ido,l1,c,ch,mdimc,wa(iw),wa(ix2),wa(ix3))
GO TO 110
101 CALL vradf4
(m,ido,l1,ch,c,mdimc,wa(iw),wa(ix2),wa(ix3))
GO TO 110
102 IF (ip /= 2) GO TO 104
IF (na /= 0) GO TO 103
CALL vradf2
(m,ido,l1,c,ch,mdimc,wa(iw))
GO TO 110
103 CALL vradf2
(m,ido,l1,ch,c,mdimc,wa(iw))
GO TO 110
104 IF (ip /= 3) GO TO 106
ix2 = iw+ido
IF (na /= 0) GO TO 105
CALL vradf3
(m,ido,l1,c,ch,mdimc,wa(iw),wa(ix2))
GO TO 110
105 CALL vradf3
(m,ido,l1,ch,c,mdimc,wa(iw),wa(ix2))
GO TO 110
106 IF (ip /= 5) GO TO 108
ix2 = iw+ido
ix3 = ix2+ido
ix4 = ix3+ido
IF (na /= 0) GO TO 107
CALL vradf5
(m,ido,l1,c,ch,mdimc,wa(iw),wa(ix2),wa(ix3),wa(ix4))
GO TO 110
107 CALL vradf5
(m,ido,l1,ch,c,mdimc,wa(iw),wa(ix2),wa(ix3),wa(ix4))
GO TO 110
108 IF (ido == 1) na = 1-na
IF (na /= 0) GO TO 109
CALL vradfg
(m,ido,ip,l1,idl1,c,c,c,ch,ch,mdimc,wa(iw))
na = 1
GO TO 110
109 CALL vradfg
(m,ido,ip,l1,idl1,ch,ch,ch,c,c,mdimc,wa(iw))
na = 0
110 l2 = l1
END DO
scale=SQRT(1./n)
IF (na == 1) GO TO 113
DO j=1,n
DO i=1,m
c(i,j) = scale*ch(i,j)
END DO
END DO
RETURN
113 DO j=1,n
DO i=1,m
c(i,j)=scale*c(i,j)
END DO
END DO
RETURN
END SUBROUTINE vrftf1
SUBROUTINE vrfti1 (n,wa,fac) 1
!
! VRFFTPK, VERSION 1, AUGUST 1985
!
DIMENSION wa(n) ,fac(15) ,ntryh(4)
DATA ntryh(1),ntryh(2),ntryh(3),ntryh(4)/4,2,3,5/
nl = n
nf = 0
j = 0
101 j = j+1
IF (j-4 > 0) THEN
GO TO 103
END IF
ntry = ntryh(j)
GO TO 104
103 ntry = ntry+2
104 nq = nl/ntry
nr = nl-ntry*nq
IF (nr == 0) THEN
GO TO 105
ELSE
GO TO 101
END IF
105 nf = nf+1
fac(nf+2) = ntry
nl = nq
IF (ntry /= 2) GO TO 107
IF (nf == 1) GO TO 107
DO i=2,nf
ib = nf-i+2
fac(ib+2) = fac(ib+1)
END DO
fac(3) = 2
107 IF (nl /= 1) GO TO 104
fac(1) = n
fac(2) = nf
tpi = 2.*pimach(1.0)
argh = tpi/FLOAT(n)
is = 0
nfm1 = nf-1
l1 = 1
IF (nfm1 == 0) RETURN
DO k1=1,nfm1
ip = fac(k1+2)
ld = 0
l2 = l1*ip
ido = n/l2
ipm = ip-1
DO j=1,ipm
ld = ld+l1
i = is
argld = FLOAT(ld)*argh
fi = 0.
DO ii=3,ido,2
i = i+2
fi = fi+1.
arg = fi*argld
wa(i-1) = COS(arg)
wa(i) = SIN(arg)
END DO
is = is+ido
END DO
l1 = l2
END DO
RETURN
END SUBROUTINE vrfti1