mirror of
https://git.planet-casio.com/Lephenixnoir/OpenLibm.git
synced 2025-01-01 06:23:39 +01:00
c977aa998f
Replace amos with slatec
96 lines
3.3 KiB
Fortran
96 lines
3.3 KiB
Fortran
*DECK EZFFTF
|
|
SUBROUTINE EZFFTF (N, R, AZERO, A, B, WSAVE)
|
|
C***BEGIN PROLOGUE EZFFTF
|
|
C***PURPOSE Compute a simplified real, periodic, fast Fourier forward
|
|
C transform.
|
|
C***LIBRARY SLATEC (FFTPACK)
|
|
C***CATEGORY J1A1
|
|
C***TYPE SINGLE PRECISION (EZFFTF-S)
|
|
C***KEYWORDS FFTPACK, FOURIER TRANSFORM
|
|
C***AUTHOR Swarztrauber, P. N., (NCAR)
|
|
C***DESCRIPTION
|
|
C
|
|
C Subroutine EZFFTF computes the Fourier coefficients of a real
|
|
C periodic sequence (Fourier analysis). The transform is defined
|
|
C below at Output Parameters AZERO, A and B. EZFFTF is a simplified
|
|
C but slower version of RFFTF.
|
|
C
|
|
C Input Parameters
|
|
C
|
|
C N the length of the array R to be transformed. The method
|
|
C is most efficient when N is the product of small primes.
|
|
C
|
|
C R a real array of length N which contains the sequence
|
|
C to be transformed. R is not destroyed.
|
|
C
|
|
C
|
|
C WSAVE a work array which must be dimensioned at least 3*N+15
|
|
C in the program that calls EZFFTF. The WSAVE array must be
|
|
C initialized by calling subroutine EZFFTI(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 The same WSAVE array can be used by EZFFTF and EZFFTB.
|
|
C
|
|
C Output Parameters
|
|
C
|
|
C AZERO the sum from I=1 to I=N of R(I)/N
|
|
C
|
|
C A,B for N even B(N/2)=0. and A(N/2) is the sum from I=1 to
|
|
C I=N of (-1)**(I-1)*R(I)/N
|
|
C
|
|
C for N even define KMAX=N/2-1
|
|
C for N odd define KMAX=(N-1)/2
|
|
C
|
|
C then for K=1,...,KMAX
|
|
C
|
|
C A(K) equals the sum from I=1 to I=N of
|
|
C
|
|
C 2./N*R(I)*COS(K*(I-1)*2*PI/N)
|
|
C
|
|
C B(K) equals the sum from I=1 to I=N of
|
|
C
|
|
C 2./N*R(I)*SIN(K*(I-1)*2*PI/N)
|
|
C
|
|
C***REFERENCES P. N. Swarztrauber, Vectorizing the FFTs, in Parallel
|
|
C Computations (G. Rodrigue, ed.), Academic Press,
|
|
C 1982, pp. 51-83.
|
|
C***ROUTINES CALLED RFFTF
|
|
C***REVISION HISTORY (YYMMDD)
|
|
C 790601 DATE WRITTEN
|
|
C 830401 Modified to use SLATEC library source file format.
|
|
C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
|
|
C (a) changing dummy array size declarations (1) to (*),
|
|
C (b) changing references to intrinsic function FLOAT
|
|
C to REAL.
|
|
C 881128 Modified by Dick Valent to meet prologue standards.
|
|
C 890531 Changed all specific intrinsics to generic. (WRB)
|
|
C 890531 REVISION DATE from Version 3.2
|
|
C 891214 Prologue converted to Version 4.0 format. (BAB)
|
|
C 920501 Reformatted the REFERENCES section. (WRB)
|
|
C***END PROLOGUE EZFFTF
|
|
DIMENSION R(*), A(*), B(*), WSAVE(*)
|
|
C***FIRST EXECUTABLE STATEMENT EZFFTF
|
|
IF (N-2) 101,102,103
|
|
101 AZERO = R(1)
|
|
RETURN
|
|
102 AZERO = .5*(R(1)+R(2))
|
|
A(1) = .5*(R(1)-R(2))
|
|
RETURN
|
|
103 DO 104 I=1,N
|
|
WSAVE(I) = R(I)
|
|
104 CONTINUE
|
|
CALL RFFTF (N,WSAVE,WSAVE(N+1))
|
|
CF = 2./N
|
|
CFM = -CF
|
|
AZERO = .5*CF*WSAVE(1)
|
|
NS2 = (N+1)/2
|
|
NS2M = NS2-1
|
|
DO 105 I=1,NS2M
|
|
A(I) = CF*WSAVE(2*I)
|
|
B(I) = CFM*WSAVE(2*I+1)
|
|
105 CONTINUE
|
|
IF (MOD(N,2) .EQ. 0) A(NS2) = .5*CF*WSAVE(N)
|
|
RETURN
|
|
END
|