SUBROUTINE VCOST(M,N,X,XT,MDIMX,WSAVE)
C***BEGIN PROLOGUE VCOST
C***DATE WRITTEN 860701 (YYMMDD)
C***REVISION DATE 900509 (YYMMDD)
C***CATEGORY NO. J1A3
C***KEYWORDS FAST FOURIER TRANSFORM, COSINE TRANSFORM, MULTIPLE
C SEQUENCES
C***AUTHOR BOISVERT, R. F. (NIST)
C***PURPOSE Cosine transform of one or more real, even sequences.
C***DESCRIPTION
C
C Subroutine VCOST computes the discrete Fourier cosine transform
C of M even sequences X(J,I), J=1,...,M. The transform is defined
C below at output parameter X.
C
C The array WSAVE which is used by subroutine VCOST must be
C initialized by calling subroutine VCOSTI(N,WSAVE).
C
C Input Parameters
C
C M the number of sequences to be transformed.
C
C N the length of the sequence to be transformed. N must be
C greater than 1. The method is most efficient when N-1 is
C is a product of small primes.
C
C X an array of size at least X(MDIMX,N) which contains the
C the sequences to be transformed. The sequences are stored
C in the ROWS of X. Thus, the Jth sequence is stored in
C X(J,I), I=1,..,N.
C
C XT a work array of size at least XT(MDIMX,N-1).
C
C MDIMX the first dimension of the array X exactly as it appears in
C the calling program.
C
C WSAVE a work array which must be dimensioned at least 3*N+15
C in the program that calls VCOST. The WSAVE array must be
C initialized by calling subroutine VCOSTI(N,WSAVE), and a
C different WSAVE array must be used for each different
C value of N. This initialization does not have to be
C repeated so long as N remains unchanged. Thus subsequent
C transforms can be obtained faster than the first.
C
C Output Parameters
C
C X For I=1,...,N and J=1,...,M
C
C X(J,I) = ( X(J,1)+(-1)**(I-1)*X(J,N)
C
C + the sum from K=2 to K=N-1
C
C 2*X(J,K)*COS((K-1)*(I-1)*PI/(N-1)) )/SQRT(2*(N-1))
C
C WSAVE contains initialization calculations which must not be
C destroyed between calls of VCOST.
C
C -----------------------------------------------------------------
C
C NOTE - A call of VCOST followed immediately by another call
C of VCOST will return the original sequences X. Thus,
C VCOST is the correctly normalized inverse of itself.
C
C -----------------------------------------------------------------
C
C VCOST is a straightforward extension of the subprogram COST to
C handle M simultaneous sequences. The scaling of the sequences
C computed by VCOST is different than that of COST. COST was
C originally developed by P. N. Swarztrauber of NCAR.
C
C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
C Computations, (G. Rodrigue, ed.), Academic Press, 1982,
C pp. 51-83.
C***ROUTINES CALLED VRFFTF
C***END PROLOGUE VCOST
DIMENSION X(MDIMX,*), XT(MDIMX,*), WSAVE(*)
C***FIRST EXECUTABLE STATEMENT VCOST
IF (M .LE. 0) GO TO 900
IF (N .LE. 1) GO TO 900
IF (N .GT. 3) GO TO 400
IF (N .EQ. 3) GO TO 300
C
C CASE N = 2
C
SCALE = SQRT(0.50E0)
DO 210 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
210 CONTINUE
GO TO 900
C
C CASE N = 3
C
300 CONTINUE
SCALE = 0.50E0
DO 310 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)
310 CONTINUE
GO TO 900
C
C CASE N .GT. 3
C
C ... PREPROCESSING
C
400 CONTINUE
NM1 = N-1
NP1 = N+1
NS2 = N/2
DO 410 J=1,M
XT(J,1) = X(J,1)-X(J,N)
X(J,1) = X(J,1)+X(J,N)
410 CONTINUE
DO 420 K=2,NS2
KC = NP1-K
DO 420 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
420 CONTINUE
MODN = MOD(N,2)
IF (MODN .NE. 0) THEN
DO 430 J=1,M
X(J,NS2+1) = X(J,NS2+1)+X(J,NS2+1)
430 CONTINUE
ENDIF
DO 435 J=1,M
X(J,N) = XT(J,1)
435 CONTINUE
C
C ... REAL PERIODIC TRANSFORM
C
CALL VRFFTF (M,NM1,X,XT,MDIMX,WSAVE(NP1))
C
C ... POSTPROCESSING
C
FACTOR = 1.0/SQRT(REAL(NM1))
DO 440 J=1,M
XT(J,1) = X(J,2)
X(J,2) = FACTOR*X(J,N)
440 CONTINUE
DO 450 I=4,N,2
DO 450 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
450 CONTINUE
IF (MODN .NE. 0) THEN
DO 460 J=1,M
X(J,N) = XT(J,1)
460 CONTINUE
ENDIF
C
C ... NORMALIZATION
C
SCALE = SQRT(0.5)
DO 490 I=1,N
DO 490 J=1,M
X(J,I) = SCALE*X(J,I)
490 CONTINUE
C
C EXIT
C
900 CONTINUE
RETURN
END