passf.f 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. *DECK PASSF
  2. SUBROUTINE PASSF (NAC, IDO, IP, L1, IDL1, CC, C1, C2, CH, CH2, WA)
  3. C***BEGIN PROLOGUE PASSF
  4. C***SUBSIDIARY
  5. C***PURPOSE Calculate the fast Fourier transform of subvectors of
  6. C arbitrary length.
  7. C***LIBRARY SLATEC (FFTPACK)
  8. C***TYPE SINGLE PRECISION (PASSF-S)
  9. C***AUTHOR Swarztrauber, P. N., (NCAR)
  10. C***ROUTINES CALLED (NONE)
  11. C***REVISION HISTORY (YYMMDD)
  12. C 790601 DATE WRITTEN
  13. C 830401 Modified to use SLATEC library source file format.
  14. C 860115 Modified by Ron Boisvert to adhere to Fortran 77 by
  15. C changing dummy array size declarations (1) to (*).
  16. C 881128 Modified by Dick Valent to meet prologue standards.
  17. C 890831 Modified array declarations. (WRB)
  18. C 891009 Removed unreferenced variable. (WRB)
  19. C 891214 Prologue converted to Version 4.0 format. (BAB)
  20. C 900402 Added TYPE section. (WRB)
  21. C***END PROLOGUE PASSF
  22. DIMENSION CH(IDO,L1,*), CC(IDO,IP,*), C1(IDO,L1,*), WA(*),
  23. + C2(IDL1,*), CH2(IDL1,*)
  24. C***FIRST EXECUTABLE STATEMENT PASSF
  25. IDOT = IDO/2
  26. IPP2 = IP+2
  27. IPPH = (IP+1)/2
  28. IDP = IP*IDO
  29. C
  30. IF (IDO .LT. L1) GO TO 106
  31. DO 103 J=2,IPPH
  32. JC = IPP2-J
  33. DO 102 K=1,L1
  34. CDIR$ IVDEP
  35. DO 101 I=1,IDO
  36. CH(I,K,J) = CC(I,J,K)+CC(I,JC,K)
  37. CH(I,K,JC) = CC(I,J,K)-CC(I,JC,K)
  38. 101 CONTINUE
  39. 102 CONTINUE
  40. 103 CONTINUE
  41. DO 105 K=1,L1
  42. CDIR$ IVDEP
  43. DO 104 I=1,IDO
  44. CH(I,K,1) = CC(I,1,K)
  45. 104 CONTINUE
  46. 105 CONTINUE
  47. GO TO 112
  48. 106 DO 109 J=2,IPPH
  49. JC = IPP2-J
  50. DO 108 I=1,IDO
  51. CDIR$ IVDEP
  52. DO 107 K=1,L1
  53. CH(I,K,J) = CC(I,J,K)+CC(I,JC,K)
  54. CH(I,K,JC) = CC(I,J,K)-CC(I,JC,K)
  55. 107 CONTINUE
  56. 108 CONTINUE
  57. 109 CONTINUE
  58. DO 111 I=1,IDO
  59. CDIR$ IVDEP
  60. DO 110 K=1,L1
  61. CH(I,K,1) = CC(I,1,K)
  62. 110 CONTINUE
  63. 111 CONTINUE
  64. 112 IDL = 2-IDO
  65. INC = 0
  66. DO 116 L=2,IPPH
  67. LC = IPP2-L
  68. IDL = IDL+IDO
  69. CDIR$ IVDEP
  70. DO 113 IK=1,IDL1
  71. C2(IK,L) = CH2(IK,1)+WA(IDL-1)*CH2(IK,2)
  72. C2(IK,LC) = -WA(IDL)*CH2(IK,IP)
  73. 113 CONTINUE
  74. IDLJ = IDL
  75. INC = INC+IDO
  76. DO 115 J=3,IPPH
  77. JC = IPP2-J
  78. IDLJ = IDLJ+INC
  79. IF (IDLJ .GT. IDP) IDLJ = IDLJ-IDP
  80. WAR = WA(IDLJ-1)
  81. WAI = WA(IDLJ)
  82. CDIR$ IVDEP
  83. DO 114 IK=1,IDL1
  84. C2(IK,L) = C2(IK,L)+WAR*CH2(IK,J)
  85. C2(IK,LC) = C2(IK,LC)-WAI*CH2(IK,JC)
  86. 114 CONTINUE
  87. 115 CONTINUE
  88. 116 CONTINUE
  89. DO 118 J=2,IPPH
  90. CDIR$ IVDEP
  91. DO 117 IK=1,IDL1
  92. CH2(IK,1) = CH2(IK,1)+CH2(IK,J)
  93. 117 CONTINUE
  94. 118 CONTINUE
  95. DO 120 J=2,IPPH
  96. JC = IPP2-J
  97. CDIR$ IVDEP
  98. DO 119 IK=2,IDL1,2
  99. CH2(IK-1,J) = C2(IK-1,J)-C2(IK,JC)
  100. CH2(IK-1,JC) = C2(IK-1,J)+C2(IK,JC)
  101. CH2(IK,J) = C2(IK,J)+C2(IK-1,JC)
  102. CH2(IK,JC) = C2(IK,J)-C2(IK-1,JC)
  103. 119 CONTINUE
  104. 120 CONTINUE
  105. NAC = 1
  106. IF (IDO .EQ. 2) RETURN
  107. NAC = 0
  108. CDIR$ IVDEP
  109. DO 121 IK=1,IDL1
  110. C2(IK,1) = CH2(IK,1)
  111. 121 CONTINUE
  112. DO 123 J=2,IP
  113. CDIR$ IVDEP
  114. DO 122 K=1,L1
  115. C1(1,K,J) = CH(1,K,J)
  116. C1(2,K,J) = CH(2,K,J)
  117. 122 CONTINUE
  118. 123 CONTINUE
  119. IF (IDOT .GT. L1) GO TO 127
  120. IDIJ = 0
  121. DO 126 J=2,IP
  122. IDIJ = IDIJ+2
  123. DO 125 I=4,IDO,2
  124. IDIJ = IDIJ+2
  125. CDIR$ IVDEP
  126. DO 124 K=1,L1
  127. C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)+WA(IDIJ)*CH(I,K,J)
  128. C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)-WA(IDIJ)*CH(I-1,K,J)
  129. 124 CONTINUE
  130. 125 CONTINUE
  131. 126 CONTINUE
  132. RETURN
  133. 127 IDJ = 2-IDO
  134. DO 130 J=2,IP
  135. IDJ = IDJ+IDO
  136. DO 129 K=1,L1
  137. IDIJ = IDJ
  138. CDIR$ IVDEP
  139. DO 128 I=4,IDO,2
  140. IDIJ = IDIJ+2
  141. C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)+WA(IDIJ)*CH(I,K,J)
  142. C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)-WA(IDIJ)*CH(I-1,K,J)
  143. 128 CONTINUE
  144. 129 CONTINUE
  145. 130 CONTINUE
  146. RETURN
  147. END