| C |
| SUBROUTINE FFTRC (A,N,X,IWK,WK) |
| C SPECIFICATIONS FOR ARGUMENTS |
| INTEGER N,IWK(1) |
| REAL*8 A(N),WK(1) |
| COMPLEX*16 X(1) |
| C SPECIFICATIONS FOR LOCAL VARIABLES |
| INTEGER ND2P1,ND2,I,MTWO,M,IMAX,ND4,NP2,K,NMK,J |
| REAL*8 RPI,ZERO,ONE,HALF,THETA,TP,G(2),B(2),Z(2),AI, |
| 1 AR |
| COMPLEX*16 XIMAG,ALPH,BETA,GAM,S1,ZD |
| EQUIVALENCE (GAM,G(1)),(ALPH,B(1)),(Z(1),AR),(Z(2),AI), |
| 1 (ZD,Z(1)) |
| DATA ZERO/0.0D0/,HALF/0.5D0/,ONE/1.0D0/,IMAX/24/ |
| DATA RPI/3.141592653589793D0/ |
| C FIRST EXECUTABLE STATEMENT |
| IF (N .NE. 2) GO TO 5 |
| C N EQUAL TO 2 |
| ZD = DCMPLX(A(1),A(2)) |
| THETA = AR |
| TP = AI |
| X(2) = DCMPLX(THETA-TP,ZERO) |
| X(1) = DCMPLX(THETA+TP,ZERO) |
| GO TO 9005 |
| 5 CONTINUE |
| C N GREATER THAN 2 |
| ND2 = N/2 |
| ND2P1 = ND2+1 |
| C MOVE A TO X |
| J = 1 |
| DO 6 I=1,ND2 |
| X(I) = DCMPLX(A(J),A(J+1)) |
| J = J+2 |
| 6 CONTINUE |
| C COMPUTE THE CENTER COEFFICIENT |
| GAM = DCMPLX(ZERO,ZERO) |
| DO 10 I=1,ND2 |
| GAM = GAM + X(I) |
| 10 CONTINUE |
| TP = G(1)-G(2) |
| GAM = DCMPLX(TP,ZERO) |
| C DETERMINE THE SMALLEST M SUCH THAT |
| C N IS LESS THAN OR EQUAL TO 2**M |
| MTWO = 2 |
| M = 1 |
| DO 15 I=1,IMAX |
| IF (ND2 .LE. MTWO) GO TO 20 |
| MTWO = MTWO+MTWO |
| M = M+1 |
| 15 CONTINUE |
| 20 IF (ND2 .EQ. MTWO) GO TO 25 |
| C N IS NOT A POWER OF TWO, CALL FFTCC |
| CALL FFTCC (X,ND2,IWK,WK) |
| GO TO 30 |
| C N IS A POWER OF TWO, CALL FFT2C |
| 25 CALL FFT2C (X,M,IWK) |
| 30 ALPH = X(1) |
| X(1) = B(1) + B(2) |
| ND4 = (ND2+1)/2 |
| IF (ND4 .LT. 2) GO TO 40 |
| NP2 = ND2 + 2 |
| THETA = RPI/ND2 |
| TP = THETA |
| XIMAG = DCMPLX(ZERO,ONE) |
| C DECOMPOSE THE COMPLEX VECTOR X |
| C INTO THE COMPONENTS OF THE TRANSFORM |
| C OF THE INPUT DATA. |
| DO 35 K = 2,ND4 |
| NMK = NP2 - K |
| S1 = DCONJG(X(NMK)) |
| ALPH = X(K) + S1 |
| BETA = XIMAG*(S1-X(K)) |
| S1 = DCMPLX(DCOS(THETA),DSIN(THETA)) |
| X(K) = (ALPH+BETA*S1)*HALF |
| X(NMK) = DCONJG(ALPH-BETA*S1)*HALF |
| THETA = THETA + TP |
| 35 CONTINUE |
| 40 CONTINUE |
| X(ND2P1) = GAM |
| 9005 RETURN |
| END |
| |