123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- *DECK PASSF
- SUBROUTINE PASSF (NAC, IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
- C***BEGIN PROLOGUE PASSF
- C***SUBSIDIARY
- C***PURPOSE Calculate the fast Fourier transform of subvectors of
- C arbitrary length.
- C***LIBRARY SLATEC (FFTPACK)
- C***TYPE SINGLE PRECISION (PASSF-S)
- C***AUTHOR Swarztrauber, P. N., (NCAR)
- C***ROUTINES CALLED (NONE)
- 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 changing dummy array size declarations (1) to (*).
- C 881128 Modified by Dick Valent to meet prologue standards.
- C 890831 Modified array declarations. (WRB)
- C 891009 Removed unreferenced variable. (WRB)
- C 891214 Prologue converted to Version 4.0 format. (BAB)
- C 900402 Added TYPE section. (WRB)
- C***END PROLOGUE PASSF
- DIMENSION CH(IDO,L1,*), CC(IDO,IP,*), C1(IDO,L1,*), WA(*),
- + C2(IDL1,*), CH2(IDL1,*)
- C***FIRST EXECUTABLE STATEMENT PASSF
- IDOT = IDO/2
- IPP2 = IP+2
- IPPH = (IP+1)/2
- IDP = IP*IDO
- C
- IF (IDO .LT. L1) GO TO 106
- DO 103 J=2,IPPH
- JC = IPP2-J
- DO 102 K=1,L1
- CDIR$ IVDEP
- DO 101 I=1,IDO
- CH(I,K,J) = CC(I,J,K)+CC(I,JC,K)
- CH(I,K,JC) = CC(I,J,K)-CC(I,JC,K)
- 101 CONTINUE
- 102 CONTINUE
- 103 CONTINUE
- DO 105 K=1,L1
- CDIR$ IVDEP
- DO 104 I=1,IDO
- CH(I,K,1) = CC(I,1,K)
- 104 CONTINUE
- 105 CONTINUE
- GO TO 112
- 106 DO 109 J=2,IPPH
- JC = IPP2-J
- DO 108 I=1,IDO
- CDIR$ IVDEP
- DO 107 K=1,L1
- CH(I,K,J) = CC(I,J,K)+CC(I,JC,K)
- CH(I,K,JC) = CC(I,J,K)-CC(I,JC,K)
- 107 CONTINUE
- 108 CONTINUE
- 109 CONTINUE
- DO 111 I=1,IDO
- CDIR$ IVDEP
- DO 110 K=1,L1
- CH(I,K,1) = CC(I,1,K)
- 110 CONTINUE
- 111 CONTINUE
- 112 IDL = 2-IDO
- INC = 0
- DO 116 L=2,IPPH
- LC = IPP2-L
- IDL = IDL+IDO
- CDIR$ IVDEP
- DO 113 IK=1,IDL1
- C2(IK,L) = CH2(IK,1)+WA(IDL-1)*CH2(IK,2)
- C2(IK,LC) = -WA(IDL)*CH2(IK,IP)
- 113 CONTINUE
- IDLJ = IDL
- INC = INC+IDO
- DO 115 J=3,IPPH
- JC = IPP2-J
- IDLJ = IDLJ+INC
- IF (IDLJ .GT. IDP) IDLJ = IDLJ-IDP
- WAR = WA(IDLJ-1)
- WAI = WA(IDLJ)
- CDIR$ IVDEP
- DO 114 IK=1,IDL1
- C2(IK,L) = C2(IK,L)+WAR*CH2(IK,J)
- C2(IK,LC) = C2(IK,LC)-WAI*CH2(IK,JC)
- 114 CONTINUE
- 115 CONTINUE
- 116 CONTINUE
- DO 118 J=2,IPPH
- CDIR$ IVDEP
- DO 117 IK=1,IDL1
- CH2(IK,1) = CH2(IK,1)+CH2(IK,J)
- 117 CONTINUE
- 118 CONTINUE
- DO 120 J=2,IPPH
- JC = IPP2-J
- CDIR$ IVDEP
- DO 119 IK=2,IDL1,2
- CH2(IK-1,J) = C2(IK-1,J)-C2(IK,JC)
- CH2(IK-1,JC) = C2(IK-1,J)+C2(IK,JC)
- CH2(IK,J) = C2(IK,J)+C2(IK-1,JC)
- CH2(IK,JC) = C2(IK,J)-C2(IK-1,JC)
- 119 CONTINUE
- 120 CONTINUE
- NAC = 1
- IF (IDO .EQ. 2) RETURN
- NAC = 0
- CDIR$ IVDEP
- DO 121 IK=1,IDL1
- C2(IK,1) = CH2(IK,1)
- 121 CONTINUE
- DO 123 J=2,IP
- CDIR$ IVDEP
- DO 122 K=1,L1
- C1(1,K,J) = CH(1,K,J)
- C1(2,K,J) = CH(2,K,J)
- 122 CONTINUE
- 123 CONTINUE
- IF (IDOT .GT. L1) GO TO 127
- IDIJ = 0
- DO 126 J=2,IP
- IDIJ = IDIJ+2
- DO 125 I=4,IDO,2
- IDIJ = IDIJ+2
- CDIR$ IVDEP
- DO 124 K=1,L1
- C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)+WA(IDIJ)*CH(I,K,J)
- C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)-WA(IDIJ)*CH(I-1,K,J)
- 124 CONTINUE
- 125 CONTINUE
- 126 CONTINUE
- RETURN
- 127 IDJ = 2-IDO
- DO 130 J=2,IP
- IDJ = IDJ+IDO
- DO 129 K=1,L1
- IDIJ = IDJ
- CDIR$ IVDEP
- DO 128 I=4,IDO,2
- IDIJ = IDIJ+2
- C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)+WA(IDIJ)*CH(I,K,J)
- C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)-WA(IDIJ)*CH(I-1,K,J)
- 128 CONTINUE
- 129 CONTINUE
- 130 CONTINUE
- RETURN
- END
|