radb4.f 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. *DECK RADB4
  2. SUBROUTINE RADB4 (IDO, L1, CC, CH, WA1, WA2, WA3)
  3. C***BEGIN PROLOGUE RADB4
  4. C***SUBSIDIARY
  5. C***PURPOSE Calculate the fast Fourier transform of subvectors of
  6. C length four.
  7. C***LIBRARY SLATEC (FFTPACK)
  8. C***TYPE SINGLE PRECISION (RADB4-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 (a) changing dummy array size declarations (1) to (*),
  16. C (b) changing definition of variable SQRT2 by using
  17. C FORTRAN intrinsic function SQRT instead of a DATA
  18. C statement.
  19. C 881128 Modified by Dick Valent to meet prologue standards.
  20. C 890831 Modified array declarations. (WRB)
  21. C 891214 Prologue converted to Version 4.0 format. (BAB)
  22. C 900402 Added TYPE section. (WRB)
  23. C***END PROLOGUE RADB4
  24. DIMENSION CC(IDO,4,*), CH(IDO,L1,4), WA1(*), WA2(*), WA3(*)
  25. C***FIRST EXECUTABLE STATEMENT RADB4
  26. SQRT2 = SQRT(2.)
  27. DO 101 K=1,L1
  28. TR1 = CC(1,1,K)-CC(IDO,4,K)
  29. TR2 = CC(1,1,K)+CC(IDO,4,K)
  30. TR3 = CC(IDO,2,K)+CC(IDO,2,K)
  31. TR4 = CC(1,3,K)+CC(1,3,K)
  32. CH(1,K,1) = TR2+TR3
  33. CH(1,K,2) = TR1-TR4
  34. CH(1,K,3) = TR2-TR3
  35. CH(1,K,4) = TR1+TR4
  36. 101 CONTINUE
  37. IF (IDO-2) 107,105,102
  38. 102 IDP2 = IDO+2
  39. IF((IDO-1)/2.LT.L1) GO TO 108
  40. DO 104 K=1,L1
  41. CDIR$ IVDEP
  42. DO 103 I=3,IDO,2
  43. IC = IDP2-I
  44. TI1 = CC(I,1,K)+CC(IC,4,K)
  45. TI2 = CC(I,1,K)-CC(IC,4,K)
  46. TI3 = CC(I,3,K)-CC(IC,2,K)
  47. TR4 = CC(I,3,K)+CC(IC,2,K)
  48. TR1 = CC(I-1,1,K)-CC(IC-1,4,K)
  49. TR2 = CC(I-1,1,K)+CC(IC-1,4,K)
  50. TI4 = CC(I-1,3,K)-CC(IC-1,2,K)
  51. TR3 = CC(I-1,3,K)+CC(IC-1,2,K)
  52. CH(I-1,K,1) = TR2+TR3
  53. CR3 = TR2-TR3
  54. CH(I,K,1) = TI2+TI3
  55. CI3 = TI2-TI3
  56. CR2 = TR1-TR4
  57. CR4 = TR1+TR4
  58. CI2 = TI1+TI4
  59. CI4 = TI1-TI4
  60. CH(I-1,K,2) = WA1(I-2)*CR2-WA1(I-1)*CI2
  61. CH(I,K,2) = WA1(I-2)*CI2+WA1(I-1)*CR2
  62. CH(I-1,K,3) = WA2(I-2)*CR3-WA2(I-1)*CI3
  63. CH(I,K,3) = WA2(I-2)*CI3+WA2(I-1)*CR3
  64. CH(I-1,K,4) = WA3(I-2)*CR4-WA3(I-1)*CI4
  65. CH(I,K,4) = WA3(I-2)*CI4+WA3(I-1)*CR4
  66. 103 CONTINUE
  67. 104 CONTINUE
  68. GO TO 111
  69. 108 DO 110 I=3,IDO,2
  70. IC = IDP2-I
  71. CDIR$ IVDEP
  72. DO 109 K=1,L1
  73. TI1 = CC(I,1,K)+CC(IC,4,K)
  74. TI2 = CC(I,1,K)-CC(IC,4,K)
  75. TI3 = CC(I,3,K)-CC(IC,2,K)
  76. TR4 = CC(I,3,K)+CC(IC,2,K)
  77. TR1 = CC(I-1,1,K)-CC(IC-1,4,K)
  78. TR2 = CC(I-1,1,K)+CC(IC-1,4,K)
  79. TI4 = CC(I-1,3,K)-CC(IC-1,2,K)
  80. TR3 = CC(I-1,3,K)+CC(IC-1,2,K)
  81. CH(I-1,K,1) = TR2+TR3
  82. CR3 = TR2-TR3
  83. CH(I,K,1) = TI2+TI3
  84. CI3 = TI2-TI3
  85. CR2 = TR1-TR4
  86. CR4 = TR1+TR4
  87. CI2 = TI1+TI4
  88. CI4 = TI1-TI4
  89. CH(I-1,K,2) = WA1(I-2)*CR2-WA1(I-1)*CI2
  90. CH(I,K,2) = WA1(I-2)*CI2+WA1(I-1)*CR2
  91. CH(I-1,K,3) = WA2(I-2)*CR3-WA2(I-1)*CI3
  92. CH(I,K,3) = WA2(I-2)*CI3+WA2(I-1)*CR3
  93. CH(I-1,K,4) = WA3(I-2)*CR4-WA3(I-1)*CI4
  94. CH(I,K,4) = WA3(I-2)*CI4+WA3(I-1)*CR4
  95. 109 CONTINUE
  96. 110 CONTINUE
  97. 111 IF (MOD(IDO,2) .EQ. 1) RETURN
  98. 105 DO 106 K=1,L1
  99. TI1 = CC(1,2,K)+CC(1,4,K)
  100. TI2 = CC(1,4,K)-CC(1,2,K)
  101. TR1 = CC(IDO,1,K)-CC(IDO,3,K)
  102. TR2 = CC(IDO,1,K)+CC(IDO,3,K)
  103. CH(IDO,K,1) = TR2+TR2
  104. CH(IDO,K,2) = SQRT2*(TR1-TI1)
  105. CH(IDO,K,3) = TI2+TI2
  106. CH(IDO,K,4) = -SQRT2*(TR1+TI1)
  107. 106 CONTINUE
  108. 107 RETURN
  109. END