PyFishPack 0.1.0__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. PyFishPack/__init__.py +86 -0
  2. PyFishPack/__pycache__/__init__.cpython-313.pyc +0 -0
  3. PyFishPack/__pycache__/apps.cpython-313.pyc +0 -0
  4. PyFishPack/_dummy.c +23 -0
  5. PyFishPack/_dummy.cp313-win_amd64.pyd +0 -0
  6. PyFishPack/apps.py +3640 -0
  7. PyFishPack/fishpack.cp313-win_amd64.dll.a +0 -0
  8. PyFishPack/fishpack.cp313-win_amd64.pyd +0 -0
  9. PyFishPack/meson.build +213 -0
  10. PyFishPack/src/archive/f77/Makefile +19 -0
  11. PyFishPack/src/archive/f77/blktri.f +1404 -0
  12. PyFishPack/src/archive/f77/cblktri.f +1414 -0
  13. PyFishPack/src/archive/f77/cmgnbn.f +1592 -0
  14. PyFishPack/src/archive/f77/comf.f +186 -0
  15. PyFishPack/src/archive/f77/fftpack.f +2968 -0
  16. PyFishPack/src/archive/f77/genbun.f +1335 -0
  17. PyFishPack/src/archive/f77/gnbnaux.f +314 -0
  18. PyFishPack/src/archive/f77/hstcrt.f +443 -0
  19. PyFishPack/src/archive/f77/hstcsp.f +683 -0
  20. PyFishPack/src/archive/f77/hstcyl.f +485 -0
  21. PyFishPack/src/archive/f77/hstplr.f +538 -0
  22. PyFishPack/src/archive/f77/hstssp.f +634 -0
  23. PyFishPack/src/archive/f77/hw3crt.f +687 -0
  24. PyFishPack/src/archive/f77/hwscrt.f +512 -0
  25. PyFishPack/src/archive/f77/hwscsp.f +728 -0
  26. PyFishPack/src/archive/f77/hwscyl.f +538 -0
  27. PyFishPack/src/archive/f77/hwsplr.f +602 -0
  28. PyFishPack/src/archive/f77/hwsssp.f +780 -0
  29. PyFishPack/src/archive/f77/pois3d.f +550 -0
  30. PyFishPack/src/archive/f77/poistg.f +875 -0
  31. PyFishPack/src/archive/f77/sepaux.f +361 -0
  32. PyFishPack/src/archive/f77/sepeli.f +1029 -0
  33. PyFishPack/src/archive/f77/sepx4.f +958 -0
  34. PyFishPack/src/centered_axisymmetric_spherical_solver.f90 +1002 -0
  35. PyFishPack/src/centered_cartesian_helmholtz_solver_3d.f90 +819 -0
  36. PyFishPack/src/centered_cartesian_solver.f90 +583 -0
  37. PyFishPack/src/centered_cylindrical_solver.f90 +634 -0
  38. PyFishPack/src/centered_helmholtz_solvers.f90 +156 -0
  39. PyFishPack/src/centered_polar_solver.f90 +746 -0
  40. PyFishPack/src/centered_real_linear_systems_solver.f90 +280 -0
  41. PyFishPack/src/centered_spherical_solver.f90 +928 -0
  42. PyFishPack/src/complex_block_tridiagonal_linear_systems_solver.f90 +1947 -0
  43. PyFishPack/src/complex_linear_systems_solver.f90 +1787 -0
  44. PyFishPack/src/fftpack_c_api.f90 +86 -0
  45. PyFishPack/src/fishpack.f90 +191 -0
  46. PyFishPack/src/fishpack.pyf +504 -0
  47. PyFishPack/src/fishpack_c_api.f90 +365 -0
  48. PyFishPack/src/fishpack_original.pyf +2119 -0
  49. PyFishPack/src/fishpack_precision.f90 +53 -0
  50. PyFishPack/src/general_linear_systems_solver_3d.f90 +296 -0
  51. PyFishPack/src/iterative_solvers.f90 +969 -0
  52. PyFishPack/src/main.f90 +10 -0
  53. PyFishPack/src/pyfishpack_module.c +1302 -0
  54. PyFishPack/src/real_block_tridiagonal_linear_systems_solver.f90 +319 -0
  55. PyFishPack/src/sepeli.f90 +1454 -0
  56. PyFishPack/src/sepx4.f90 +1338 -0
  57. PyFishPack/src/staggered_axisymmetric_spherical_solver.f90 +908 -0
  58. PyFishPack/src/staggered_cartesian_solver.f90 +553 -0
  59. PyFishPack/src/staggered_cylindrical_solver.f90 +630 -0
  60. PyFishPack/src/staggered_helmholtz_solvers.f90 +172 -0
  61. PyFishPack/src/staggered_polar_solver.f90 +651 -0
  62. PyFishPack/src/staggered_real_linear_systems_solver.f90 +258 -0
  63. PyFishPack/src/staggered_spherical_solver.f90 +758 -0
  64. PyFishPack/src/three_dimensional_solvers.f90 +602 -0
  65. PyFishPack/src/type_CenteredCyclicReductionUtility.f90 +1714 -0
  66. PyFishPack/src/type_CyclicReductionUtility.f90 +472 -0
  67. PyFishPack/src/type_FishpackWorkspace.f90 +290 -0
  68. PyFishPack/src/type_GeneralizedCyclicReductionUtility.f90 +1980 -0
  69. PyFishPack/src/type_PeriodicFastFourierTransform.f90 +3789 -0
  70. PyFishPack/src/type_SepAux.f90 +586 -0
  71. PyFishPack/src/type_StaggeredCyclicReductionUtility.f90 +893 -0
  72. pyfishpack-0.1.0.dist-info/DELVEWHEEL +2 -0
  73. pyfishpack-0.1.0.dist-info/METADATA +81 -0
  74. pyfishpack-0.1.0.dist-info/RECORD +81 -0
  75. pyfishpack-0.1.0.dist-info/WHEEL +5 -0
  76. pyfishpack-0.1.0.dist-info/licenses/LICENSE +21 -0
  77. pyfishpack-0.1.0.dist-info/top_level.txt +1 -0
  78. pyfishpack.libs/libgcc_s_seh-1-25d59ccffa1a9009644065b069829e07.dll +0 -0
  79. pyfishpack.libs/libgfortran-5-08f2195cfa0d823e13371c5c3186a82a.dll +0 -0
  80. pyfishpack.libs/libquadmath-0-c5abb9113f1ee64b87a889958e4b7418.dll +0 -0
  81. pyfishpack.libs/libwinpthread-1-83908d14abfafb8b3bfa38cf51ecee56.dll +0 -0
@@ -0,0 +1,2968 @@
1
+ C
2
+ C file fftpack.f
3
+ C
4
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
5
+ C * *
6
+ C * copyright (c) 1999 by UCAR *
7
+ C * *
8
+ C * UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH *
9
+ C * *
10
+ C * all rights reserved *
11
+ C * *
12
+ C * FISHPACK version 4.1 *
13
+ C * *
14
+ C * A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF *
15
+ C * *
16
+ C * SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS *
17
+ C * *
18
+ C * BY *
19
+ C * *
20
+ C * PAUL SWARZTRAUBER *
21
+ C * *
22
+ C * OF *
23
+ C * *
24
+ C * THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH *
25
+ C * *
26
+ C * BOULDER, COLORADO (80307) U.S.A. *
27
+ C * *
28
+ C * WHICH IS SPONSORED BY *
29
+ C * *
30
+ C * THE NATIONAL SCIENCE FOUNDATION *
31
+ C * *
32
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
33
+ C
34
+ C
35
+ C LATEST REVISION
36
+ C ---------------
37
+ C NOVEMBER 1988 (VERSION 4.1)
38
+ C
39
+ C PURPOSE
40
+ C -------
41
+ C THIS PACKAGE CONSISTS OF PROGRAMS WHICH PERFORM FAST FOURIER
42
+ C TRANSFORMS FOR BOTH COMPLEX AND REAL PERIODIC SEQUENCES AND
43
+ C CERTAIN OTHER SYMMETRIC SEQUENCES THAT ARE LISTED BELOW.
44
+ C
45
+ C USAGE
46
+ C -----
47
+ C 1. RFFTI INITIALIZE RFFTF AND RFFTB
48
+ C 2. RFFTF FORWARD TRANSFORM OF A REAL PERIODIC SEQUENCE
49
+ C 3. RFFTB BACKWARD TRANSFORM OF A REAL COEFFICIENT ARRAY
50
+ C
51
+ C 4. EZFFTI INITIALIZE EZFFTF AND EZFFTB
52
+ C 5. EZFFTF A SIMPLIFIED REAL PERIODIC FORWARD TRANSFORM
53
+ C 6. EZFFTB A SIMPLIFIED REAL PERIODIC BACKWARD TRANSFORM
54
+ C
55
+ C 7. SINTI INITIALIZE SINT
56
+ C 8. SINT SINE TRANSFORM OF A REAL ODD SEQUENCE
57
+ C
58
+ C 9. COSTI INITIALIZE COST
59
+ C 10. COST COSINE TRANSFORM OF A REAL EVEN SEQUENCE
60
+ C
61
+ C 11. SINQI INITIALIZE SINQF AND SINQB
62
+ C 12. SINQF FORWARD SINE TRANSFORM WITH ODD WAVE NUMBERS
63
+ C 13. SINQB UNNORMALIZED INVERSE OF SINQF
64
+ C
65
+ C 14. COSQI INITIALIZE COSQF AND COSQB
66
+ C 15. COSQF FORWARD COSINE TRANSFORM WITH ODD WAVE NUMBERS
67
+ C 16. COSQB UNNORMALIZED INVERSE OF COSQF
68
+ C
69
+ C 17. CFFTI INITIALIZE CFFTF AND CFFTB
70
+ C 18. CFFTF FORWARD TRANSFORM OF A COMPLEX PERIODIC SEQUENCE
71
+ C 19. CFFTB UNNORMALIZED INVERSE OF CFFTF
72
+ C
73
+ C SPECIAL CONDITIONS
74
+ C ------------------
75
+ C BEFORE CALLING ROUTINES EZFFTB AND EZFFTF FOR THE FIRST TIME,
76
+ C OR BEFORE CALLING EZFFTB AND EZFFTF WITH A DIFFERENT LENGTH,
77
+ C USERS MUST INITIALIZE BY CALLING ROUTINE EZFFTI.
78
+ C
79
+ C I/O
80
+ C ---
81
+ C NONE
82
+ C
83
+ C PRECISION
84
+ C ---------
85
+ C NONE
86
+ C
87
+ C REQUIRED LIBRARY FILES
88
+ C ----------------------
89
+ C NONE
90
+ C
91
+ C LANGUAGE
92
+ C --------
93
+ C FORTRAN
94
+ C
95
+ C HISTORY
96
+ C -------
97
+ C DEVELOPED AT NCAR IN BOULDER, COLORADO BY PAUL N. SWARZTRAUBER
98
+ C OF THE SCIENTIFIC COMPUTING DIVISION. RELEASED ON NCAR'S PUBLIC
99
+ C SOFTWARE LIBRARIES IN JANUARY 1980. MODIFIED MAY 29, 1985 TO
100
+ C INCREASE EFFICIENCY.
101
+ C
102
+ C PORTABILITY
103
+ C -----------
104
+ C FORTRAN 77
105
+ C
106
+ C **********************************************************************
107
+ C
108
+ C SUBROUTINE RFFTI(N,WSAVE)
109
+ C
110
+ C SUBROUTINE RFFTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
111
+ C BOTH RFFTF AND RFFTB. THE PRIME FACTORIZATION OF N TOGETHER WITH
112
+ C A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
113
+ C STORED IN WSAVE.
114
+ C
115
+ C INPUT PARAMETER
116
+ C
117
+ C N THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED.
118
+ C
119
+ C OUTPUT PARAMETER
120
+ C
121
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 2*N+15.
122
+ C THE SAME WORK ARRAY CAN BE USED FOR BOTH RFFTF AND RFFTB
123
+ C AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
124
+ C ARE REQUIRED FOR DIFFERENT VALUES OF N. THE CONTENTS OF
125
+ C WSAVE MUST NOT BE CHANGED BETWEEN CALLS OF RFFTF OR RFFTB.
126
+ C
127
+ C **********************************************************************
128
+ C
129
+ C SUBROUTINE RFFTF(N,R,WSAVE)
130
+ C
131
+ C SUBROUTINE RFFTF COMPUTES THE FOURIER COEFFICIENTS OF A REAL
132
+ C PERODIC SEQUENCE (FOURIER ANALYSIS). THE TRANSFORM IS DEFINED
133
+ C BELOW AT OUTPUT PARAMETER R.
134
+ C
135
+ C INPUT PARAMETERS
136
+ C
137
+ C N THE LENGTH OF THE ARRAY R TO BE TRANSFORMED. THE METHOD
138
+ C IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
139
+ C N MAY CHANGE SO LONG AS DIFFERENT WORK ARRAYS ARE PROVIDED
140
+ C
141
+ C R A REAL ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
142
+ C TO BE TRANSFORMED
143
+ C
144
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 2*N+15.
145
+ C IN THE PROGRAM THAT CALLS RFFTF. THE WSAVE ARRAY MUST BE
146
+ C INITIALIZED BY CALLING SUBROUTINE RFFTI(N,WSAVE) AND A
147
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
148
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
149
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
150
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
151
+ C THE SAME WSAVE ARRAY CAN BE USED BY RFFTF AND RFFTB.
152
+ C
153
+ C
154
+ C OUTPUT PARAMETERS
155
+ C
156
+ C R R(1) = THE SUM FROM I=1 TO I=N OF R(I)
157
+ C
158
+ C IF N IS EVEN SET L =N/2 , IF N IS ODD SET L = (N+1)/2
159
+ C
160
+ C THEN FOR K = 2,...,L
161
+ C
162
+ C R(2*K-2) = THE SUM FROM I = 1 TO I = N OF
163
+ C
164
+ C R(I)*COS((K-1)*(I-1)*2*PI/N)
165
+ C
166
+ C R(2*K-1) = THE SUM FROM I = 1 TO I = N OF
167
+ C
168
+ C -R(I)*SIN((K-1)*(I-1)*2*PI/N)
169
+ C
170
+ C IF N IS EVEN
171
+ C
172
+ C R(N) = THE SUM FROM I = 1 TO I = N OF
173
+ C
174
+ C (-1)**(I-1)*R(I)
175
+ C
176
+ C ***** NOTE
177
+ C THIS TRANSFORM IS UNNORMALIZED SINCE A CALL OF RFFTF
178
+ C FOLLOWED BY A CALL OF RFFTB WILL MULTIPLY THE INPUT
179
+ C SEQUENCE BY N.
180
+ C
181
+ C WSAVE CONTAINS RESULTS WHICH MUST NOT BE DESTROYED BETWEEN
182
+ C CALLS OF RFFTF OR RFFTB.
183
+ C
184
+ C
185
+ C **********************************************************************
186
+ C
187
+ C SUBROUTINE RFFTB(N,R,WSAVE)
188
+ C
189
+ C SUBROUTINE RFFTB COMPUTES THE REAL PERODIC SEQUENCE FROM ITS
190
+ C FOURIER COEFFICIENTS (FOURIER SYNTHESIS). THE TRANSFORM IS DEFINED
191
+ C BELOW AT OUTPUT PARAMETER R.
192
+ C
193
+ C INPUT PARAMETERS
194
+ C
195
+ C N THE LENGTH OF THE ARRAY R TO BE TRANSFORMED. THE METHOD
196
+ C IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
197
+ C N MAY CHANGE SO LONG AS DIFFERENT WORK ARRAYS ARE PROVIDED
198
+ C
199
+ C R A REAL ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
200
+ C TO BE TRANSFORMED
201
+ C
202
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 2*N+15.
203
+ C IN THE PROGRAM THAT CALLS RFFTB. THE WSAVE ARRAY MUST BE
204
+ C INITIALIZED BY CALLING SUBROUTINE RFFTI(N,WSAVE) AND A
205
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
206
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
207
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
208
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
209
+ C THE SAME WSAVE ARRAY CAN BE USED BY RFFTF AND RFFTB.
210
+ C
211
+ C
212
+ C OUTPUT PARAMETERS
213
+ C
214
+ C R FOR N EVEN AND FOR I = 1,...,N
215
+ C
216
+ C R(I) = R(1)+(-1)**(I-1)*R(N)
217
+ C
218
+ C PLUS THE SUM FROM K=2 TO K=N/2 OF
219
+ C
220
+ C 2.*R(2*K-2)*COS((K-1)*(I-1)*2*PI/N)
221
+ C
222
+ C -2.*R(2*K-1)*SIN((K-1)*(I-1)*2*PI/N)
223
+ C
224
+ C FOR N ODD AND FOR I = 1,...,N
225
+ C
226
+ C R(I) = R(1) PLUS THE SUM FROM K=2 TO K=(N+1)/2 OF
227
+ C
228
+ C 2.*R(2*K-2)*COS((K-1)*(I-1)*2*PI/N)
229
+ C
230
+ C -2.*R(2*K-1)*SIN((K-1)*(I-1)*2*PI/N)
231
+ C
232
+ C ***** NOTE
233
+ C THIS TRANSFORM IS UNNORMALIZED SINCE A CALL OF RFFTF
234
+ C FOLLOWED BY A CALL OF RFFTB WILL MULTIPLY THE INPUT
235
+ C SEQUENCE BY N.
236
+ C
237
+ C WSAVE CONTAINS RESULTS WHICH MUST NOT BE DESTROYED BETWEEN
238
+ C CALLS OF RFFTB OR RFFTF.
239
+ C
240
+ C
241
+ C **********************************************************************
242
+ C
243
+ C SUBROUTINE EZFFTI(N,WSAVE)
244
+ C
245
+ C SUBROUTINE EZFFTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
246
+ C BOTH EZFFTF AND EZFFTB. THE PRIME FACTORIZATION OF N TOGETHER WITH
247
+ C A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
248
+ C STORED IN WSAVE.
249
+ C
250
+ C INPUT PARAMETER
251
+ C
252
+ C N THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED.
253
+ C
254
+ C OUTPUT PARAMETER
255
+ C
256
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
257
+ C THE SAME WORK ARRAY CAN BE USED FOR BOTH EZFFTF AND EZFFTB
258
+ C AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
259
+ C ARE REQUIRED FOR DIFFERENT VALUES OF N.
260
+ C
261
+ C
262
+ C **********************************************************************
263
+ C
264
+ C SUBROUTINE EZFFTF(N,R,AZERO,A,B,WSAVE)
265
+ C
266
+ C SUBROUTINE EZFFTF COMPUTES THE FOURIER COEFFICIENTS OF A REAL
267
+ C PERODIC SEQUENCE (FOURIER ANALYSIS). THE TRANSFORM IS DEFINED
268
+ C BELOW AT OUTPUT PARAMETERS AZERO,A AND B. EZFFTF IS A SIMPLIFIED
269
+ C BUT SLOWER VERSION OF RFFTF.
270
+ C
271
+ C INPUT PARAMETERS
272
+ C
273
+ C N THE LENGTH OF THE ARRAY R TO BE TRANSFORMED. THE METHOD
274
+ C IS MUST EFFICIENT WHEN N IS THE PRODUCT OF SMALL PRIMES.
275
+ C
276
+ C R A REAL ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
277
+ C TO BE TRANSFORMED. R IS NOT DESTROYED.
278
+ C
279
+ C
280
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
281
+ C IN THE PROGRAM THAT CALLS EZFFTF. THE WSAVE ARRAY MUST BE
282
+ C INITIALIZED BY CALLING SUBROUTINE EZFFTI(N,WSAVE) AND A
283
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
284
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
285
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
286
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
287
+ C THE SAME WSAVE ARRAY CAN BE USED BY EZFFTF AND EZFFTB.
288
+ C
289
+ C OUTPUT PARAMETERS
290
+ C
291
+ C AZERO THE SUM FROM I=1 TO I=N OF R(I)/N
292
+ C
293
+ C A,B FOR N EVEN B(N/2)=0. AND A(N/2) IS THE SUM FROM I=1 TO
294
+ C I=N OF (-1)**(I-1)*R(I)/N
295
+ C
296
+ C FOR N EVEN DEFINE KMAX=N/2-1
297
+ C FOR N ODD DEFINE KMAX=(N-1)/2
298
+ C
299
+ C THEN FOR K=1,...,KMAX
300
+ C
301
+ C A(K) EQUALS THE SUM FROM I=1 TO I=N OF
302
+ C
303
+ C 2./N*R(I)*COS(K*(I-1)*2*PI/N)
304
+ C
305
+ C B(K) EQUALS THE SUM FROM I=1 TO I=N OF
306
+ C
307
+ C 2./N*R(I)*SIN(K*(I-1)*2*PI/N)
308
+ C
309
+ C
310
+ C **********************************************************************
311
+ C
312
+ C SUBROUTINE EZFFTB(N,R,AZERO,A,B,WSAVE)
313
+ C
314
+ C SUBROUTINE EZFFTB COMPUTES A REAL PERODIC SEQUENCE FROM ITS
315
+ C FOURIER COEFFICIENTS (FOURIER SYNTHESIS). THE TRANSFORM IS
316
+ C DEFINED BELOW AT OUTPUT PARAMETER R. EZFFTB IS A SIMPLIFIED
317
+ C BUT SLOWER VERSION OF RFFTB.
318
+ C
319
+ C INPUT PARAMETERS
320
+ C
321
+ C N THE LENGTH OF THE OUTPUT ARRAY R. THE METHOD IS MOST
322
+ C EFFICIENT WHEN N IS THE PRODUCT OF SMALL PRIMES.
323
+ C
324
+ C AZERO THE CONSTANT FOURIER COEFFICIENT
325
+ C
326
+ C A,B ARRAYS WHICH CONTAIN THE REMAINING FOURIER COEFFICIENTS
327
+ C THESE ARRAYS ARE NOT DESTROYED.
328
+ C
329
+ C THE LENGTH OF THESE ARRAYS DEPENDS ON WHETHER N IS EVEN OR
330
+ C ODD.
331
+ C
332
+ C IF N IS EVEN N/2 LOCATIONS ARE REQUIRED
333
+ C IF N IS ODD (N-1)/2 LOCATIONS ARE REQUIRED
334
+ C
335
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
336
+ C IN THE PROGRAM THAT CALLS EZFFTB. THE WSAVE ARRAY MUST BE
337
+ C INITIALIZED BY CALLING SUBROUTINE EZFFTI(N,WSAVE) AND A
338
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
339
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
340
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
341
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
342
+ C THE SAME WSAVE ARRAY CAN BE USED BY EZFFTF AND EZFFTB.
343
+ C
344
+ C
345
+ C OUTPUT PARAMETERS
346
+ C
347
+ C R IF N IS EVEN DEFINE KMAX=N/2
348
+ C IF N IS ODD DEFINE KMAX=(N-1)/2
349
+ C
350
+ C THEN FOR I=1,...,N
351
+ C
352
+ C R(I)=AZERO PLUS THE SUM FROM K=1 TO K=KMAX OF
353
+ C
354
+ C A(K)*COS(K*(I-1)*2*PI/N)+B(K)*SIN(K*(I-1)*2*PI/N)
355
+ C
356
+ C ********************* COMPLEX NOTATION **************************
357
+ C
358
+ C FOR J=1,...,N
359
+ C
360
+ C R(J) EQUALS THE SUM FROM K=-KMAX TO K=KMAX OF
361
+ C
362
+ C C(K)*EXP(I*K*(J-1)*2*PI/N)
363
+ C
364
+ C WHERE
365
+ C
366
+ C C(K) = .5*CMPLX(A(K),-B(K)) FOR K=1,...,KMAX
367
+ C
368
+ C C(-K) = CONJG(C(K))
369
+ C
370
+ C C(0) = AZERO
371
+ C
372
+ C AND I=SQRT(-1)
373
+ C
374
+ C *************** AMPLITUDE - PHASE NOTATION ***********************
375
+ C
376
+ C FOR I=1,...,N
377
+ C
378
+ C R(I) EQUALS AZERO PLUS THE SUM FROM K=1 TO K=KMAX OF
379
+ C
380
+ C ALPHA(K)*COS(K*(I-1)*2*PI/N+BETA(K))
381
+ C
382
+ C WHERE
383
+ C
384
+ C ALPHA(K) = SQRT(A(K)*A(K)+B(K)*B(K))
385
+ C
386
+ C COS(BETA(K))=A(K)/ALPHA(K)
387
+ C
388
+ C SIN(BETA(K))=-B(K)/ALPHA(K)
389
+ C
390
+ C **********************************************************************
391
+ C
392
+ C SUBROUTINE SINTI(N,WSAVE)
393
+ C
394
+ C SUBROUTINE SINTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
395
+ C SUBROUTINE SINT. THE PRIME FACTORIZATION OF N TOGETHER WITH
396
+ C A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
397
+ C STORED IN WSAVE.
398
+ C
399
+ C INPUT PARAMETER
400
+ C
401
+ C N THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED. THE METHOD
402
+ C IS MOST EFFICIENT WHEN N+1 IS A PRODUCT OF SMALL PRIMES.
403
+ C
404
+ C OUTPUT PARAMETER
405
+ C
406
+ C WSAVE A WORK ARRAY WITH AT LEAST INT(2.5*N+15) LOCATIONS.
407
+ C DIFFERENT WSAVE ARRAYS ARE REQUIRED FOR DIFFERENT VALUES
408
+ C OF N. THE CONTENTS OF WSAVE MUST NOT BE CHANGED BETWEEN
409
+ C CALLS OF SINT.
410
+ C
411
+ C **********************************************************************
412
+ C
413
+ C SUBROUTINE SINT(N,X,WSAVE)
414
+ C
415
+ C SUBROUTINE SINT COMPUTES THE DISCRETE FOURIER SINE TRANSFORM
416
+ C OF AN ODD SEQUENCE X(I). THE TRANSFORM IS DEFINED BELOW AT
417
+ C OUTPUT PARAMETER X.
418
+ C
419
+ C SINT IS THE UNNORMALIZED INVERSE OF ITSELF SINCE A CALL OF SINT
420
+ C FOLLOWED BY ANOTHER CALL OF SINT WILL MULTIPLY THE INPUT SEQUENCE
421
+ C X BY 2*(N+1).
422
+ C
423
+ C THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE SINT MUST BE
424
+ C INITIALIZED BY CALLING SUBROUTINE SINTI(N,WSAVE).
425
+ C
426
+ C INPUT PARAMETERS
427
+ C
428
+ C N THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED. THE METHOD
429
+ C IS MOST EFFICIENT WHEN N+1 IS THE PRODUCT OF SMALL PRIMES.
430
+ C
431
+ C X AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
432
+ C
433
+ C
434
+ C WSAVE A WORK ARRAY WITH DIMENSION AT LEAST INT(2.5*N+15)
435
+ C IN THE PROGRAM THAT CALLS SINT. THE WSAVE ARRAY MUST BE
436
+ C INITIALIZED BY CALLING SUBROUTINE SINTI(N,WSAVE) AND A
437
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
438
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
439
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
440
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
441
+ C
442
+ C OUTPUT PARAMETERS
443
+ C
444
+ C X FOR I=1,...,N
445
+ C
446
+ C X(I)= THE SUM FROM K=1 TO K=N
447
+ C
448
+ C 2*X(K)*SIN(K*I*PI/(N+1))
449
+ C
450
+ C A CALL OF SINT FOLLOWED BY ANOTHER CALL OF
451
+ C SINT WILL MULTIPLY THE SEQUENCE X BY 2*(N+1).
452
+ C HENCE SINT IS THE UNNORMALIZED INVERSE
453
+ C OF ITSELF.
454
+ C
455
+ C WSAVE CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT BE
456
+ C DESTROYED BETWEEN CALLS OF SINT.
457
+ C
458
+ C **********************************************************************
459
+ C
460
+ C SUBROUTINE COSTI(N,WSAVE)
461
+ C
462
+ C SUBROUTINE COSTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
463
+ C SUBROUTINE COST. THE PRIME FACTORIZATION OF N TOGETHER WITH
464
+ C A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
465
+ C STORED IN WSAVE.
466
+ C
467
+ C INPUT PARAMETER
468
+ C
469
+ C N THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED. THE METHOD
470
+ C IS MOST EFFICIENT WHEN N-1 IS A PRODUCT OF SMALL PRIMES.
471
+ C
472
+ C OUTPUT PARAMETER
473
+ C
474
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
475
+ C DIFFERENT WSAVE ARRAYS ARE REQUIRED FOR DIFFERENT VALUES
476
+ C OF N. THE CONTENTS OF WSAVE MUST NOT BE CHANGED BETWEEN
477
+ C CALLS OF COST.
478
+ C
479
+ C **********************************************************************
480
+ C
481
+ C SUBROUTINE COST(N,X,WSAVE)
482
+ C
483
+ C SUBROUTINE COST COMPUTES THE DISCRETE FOURIER COSINE TRANSFORM
484
+ C OF AN EVEN SEQUENCE X(I). THE TRANSFORM IS DEFINED BELOW AT OUTPUT
485
+ C PARAMETER X.
486
+ C
487
+ C COST IS THE UNNORMALIZED INVERSE OF ITSELF SINCE A CALL OF COST
488
+ C FOLLOWED BY ANOTHER CALL OF COST WILL MULTIPLY THE INPUT SEQUENCE
489
+ C X BY 2*(N-1). THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER X
490
+ C
491
+ C THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE COST MUST BE
492
+ C INITIALIZED BY CALLING SUBROUTINE COSTI(N,WSAVE).
493
+ C
494
+ C INPUT PARAMETERS
495
+ C
496
+ C N THE LENGTH OF THE SEQUENCE X. N MUST BE GREATER THAN 1.
497
+ C THE METHOD IS MOST EFFICIENT WHEN N-1 IS A PRODUCT OF
498
+ C SMALL PRIMES.
499
+ C
500
+ C X AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
501
+ C
502
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15
503
+ C IN THE PROGRAM THAT CALLS COST. THE WSAVE ARRAY MUST BE
504
+ C INITIALIZED BY CALLING SUBROUTINE COSTI(N,WSAVE) AND A
505
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
506
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
507
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
508
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
509
+ C
510
+ C OUTPUT PARAMETERS
511
+ C
512
+ C X FOR I=1,...,N
513
+ C
514
+ C X(I) = X(1)+(-1)**(I-1)*X(N)
515
+ C
516
+ C + THE SUM FROM K=2 TO K=N-1
517
+ C
518
+ C 2*X(K)*COS((K-1)*(I-1)*PI/(N-1))
519
+ C
520
+ C A CALL OF COST FOLLOWED BY ANOTHER CALL OF
521
+ C COST WILL MULTIPLY THE SEQUENCE X BY 2*(N-1)
522
+ C HENCE COST IS THE UNNORMALIZED INVERSE
523
+ C OF ITSELF.
524
+ C
525
+ C WSAVE CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT BE
526
+ C DESTROYED BETWEEN CALLS OF COST.
527
+ C
528
+ C **********************************************************************
529
+ C
530
+ C SUBROUTINE SINQI(N,WSAVE)
531
+ C
532
+ C SUBROUTINE SINQI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
533
+ C BOTH SINQF AND SINQB. THE PRIME FACTORIZATION OF N TOGETHER WITH
534
+ C A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
535
+ C STORED IN WSAVE.
536
+ C
537
+ C INPUT PARAMETER
538
+ C
539
+ C N THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED. THE METHOD
540
+ C IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
541
+ C
542
+ C OUTPUT PARAMETER
543
+ C
544
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
545
+ C THE SAME WORK ARRAY CAN BE USED FOR BOTH SINQF AND SINQB
546
+ C AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
547
+ C ARE REQUIRED FOR DIFFERENT VALUES OF N. THE CONTENTS OF
548
+ C WSAVE MUST NOT BE CHANGED BETWEEN CALLS OF SINQF OR SINQB.
549
+ C
550
+ C **********************************************************************
551
+ C
552
+ C SUBROUTINE SINQF(N,X,WSAVE)
553
+ C
554
+ C SUBROUTINE SINQF COMPUTES THE FAST FOURIER TRANSFORM OF QUARTER
555
+ C WAVE DATA. THAT IS , SINQF COMPUTES THE COEFFICIENTS IN A SINE
556
+ C SERIES REPRESENTATION WITH ONLY ODD WAVE NUMBERS. THE TRANSFORM
557
+ C IS DEFINED BELOW AT OUTPUT PARAMETER X.
558
+ C
559
+ C SINQB IS THE UNNORMALIZED INVERSE OF SINQF SINCE A CALL OF SINQF
560
+ C FOLLOWED BY A CALL OF SINQB WILL MULTIPLY THE INPUT SEQUENCE X
561
+ C BY 4*N.
562
+ C
563
+ C THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE SINQF MUST BE
564
+ C INITIALIZED BY CALLING SUBROUTINE SINQI(N,WSAVE).
565
+ C
566
+ C
567
+ C INPUT PARAMETERS
568
+ C
569
+ C N THE LENGTH OF THE ARRAY X TO BE TRANSFORMED. THE METHOD
570
+ C IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
571
+ C
572
+ C X AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
573
+ C
574
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
575
+ C IN THE PROGRAM THAT CALLS SINQF. THE WSAVE ARRAY MUST BE
576
+ C INITIALIZED BY CALLING SUBROUTINE SINQI(N,WSAVE) AND A
577
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
578
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
579
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
580
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
581
+ C
582
+ C OUTPUT PARAMETERS
583
+ C
584
+ C X FOR I=1,...,N
585
+ C
586
+ C X(I) = (-1)**(I-1)*X(N)
587
+ C
588
+ C + THE SUM FROM K=1 TO K=N-1 OF
589
+ C
590
+ C 2*X(K)*SIN((2*I-1)*K*PI/(2*N))
591
+ C
592
+ C A CALL OF SINQF FOLLOWED BY A CALL OF
593
+ C SINQB WILL MULTIPLY THE SEQUENCE X BY 4*N.
594
+ C THEREFORE SINQB IS THE UNNORMALIZED INVERSE
595
+ C OF SINQF.
596
+ C
597
+ C WSAVE CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT
598
+ C BE DESTROYED BETWEEN CALLS OF SINQF OR SINQB.
599
+ C
600
+ C **********************************************************************
601
+ C
602
+ C SUBROUTINE SINQB(N,X,WSAVE)
603
+ C
604
+ C SUBROUTINE SINQB COMPUTES THE FAST FOURIER TRANSFORM OF QUARTER
605
+ C WAVE DATA. THAT IS , SINQB COMPUTES A SEQUENCE FROM ITS
606
+ C REPRESENTATION IN TERMS OF A SINE SERIES WITH ODD WAVE NUMBERS.
607
+ C THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER X.
608
+ C
609
+ C SINQF IS THE UNNORMALIZED INVERSE OF SINQB SINCE A CALL OF SINQB
610
+ C FOLLOWED BY A CALL OF SINQF WILL MULTIPLY THE INPUT SEQUENCE X
611
+ C BY 4*N.
612
+ C
613
+ C THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE SINQB MUST BE
614
+ C INITIALIZED BY CALLING SUBROUTINE SINQI(N,WSAVE).
615
+ C
616
+ C
617
+ C INPUT PARAMETERS
618
+ C
619
+ C N THE LENGTH OF THE ARRAY X TO BE TRANSFORMED. THE METHOD
620
+ C IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
621
+ C
622
+ C X AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
623
+ C
624
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
625
+ C IN THE PROGRAM THAT CALLS SINQB. THE WSAVE ARRAY MUST BE
626
+ C INITIALIZED BY CALLING SUBROUTINE SINQI(N,WSAVE) AND A
627
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
628
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
629
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
630
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
631
+ C
632
+ C OUTPUT PARAMETERS
633
+ C
634
+ C X FOR I=1,...,N
635
+ C
636
+ C X(I)= THE SUM FROM K=1 TO K=N OF
637
+ C
638
+ C 4*X(K)*SIN((2K-1)*I*PI/(2*N))
639
+ C
640
+ C A CALL OF SINQB FOLLOWED BY A CALL OF
641
+ C SINQF WILL MULTIPLY THE SEQUENCE X BY 4*N.
642
+ C THEREFORE SINQF IS THE UNNORMALIZED INVERSE
643
+ C OF SINQB.
644
+ C
645
+ C WSAVE CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT
646
+ C BE DESTROYED BETWEEN CALLS OF SINQB OR SINQF.
647
+ C
648
+ C **********************************************************************
649
+ C
650
+ C SUBROUTINE COSQI(N,WSAVE)
651
+ C
652
+ C SUBROUTINE COSQI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
653
+ C BOTH COSQF AND COSQB. THE PRIME FACTORIZATION OF N TOGETHER WITH
654
+ C A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
655
+ C STORED IN WSAVE.
656
+ C
657
+ C INPUT PARAMETER
658
+ C
659
+ C N THE LENGTH OF THE ARRAY TO BE TRANSFORMED. THE METHOD
660
+ C IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
661
+ C
662
+ C OUTPUT PARAMETER
663
+ C
664
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15.
665
+ C THE SAME WORK ARRAY CAN BE USED FOR BOTH COSQF AND COSQB
666
+ C AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
667
+ C ARE REQUIRED FOR DIFFERENT VALUES OF N. THE CONTENTS OF
668
+ C WSAVE MUST NOT BE CHANGED BETWEEN CALLS OF COSQF OR COSQB.
669
+ C
670
+ C **********************************************************************
671
+ C
672
+ C SUBROUTINE COSQF(N,X,WSAVE)
673
+ C
674
+ C SUBROUTINE COSQF COMPUTES THE FAST FOURIER TRANSFORM OF QUARTER
675
+ C WAVE DATA. THAT IS , COSQF COMPUTES THE COEFFICIENTS IN A COSINE
676
+ C SERIES REPRESENTATION WITH ONLY ODD WAVE NUMBERS. THE TRANSFORM
677
+ C IS DEFINED BELOW AT OUTPUT PARAMETER X
678
+ C
679
+ C COSQF IS THE UNNORMALIZED INVERSE OF COSQB SINCE A CALL OF COSQF
680
+ C FOLLOWED BY A CALL OF COSQB WILL MULTIPLY THE INPUT SEQUENCE X
681
+ C BY 4*N.
682
+ C
683
+ C THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE COSQF MUST BE
684
+ C INITIALIZED BY CALLING SUBROUTINE COSQI(N,WSAVE).
685
+ C
686
+ C
687
+ C INPUT PARAMETERS
688
+ C
689
+ C N THE LENGTH OF THE ARRAY X TO BE TRANSFORMED. THE METHOD
690
+ C IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
691
+ C
692
+ C X AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
693
+ C
694
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 3*N+15
695
+ C IN THE PROGRAM THAT CALLS COSQF. THE WSAVE ARRAY MUST BE
696
+ C INITIALIZED BY CALLING SUBROUTINE COSQI(N,WSAVE) AND A
697
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
698
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
699
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
700
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
701
+ C
702
+ C OUTPUT PARAMETERS
703
+ C
704
+ C X FOR I=1,...,N
705
+ C
706
+ C X(I) = X(1) PLUS THE SUM FROM K=2 TO K=N OF
707
+ C
708
+ C 2*X(K)*COS((2*I-1)*(K-1)*PI/(2*N))
709
+ C
710
+ C A CALL OF COSQF FOLLOWED BY A CALL OF
711
+ C COSQB WILL MULTIPLY THE SEQUENCE X BY 4*N.
712
+ C THEREFORE COSQB IS THE UNNORMALIZED INVERSE
713
+ C OF COSQF.
714
+ C
715
+ C WSAVE CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT
716
+ C BE DESTROYED BETWEEN CALLS OF COSQF OR COSQB.
717
+ C
718
+ C **********************************************************************
719
+ C
720
+ C SUBROUTINE COSQB(N,X,WSAVE)
721
+ C
722
+ C SUBROUTINE COSQB COMPUTES THE FAST FOURIER TRANSFORM OF QUARTER
723
+ C WAVE DATA. THAT IS , COSQB COMPUTES A SEQUENCE FROM ITS
724
+ C REPRESENTATION IN TERMS OF A COSINE SERIES WITH ODD WAVE NUMBERS.
725
+ C THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER X.
726
+ C
727
+ C COSQB IS THE UNNORMALIZED INVERSE OF COSQF SINCE A CALL OF COSQB
728
+ C FOLLOWED BY A CALL OF COSQF WILL MULTIPLY THE INPUT SEQUENCE X
729
+ C BY 4*N.
730
+ C
731
+ C THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE COSQB MUST BE
732
+ C INITIALIZED BY CALLING SUBROUTINE COSQI(N,WSAVE).
733
+ C
734
+ C
735
+ C INPUT PARAMETERS
736
+ C
737
+ C N THE LENGTH OF THE ARRAY X TO BE TRANSFORMED. THE METHOD
738
+ C IS MOST EFFICIENT WHEN N IS A PRODUCT OF SMALL PRIMES.
739
+ C
740
+ C X AN ARRAY WHICH CONTAINS THE SEQUENCE TO BE TRANSFORMED
741
+ C
742
+ C WSAVE A WORK ARRAY THAT MUST BE DIMENSIONED AT LEAST 3*N+15
743
+ C IN THE PROGRAM THAT CALLS COSQB. THE WSAVE ARRAY MUST BE
744
+ C INITIALIZED BY CALLING SUBROUTINE COSQI(N,WSAVE) AND A
745
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
746
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
747
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
748
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
749
+ C
750
+ C OUTPUT PARAMETERS
751
+ C
752
+ C X FOR I=1,...,N
753
+ C
754
+ C X(I)= THE SUM FROM K=1 TO K=N OF
755
+ C
756
+ C 4*X(K)*COS((2*K-1)*(I-1)*PI/(2*N))
757
+ C
758
+ C A CALL OF COSQB FOLLOWED BY A CALL OF
759
+ C COSQF WILL MULTIPLY THE SEQUENCE X BY 4*N.
760
+ C THEREFORE COSQF IS THE UNNORMALIZED INVERSE
761
+ C OF COSQB.
762
+ C
763
+ C WSAVE CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT
764
+ C BE DESTROYED BETWEEN CALLS OF COSQB OR COSQF.
765
+ C
766
+ C **********************************************************************
767
+ C
768
+ C SUBROUTINE CFFTI(N,WSAVE)
769
+ C
770
+ C SUBROUTINE CFFTI INITIALIZES THE ARRAY WSAVE WHICH IS USED IN
771
+ C BOTH CFFTF AND CFFTB. THE PRIME FACTORIZATION OF N TOGETHER WITH
772
+ C A TABULATION OF THE TRIGONOMETRIC FUNCTIONS ARE COMPUTED AND
773
+ C STORED IN WSAVE.
774
+ C
775
+ C INPUT PARAMETER
776
+ C
777
+ C N THE LENGTH OF THE SEQUENCE TO BE TRANSFORMED
778
+ C
779
+ C OUTPUT PARAMETER
780
+ C
781
+ C WSAVE A WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 4*N+15
782
+ C THE SAME WORK ARRAY CAN BE USED FOR BOTH CFFTF AND CFFTB
783
+ C AS LONG AS N REMAINS UNCHANGED. DIFFERENT WSAVE ARRAYS
784
+ C ARE REQUIRED FOR DIFFERENT VALUES OF N. THE CONTENTS OF
785
+ C WSAVE MUST NOT BE CHANGED BETWEEN CALLS OF CFFTF OR CFFTB.
786
+ C
787
+ C **********************************************************************
788
+ C
789
+ C SUBROUTINE CFFTF(N,C,WSAVE)
790
+ C
791
+ C SUBROUTINE CFFTF COMPUTES THE FORWARD COMPLEX DISCRETE FOURIER
792
+ C TRANSFORM (THE FOURIER ANALYSIS). EQUIVALENTLY , CFFTF COMPUTES
793
+ C THE FOURIER COEFFICIENTS OF A COMPLEX PERIODIC SEQUENCE.
794
+ C THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER C.
795
+ C
796
+ C THE TRANSFORM IS NOT NORMALIZED. TO OBTAIN A NORMALIZED TRANSFORM
797
+ C THE OUTPUT MUST BE DIVIDED BY N. OTHERWISE A CALL OF CFFTF
798
+ C FOLLOWED BY A CALL OF CFFTB WILL MULTIPLY THE SEQUENCE BY N.
799
+ C
800
+ C THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE CFFTF MUST BE
801
+ C INITIALIZED BY CALLING SUBROUTINE CFFTI(N,WSAVE).
802
+ C
803
+ C INPUT PARAMETERS
804
+ C
805
+ C
806
+ C N THE LENGTH OF THE COMPLEX SEQUENCE C. THE METHOD IS
807
+ C MORE EFFICIENT WHEN N IS THE PRODUCT OF SMALL PRIMES. N
808
+ C
809
+ C C A COMPLEX ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
810
+ C
811
+ C WSAVE A REAL WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 4N+15
812
+ C IN THE PROGRAM THAT CALLS CFFTF. THE WSAVE ARRAY MUST BE
813
+ C INITIALIZED BY CALLING SUBROUTINE CFFTI(N,WSAVE) AND A
814
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
815
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
816
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
817
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
818
+ C THE SAME WSAVE ARRAY CAN BE USED BY CFFTF AND CFFTB.
819
+ C
820
+ C OUTPUT PARAMETERS
821
+ C
822
+ C C FOR J=1,...,N
823
+ C
824
+ C C(J)=THE SUM FROM K=1,...,N OF
825
+ C
826
+ C C(K)*EXP(-I*(J-1)*(K-1)*2*PI/N)
827
+ C
828
+ C WHERE I=SQRT(-1)
829
+ C
830
+ C WSAVE CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT BE
831
+ C DESTROYED BETWEEN CALLS OF SUBROUTINE CFFTF OR CFFTB
832
+ C
833
+ C **********************************************************************
834
+ C
835
+ C SUBROUTINE CFFTB(N,C,WSAVE)
836
+ C
837
+ C SUBROUTINE CFFTB COMPUTES THE BACKWARD COMPLEX DISCRETE FOURIER
838
+ C TRANSFORM (THE FOURIER SYNTHESIS). EQUIVALENTLY , CFFTB COMPUTES
839
+ C A COMPLEX PERIODIC SEQUENCE FROM ITS FOURIER COEFFICIENTS.
840
+ C THE TRANSFORM IS DEFINED BELOW AT OUTPUT PARAMETER C.
841
+ C
842
+ C A CALL OF CFFTF FOLLOWED BY A CALL OF CFFTB WILL MULTIPLY THE
843
+ C SEQUENCE BY N.
844
+ C
845
+ C THE ARRAY WSAVE WHICH IS USED BY SUBROUTINE CFFTB MUST BE
846
+ C INITIALIZED BY CALLING SUBROUTINE CFFTI(N,WSAVE).
847
+ C
848
+ C INPUT PARAMETERS
849
+ C
850
+ C
851
+ C N THE LENGTH OF THE COMPLEX SEQUENCE C. THE METHOD IS
852
+ C MORE EFFICIENT WHEN N IS THE PRODUCT OF SMALL PRIMES.
853
+ C
854
+ C C A COMPLEX ARRAY OF LENGTH N WHICH CONTAINS THE SEQUENCE
855
+ C
856
+ C WSAVE A REAL WORK ARRAY WHICH MUST BE DIMENSIONED AT LEAST 4N+15
857
+ C IN THE PROGRAM THAT CALLS CFFTB. THE WSAVE ARRAY MUST BE
858
+ C INITIALIZED BY CALLING SUBROUTINE CFFTI(N,WSAVE) AND A
859
+ C DIFFERENT WSAVE ARRAY MUST BE USED FOR EACH DIFFERENT
860
+ C VALUE OF N. THIS INITIALIZATION DOES NOT HAVE TO BE
861
+ C REPEATED SO LONG AS N REMAINS UNCHANGED THUS SUBSEQUENT
862
+ C TRANSFORMS CAN BE OBTAINED FASTER THAN THE FIRST.
863
+ C THE SAME WSAVE ARRAY CAN BE USED BY CFFTF AND CFFTB.
864
+ C
865
+ C OUTPUT PARAMETERS
866
+ C
867
+ C C FOR J=1,...,N
868
+ C
869
+ C C(J)=THE SUM FROM K=1,...,N OF
870
+ C
871
+ C C(K)*EXP(I*(J-1)*(K-1)*2*PI/N)
872
+ C
873
+ C WHERE I=SQRT(-1)
874
+ C
875
+ C WSAVE CONTAINS INITIALIZATION CALCULATIONS WHICH MUST NOT BE
876
+ C DESTROYED BETWEEN CALLS OF SUBROUTINE CFFTF OR CFFTB
877
+ C **********************************************************************
878
+ SUBROUTINE EZFFTF (N,R,AZERO,A,B,WSAVE)
879
+ DIMENSION R(*) ,A(*) ,B(*) ,WSAVE(*)
880
+ C
881
+ IF (N-2) 101,102,103
882
+ 101 AZERO = R(1)
883
+ RETURN
884
+ 102 AZERO = .5*(R(1)+R(2))
885
+ A(1) = .5*(R(1)-R(2))
886
+ RETURN
887
+ 103 DO 104 I=1,N
888
+ WSAVE(I) = R(I)
889
+ 104 CONTINUE
890
+ CALL RFFTF (N,WSAVE,WSAVE(N+1))
891
+ CF = 2./FLOAT(N)
892
+ CFM = -CF
893
+ AZERO = .5*CF*WSAVE(1)
894
+ NS2 = (N+1)/2
895
+ NS2M = NS2-1
896
+ DO 105 I=1,NS2M
897
+ A(I) = CF*WSAVE(2*I)
898
+ B(I) = CFM*WSAVE(2*I+1)
899
+ 105 CONTINUE
900
+ IF (MOD(N,2) .EQ. 1) RETURN
901
+ A(NS2) = .5*CF*WSAVE(N)
902
+ B(NS2) = 0.
903
+ RETURN
904
+ END
905
+ SUBROUTINE EZFFTB (N,R,AZERO,A,B,WSAVE)
906
+ DIMENSION R(*) ,A(*) ,B(*) ,WSAVE(*)
907
+ C
908
+ IF (N-2) 101,102,103
909
+ 101 R(1) = AZERO
910
+ RETURN
911
+ 102 R(1) = AZERO+A(1)
912
+ R(2) = AZERO-A(1)
913
+ RETURN
914
+ 103 NS2 = (N-1)/2
915
+ DO 104 I=1,NS2
916
+ R(2*I) = .5*A(I)
917
+ R(2*I+1) = -.5*B(I)
918
+ 104 CONTINUE
919
+ R(1) = AZERO
920
+ IF (MOD(N,2) .EQ. 0) R(N) = A(NS2+1)
921
+ CALL RFFTB (N,R,WSAVE(N+1))
922
+ RETURN
923
+ END
924
+ SUBROUTINE EZFFTI (N,WSAVE)
925
+ DIMENSION WSAVE(*)
926
+ C
927
+ IF (N .EQ. 1) RETURN
928
+ CALL EZFFT1 (N,WSAVE(2*N+1),WSAVE(3*N+1))
929
+ RETURN
930
+ END
931
+ SUBROUTINE EZFFT1 (N,WA,IFAC)
932
+ DIMENSION WA(*) ,IFAC(*) ,NTRYH(4)
933
+ DATA NTRYH(1),NTRYH(2),NTRYH(3),NTRYH(4)/4,2,3,5/
934
+ TPI = 2.0*PIMACH(DUM)
935
+ NL = N
936
+ NF = 0
937
+ J = 0
938
+ 101 J = J+1
939
+ IF (J-4) 102,102,103
940
+ 102 NTRY = NTRYH(J)
941
+ GO TO 104
942
+ 103 NTRY = NTRY+2
943
+ 104 NQ = NL/NTRY
944
+ NR = NL-NTRY*NQ
945
+ IF (NR) 101,105,101
946
+ 105 NF = NF+1
947
+ IFAC(NF+2) = NTRY
948
+ NL = NQ
949
+ IF (NTRY .NE. 2) GO TO 107
950
+ IF (NF .EQ. 1) GO TO 107
951
+ DO 106 I=2,NF
952
+ IB = NF-I+2
953
+ IFAC(IB+2) = IFAC(IB+1)
954
+ 106 CONTINUE
955
+ IFAC(3) = 2
956
+ 107 IF (NL .NE. 1) GO TO 104
957
+ IFAC(1) = N
958
+ IFAC(2) = NF
959
+ ARGH = TPI/FLOAT(N)
960
+ IS = 0
961
+ NFM1 = NF-1
962
+ L1 = 1
963
+ IF (NFM1 .EQ. 0) RETURN
964
+ DO 111 K1=1,NFM1
965
+ IP = IFAC(K1+2)
966
+ L2 = L1*IP
967
+ IDO = N/L2
968
+ IPM = IP-1
969
+ ARG1 = FLOAT(L1)*ARGH
970
+ CH1 = 1.
971
+ SH1 = 0.
972
+ DCH1 = COS(ARG1)
973
+ DSH1 = SIN(ARG1)
974
+ DO 110 J=1,IPM
975
+ CH1H = DCH1*CH1-DSH1*SH1
976
+ SH1 = DCH1*SH1+DSH1*CH1
977
+ CH1 = CH1H
978
+ I = IS+2
979
+ WA(I-1) = CH1
980
+ WA(I) = SH1
981
+ IF (IDO .LT. 5) GO TO 109
982
+ DO 108 II=5,IDO,2
983
+ I = I+2
984
+ WA(I-1) = CH1*WA(I-3)-SH1*WA(I-2)
985
+ WA(I) = CH1*WA(I-2)+SH1*WA(I-3)
986
+ 108 CONTINUE
987
+ 109 IS = IS+IDO
988
+ 110 CONTINUE
989
+ L1 = L2
990
+ 111 CONTINUE
991
+ RETURN
992
+ END
993
+ SUBROUTINE COSTI (N,WSAVE)
994
+ DIMENSION WSAVE(*)
995
+ C
996
+ PI = PIMACH(DUM)
997
+ IF (N .LE. 3) RETURN
998
+ NM1 = N-1
999
+ NP1 = N+1
1000
+ NS2 = N/2
1001
+ DT = PI/FLOAT(NM1)
1002
+ FK = 0.
1003
+ DO 101 K=2,NS2
1004
+ KC = NP1-K
1005
+ FK = FK+1.
1006
+ WSAVE(K) = 2.*SIN(FK*DT)
1007
+ WSAVE(KC) = 2.*COS(FK*DT)
1008
+ 101 CONTINUE
1009
+ CALL RFFTI (NM1,WSAVE(N+1))
1010
+ RETURN
1011
+ END
1012
+ SUBROUTINE COST (N,X,WSAVE)
1013
+ DIMENSION X(*) ,WSAVE(*)
1014
+ C
1015
+ NM1 = N-1
1016
+ NP1 = N+1
1017
+ NS2 = N/2
1018
+ IF (N-2) 106,101,102
1019
+ 101 X1H = X(1)+X(2)
1020
+ X(2) = X(1)-X(2)
1021
+ X(1) = X1H
1022
+ RETURN
1023
+ 102 IF (N .GT. 3) GO TO 103
1024
+ X1P3 = X(1)+X(3)
1025
+ TX2 = X(2)+X(2)
1026
+ X(2) = X(1)-X(3)
1027
+ X(1) = X1P3+TX2
1028
+ X(3) = X1P3-TX2
1029
+ RETURN
1030
+ 103 C1 = X(1)-X(N)
1031
+ X(1) = X(1)+X(N)
1032
+ DO 104 K=2,NS2
1033
+ KC = NP1-K
1034
+ T1 = X(K)+X(KC)
1035
+ T2 = X(K)-X(KC)
1036
+ C1 = C1+WSAVE(KC)*T2
1037
+ T2 = WSAVE(K)*T2
1038
+ X(K) = T1-T2
1039
+ X(KC) = T1+T2
1040
+ 104 CONTINUE
1041
+ MODN = MOD(N,2)
1042
+ IF (MODN .NE. 0) X(NS2+1) = X(NS2+1)+X(NS2+1)
1043
+ CALL RFFTF (NM1,X,WSAVE(N+1))
1044
+ XIM2 = X(2)
1045
+ X(2) = C1
1046
+ DO 105 I=4,N,2
1047
+ XI = X(I)
1048
+ X(I) = X(I-2)-X(I-1)
1049
+ X(I-1) = XIM2
1050
+ XIM2 = XI
1051
+ 105 CONTINUE
1052
+ IF (MODN .NE. 0) X(N) = XIM2
1053
+ 106 RETURN
1054
+ END
1055
+ SUBROUTINE SINTI (N,WSAVE)
1056
+ DIMENSION WSAVE(*)
1057
+ C
1058
+ PI = PIMACH(DUM)
1059
+ IF (N .LE. 1) RETURN
1060
+ NS2 = N/2
1061
+ NP1 = N+1
1062
+ DT = PI/FLOAT(NP1)
1063
+ DO 101 K=1,NS2
1064
+ WSAVE(K) = 2.*SIN(K*DT)
1065
+ 101 CONTINUE
1066
+ CALL RFFTI (NP1,WSAVE(NS2+1))
1067
+ RETURN
1068
+ END
1069
+ SUBROUTINE SINT (N,X,WSAVE)
1070
+ DIMENSION X(*) ,WSAVE(*)
1071
+ C
1072
+ NP1 = N+1
1073
+ IW1 = N/2+1
1074
+ IW2 = IW1+NP1
1075
+ IW3 = IW2+NP1
1076
+ CALL SINT1(N,X,WSAVE,WSAVE(IW1),WSAVE(IW2),WSAVE(IW3))
1077
+ RETURN
1078
+ END
1079
+ SUBROUTINE SINT1(N,WAR,WAS,XH,X,IFAC)
1080
+ DIMENSION WAR(*),WAS(*),X(*),XH(*),IFAC(*)
1081
+ DATA SQRT3 /1.73205080756888/
1082
+ DO 100 I=1,N
1083
+ XH(I) = WAR(I)
1084
+ WAR(I) = X(I)
1085
+ 100 CONTINUE
1086
+ IF (N-2) 101,102,103
1087
+ 101 XH(1) = XH(1)+XH(1)
1088
+ GO TO 106
1089
+ 102 XHOLD = SQRT3*(XH(1)+XH(2))
1090
+ XH(2) = SQRT3*(XH(1)-XH(2))
1091
+ XH(1) = XHOLD
1092
+ GO TO 106
1093
+ 103 NP1 = N+1
1094
+ NS2 = N/2
1095
+ X(1) = 0.
1096
+ DO 104 K=1,NS2
1097
+ KC = NP1-K
1098
+ T1 = XH(K)-XH(KC)
1099
+ T2 = WAS(K)*(XH(K)+XH(KC))
1100
+ X(K+1) = T1+T2
1101
+ X(KC+1) = T2-T1
1102
+ 104 CONTINUE
1103
+ MODN = MOD(N,2)
1104
+ IF (MODN .NE. 0) X(NS2+2) = 4.*XH(NS2+1)
1105
+ CALL RFFTF1 (NP1,X,XH,WAR,IFAC)
1106
+ XH(1) = .5*X(1)
1107
+ DO 105 I=3,N,2
1108
+ XH(I-1) = -X(I)
1109
+ XH(I) = XH(I-2)+X(I-1)
1110
+ 105 CONTINUE
1111
+ IF (MODN .NE. 0) GO TO 106
1112
+ XH(N) = -X(N+1)
1113
+ 106 DO 107 I=1,N
1114
+ X(I) = WAR(I)
1115
+ WAR(I) = XH(I)
1116
+ 107 CONTINUE
1117
+ RETURN
1118
+ END
1119
+ SUBROUTINE COSQI (N,WSAVE)
1120
+ DIMENSION WSAVE(*)
1121
+ C
1122
+ PIH = 0.5*PIMACH(DUM)
1123
+ DT = PIH/FLOAT(N)
1124
+ FK = 0.
1125
+ DO 101 K=1,N
1126
+ FK = FK+1.
1127
+ WSAVE(K) = COS(FK*DT)
1128
+ 101 CONTINUE
1129
+ CALL RFFTI (N,WSAVE(N+1))
1130
+ RETURN
1131
+ END
1132
+ SUBROUTINE COSQF (N,X,WSAVE)
1133
+ DIMENSION X(*) ,WSAVE(*)
1134
+ DATA SQRT2 /1.4142135623731/
1135
+ C
1136
+ IF (N-2) 102,101,103
1137
+ 101 TSQX = SQRT2*X(2)
1138
+ X(2) = X(1)-TSQX
1139
+ X(1) = X(1)+TSQX
1140
+ 102 RETURN
1141
+ 103 CALL COSQF1 (N,X,WSAVE,WSAVE(N+1))
1142
+ RETURN
1143
+ END
1144
+ SUBROUTINE COSQF1 (N,X,W,XH)
1145
+ DIMENSION X(*) ,W(*) ,XH(*)
1146
+ NS2 = (N+1)/2
1147
+ NP2 = N+2
1148
+ DO 101 K=2,NS2
1149
+ KC = NP2-K
1150
+ XH(K) = X(K)+X(KC)
1151
+ XH(KC) = X(K)-X(KC)
1152
+ 101 CONTINUE
1153
+ MODN = MOD(N,2)
1154
+ IF (MODN .EQ. 0) XH(NS2+1) = X(NS2+1)+X(NS2+1)
1155
+ DO 102 K=2,NS2
1156
+ KC = NP2-K
1157
+ X(K) = W(K-1)*XH(KC)+W(KC-1)*XH(K)
1158
+ X(KC) = W(K-1)*XH(K)-W(KC-1)*XH(KC)
1159
+ 102 CONTINUE
1160
+ IF (MODN .EQ. 0) X(NS2+1) = W(NS2)*XH(NS2+1)
1161
+ CALL RFFTF (N,X,XH)
1162
+ DO 103 I=3,N,2
1163
+ XIM1 = X(I-1)-X(I)
1164
+ X(I) = X(I-1)+X(I)
1165
+ X(I-1) = XIM1
1166
+ 103 CONTINUE
1167
+ RETURN
1168
+ END
1169
+ SUBROUTINE COSQB (N,X,WSAVE)
1170
+ DIMENSION X(*) ,WSAVE(*)
1171
+ DATA TSQRT2 /2.82842712474619/
1172
+ C
1173
+ IF (N-2) 101,102,103
1174
+ 101 X(1) = 4.*X(1)
1175
+ RETURN
1176
+ 102 X1 = 4.*(X(1)+X(2))
1177
+ X(2) = TSQRT2*(X(1)-X(2))
1178
+ X(1) = X1
1179
+ RETURN
1180
+ 103 CALL COSQB1 (N,X,WSAVE,WSAVE(N+1))
1181
+ RETURN
1182
+ END
1183
+ SUBROUTINE COSQB1 (N,X,W,XH)
1184
+ DIMENSION X(*) ,W(*) ,XH(*)
1185
+ NS2 = (N+1)/2
1186
+ NP2 = N+2
1187
+ DO 101 I=3,N,2
1188
+ XIM1 = X(I-1)+X(I)
1189
+ X(I) = X(I)-X(I-1)
1190
+ X(I-1) = XIM1
1191
+ 101 CONTINUE
1192
+ X(1) = X(1)+X(1)
1193
+ MODN = MOD(N,2)
1194
+ IF (MODN .EQ. 0) X(N) = X(N)+X(N)
1195
+ CALL RFFTB (N,X,XH)
1196
+ DO 102 K=2,NS2
1197
+ KC = NP2-K
1198
+ XH(K) = W(K-1)*X(KC)+W(KC-1)*X(K)
1199
+ XH(KC) = W(K-1)*X(K)-W(KC-1)*X(KC)
1200
+ 102 CONTINUE
1201
+ IF (MODN .EQ. 0) X(NS2+1) = W(NS2)*(X(NS2+1)+X(NS2+1))
1202
+ DO 103 K=2,NS2
1203
+ KC = NP2-K
1204
+ X(K) = XH(K)+XH(KC)
1205
+ X(KC) = XH(K)-XH(KC)
1206
+ 103 CONTINUE
1207
+ X(1) = X(1)+X(1)
1208
+ RETURN
1209
+ END
1210
+ SUBROUTINE SINQI (N,WSAVE)
1211
+ DIMENSION WSAVE(*)
1212
+ C
1213
+ CALL COSQI (N,WSAVE)
1214
+ RETURN
1215
+ END
1216
+ SUBROUTINE SINQF (N,X,WSAVE)
1217
+ DIMENSION X(*) ,WSAVE(*)
1218
+ C
1219
+ IF (N .EQ. 1) RETURN
1220
+ NS2 = N/2
1221
+ DO 101 K=1,NS2
1222
+ KC = N-K
1223
+ XHOLD = X(K)
1224
+ X(K) = X(KC+1)
1225
+ X(KC+1) = XHOLD
1226
+ 101 CONTINUE
1227
+ CALL COSQF (N,X,WSAVE)
1228
+ DO 102 K=2,N,2
1229
+ X(K) = -X(K)
1230
+ 102 CONTINUE
1231
+ RETURN
1232
+ END
1233
+ SUBROUTINE SINQB (N,X,WSAVE)
1234
+ DIMENSION X(*) ,WSAVE(*)
1235
+ C
1236
+ IF (N .GT. 1) GO TO 101
1237
+ X(1) = 4.*X(1)
1238
+ RETURN
1239
+ 101 NS2 = N/2
1240
+ DO 102 K=2,N,2
1241
+ X(K) = -X(K)
1242
+ 102 CONTINUE
1243
+ CALL COSQB (N,X,WSAVE)
1244
+ DO 103 K=1,NS2
1245
+ KC = N-K
1246
+ XHOLD = X(K)
1247
+ X(K) = X(KC+1)
1248
+ X(KC+1) = XHOLD
1249
+ 103 CONTINUE
1250
+ RETURN
1251
+ END
1252
+ SUBROUTINE CFFTI (N,WSAVE)
1253
+ DIMENSION WSAVE(*)
1254
+ C
1255
+ IF (N .EQ. 1) RETURN
1256
+ IW1 = N+N+1
1257
+ IW2 = IW1+N+N
1258
+ CALL CFFTI1 (N,WSAVE(IW1),WSAVE(IW2))
1259
+ RETURN
1260
+ END
1261
+ SUBROUTINE CFFTI1 (N,WA,IFAC)
1262
+ DIMENSION WA(*) ,IFAC(*) ,NTRYH(4)
1263
+ DATA NTRYH(1),NTRYH(2),NTRYH(3),NTRYH(4)/3,4,2,5/
1264
+ NL = N
1265
+ NF = 0
1266
+ J = 0
1267
+ 101 J = J+1
1268
+ IF (J-4) 102,102,103
1269
+ 102 NTRY = NTRYH(J)
1270
+ GO TO 104
1271
+ 103 NTRY = NTRY+2
1272
+ 104 NQ = NL/NTRY
1273
+ NR = NL-NTRY*NQ
1274
+ IF (NR) 101,105,101
1275
+ 105 NF = NF+1
1276
+ IFAC(NF+2) = NTRY
1277
+ NL = NQ
1278
+ IF (NTRY .NE. 2) GO TO 107
1279
+ IF (NF .EQ. 1) GO TO 107
1280
+ DO 106 I=2,NF
1281
+ IB = NF-I+2
1282
+ IFAC(IB+2) = IFAC(IB+1)
1283
+ 106 CONTINUE
1284
+ IFAC(3) = 2
1285
+ 107 IF (NL .NE. 1) GO TO 104
1286
+ IFAC(1) = N
1287
+ IFAC(2) = NF
1288
+ TPI = 2.*PIMACH(DUM)
1289
+ ARGH = TPI/FLOAT(N)
1290
+ I = 2
1291
+ L1 = 1
1292
+ DO 110 K1=1,NF
1293
+ IP = IFAC(K1+2)
1294
+ LD = 0
1295
+ L2 = L1*IP
1296
+ IDO = N/L2
1297
+ IDOT = IDO+IDO+2
1298
+ IPM = IP-1
1299
+ DO 109 J=1,IPM
1300
+ I1 = I
1301
+ WA(I-1) = 1.
1302
+ WA(I) = 0.
1303
+ LD = LD+L1
1304
+ FI = 0.
1305
+ ARGLD = FLOAT(LD)*ARGH
1306
+ DO 108 II=4,IDOT,2
1307
+ I = I+2
1308
+ FI = FI+1.
1309
+ ARG = FI*ARGLD
1310
+ WA(I-1) = COS(ARG)
1311
+ WA(I) = SIN(ARG)
1312
+ 108 CONTINUE
1313
+ IF (IP .LE. 5) GO TO 109
1314
+ WA(I1-1) = WA(I-1)
1315
+ WA(I1) = WA(I)
1316
+ 109 CONTINUE
1317
+ L1 = L2
1318
+ 110 CONTINUE
1319
+ RETURN
1320
+ END
1321
+ SUBROUTINE CFFTB (N,C,WSAVE)
1322
+ DIMENSION C(*) ,WSAVE(*)
1323
+ C
1324
+ IF (N .EQ. 1) RETURN
1325
+ IW1 = N+N+1
1326
+ IW2 = IW1+N+N
1327
+ CALL CFFTB1 (N,C,WSAVE,WSAVE(IW1),WSAVE(IW2))
1328
+ RETURN
1329
+ END
1330
+ SUBROUTINE CFFTB1 (N,C,CH,WA,IFAC)
1331
+ DIMENSION CH(*) ,C(*) ,WA(*) ,IFAC(*)
1332
+ NF = IFAC(2)
1333
+ NA = 0
1334
+ L1 = 1
1335
+ IW = 1
1336
+ DO 116 K1=1,NF
1337
+ IP = IFAC(K1+2)
1338
+ L2 = IP*L1
1339
+ IDO = N/L2
1340
+ IDOT = IDO+IDO
1341
+ IDL1 = IDOT*L1
1342
+ IF (IP .NE. 4) GO TO 103
1343
+ IX2 = IW+IDOT
1344
+ IX3 = IX2+IDOT
1345
+ IF (NA .NE. 0) GO TO 101
1346
+ CALL PASSB4 (IDOT,L1,C,CH,WA(IW),WA(IX2),WA(IX3))
1347
+ GO TO 102
1348
+ 101 CALL PASSB4 (IDOT,L1,CH,C,WA(IW),WA(IX2),WA(IX3))
1349
+ 102 NA = 1-NA
1350
+ GO TO 115
1351
+ 103 IF (IP .NE. 2) GO TO 106
1352
+ IF (NA .NE. 0) GO TO 104
1353
+ CALL PASSB2 (IDOT,L1,C,CH,WA(IW))
1354
+ GO TO 105
1355
+ 104 CALL PASSB2 (IDOT,L1,CH,C,WA(IW))
1356
+ 105 NA = 1-NA
1357
+ GO TO 115
1358
+ 106 IF (IP .NE. 3) GO TO 109
1359
+ IX2 = IW+IDOT
1360
+ IF (NA .NE. 0) GO TO 107
1361
+ CALL PASSB3 (IDOT,L1,C,CH,WA(IW),WA(IX2))
1362
+ GO TO 108
1363
+ 107 CALL PASSB3 (IDOT,L1,CH,C,WA(IW),WA(IX2))
1364
+ 108 NA = 1-NA
1365
+ GO TO 115
1366
+ 109 IF (IP .NE. 5) GO TO 112
1367
+ IX2 = IW+IDOT
1368
+ IX3 = IX2+IDOT
1369
+ IX4 = IX3+IDOT
1370
+ IF (NA .NE. 0) GO TO 110
1371
+ CALL PASSB5 (IDOT,L1,C,CH,WA(IW),WA(IX2),WA(IX3),WA(IX4))
1372
+ GO TO 111
1373
+ 110 CALL PASSB5 (IDOT,L1,CH,C,WA(IW),WA(IX2),WA(IX3),WA(IX4))
1374
+ 111 NA = 1-NA
1375
+ GO TO 115
1376
+ 112 IF (NA .NE. 0) GO TO 113
1377
+ CALL PASSB (NAC,IDOT,IP,L1,IDL1,C,C,C,CH,CH,WA(IW))
1378
+ GO TO 114
1379
+ 113 CALL PASSB (NAC,IDOT,IP,L1,IDL1,CH,CH,CH,C,C,WA(IW))
1380
+ 114 IF (NAC .NE. 0) NA = 1-NA
1381
+ 115 L1 = L2
1382
+ IW = IW+(IP-1)*IDOT
1383
+ 116 CONTINUE
1384
+ IF (NA .EQ. 0) RETURN
1385
+ N2 = N+N
1386
+ DO 117 I=1,N2
1387
+ C(I) = CH(I)
1388
+ 117 CONTINUE
1389
+ RETURN
1390
+ END
1391
+ SUBROUTINE PASSB2 (IDO,L1,CC,CH,WA1)
1392
+ DIMENSION CC(IDO,2,L1) ,CH(IDO,L1,2) ,
1393
+ 1 WA1(1)
1394
+ IF (IDO .GT. 2) GO TO 102
1395
+ DO 101 K=1,L1
1396
+ CH(1,K,1) = CC(1,1,K)+CC(1,2,K)
1397
+ CH(1,K,2) = CC(1,1,K)-CC(1,2,K)
1398
+ CH(2,K,1) = CC(2,1,K)+CC(2,2,K)
1399
+ CH(2,K,2) = CC(2,1,K)-CC(2,2,K)
1400
+ 101 CONTINUE
1401
+ RETURN
1402
+ 102 DO 104 K=1,L1
1403
+ DO 103 I=2,IDO,2
1404
+ CH(I-1,K,1) = CC(I-1,1,K)+CC(I-1,2,K)
1405
+ TR2 = CC(I-1,1,K)-CC(I-1,2,K)
1406
+ CH(I,K,1) = CC(I,1,K)+CC(I,2,K)
1407
+ TI2 = CC(I,1,K)-CC(I,2,K)
1408
+ CH(I,K,2) = WA1(I-1)*TI2+WA1(I)*TR2
1409
+ CH(I-1,K,2) = WA1(I-1)*TR2-WA1(I)*TI2
1410
+ 103 CONTINUE
1411
+ 104 CONTINUE
1412
+ RETURN
1413
+ END
1414
+ SUBROUTINE PASSB3 (IDO,L1,CC,CH,WA1,WA2)
1415
+ DIMENSION CC(IDO,3,L1) ,CH(IDO,L1,3) ,
1416
+ 1 WA1(*) ,WA2(*)
1417
+ DATA TAUR,TAUI /-.5,.866025403784439/
1418
+ IF (IDO .NE. 2) GO TO 102
1419
+ DO 101 K=1,L1
1420
+ TR2 = CC(1,2,K)+CC(1,3,K)
1421
+ CR2 = CC(1,1,K)+TAUR*TR2
1422
+ CH(1,K,1) = CC(1,1,K)+TR2
1423
+ TI2 = CC(2,2,K)+CC(2,3,K)
1424
+ CI2 = CC(2,1,K)+TAUR*TI2
1425
+ CH(2,K,1) = CC(2,1,K)+TI2
1426
+ CR3 = TAUI*(CC(1,2,K)-CC(1,3,K))
1427
+ CI3 = TAUI*(CC(2,2,K)-CC(2,3,K))
1428
+ CH(1,K,2) = CR2-CI3
1429
+ CH(1,K,3) = CR2+CI3
1430
+ CH(2,K,2) = CI2+CR3
1431
+ CH(2,K,3) = CI2-CR3
1432
+ 101 CONTINUE
1433
+ RETURN
1434
+ 102 DO 104 K=1,L1
1435
+ DO 103 I=2,IDO,2
1436
+ TR2 = CC(I-1,2,K)+CC(I-1,3,K)
1437
+ CR2 = CC(I-1,1,K)+TAUR*TR2
1438
+ CH(I-1,K,1) = CC(I-1,1,K)+TR2
1439
+ TI2 = CC(I,2,K)+CC(I,3,K)
1440
+ CI2 = CC(I,1,K)+TAUR*TI2
1441
+ CH(I,K,1) = CC(I,1,K)+TI2
1442
+ CR3 = TAUI*(CC(I-1,2,K)-CC(I-1,3,K))
1443
+ CI3 = TAUI*(CC(I,2,K)-CC(I,3,K))
1444
+ DR2 = CR2-CI3
1445
+ DR3 = CR2+CI3
1446
+ DI2 = CI2+CR3
1447
+ DI3 = CI2-CR3
1448
+ CH(I,K,2) = WA1(I-1)*DI2+WA1(I)*DR2
1449
+ CH(I-1,K,2) = WA1(I-1)*DR2-WA1(I)*DI2
1450
+ CH(I,K,3) = WA2(I-1)*DI3+WA2(I)*DR3
1451
+ CH(I-1,K,3) = WA2(I-1)*DR3-WA2(I)*DI3
1452
+ 103 CONTINUE
1453
+ 104 CONTINUE
1454
+ RETURN
1455
+ END
1456
+ SUBROUTINE PASSB4 (IDO,L1,CC,CH,WA1,WA2,WA3)
1457
+ DIMENSION CC(IDO,4,L1) ,CH(IDO,L1,4) ,
1458
+ 1 WA1(*) ,WA2(*) ,WA3(*)
1459
+ IF (IDO .NE. 2) GO TO 102
1460
+ DO 101 K=1,L1
1461
+ TI1 = CC(2,1,K)-CC(2,3,K)
1462
+ TI2 = CC(2,1,K)+CC(2,3,K)
1463
+ TR4 = CC(2,4,K)-CC(2,2,K)
1464
+ TI3 = CC(2,2,K)+CC(2,4,K)
1465
+ TR1 = CC(1,1,K)-CC(1,3,K)
1466
+ TR2 = CC(1,1,K)+CC(1,3,K)
1467
+ TI4 = CC(1,2,K)-CC(1,4,K)
1468
+ TR3 = CC(1,2,K)+CC(1,4,K)
1469
+ CH(1,K,1) = TR2+TR3
1470
+ CH(1,K,3) = TR2-TR3
1471
+ CH(2,K,1) = TI2+TI3
1472
+ CH(2,K,3) = TI2-TI3
1473
+ CH(1,K,2) = TR1+TR4
1474
+ CH(1,K,4) = TR1-TR4
1475
+ CH(2,K,2) = TI1+TI4
1476
+ CH(2,K,4) = TI1-TI4
1477
+ 101 CONTINUE
1478
+ RETURN
1479
+ 102 DO 104 K=1,L1
1480
+ DO 103 I=2,IDO,2
1481
+ TI1 = CC(I,1,K)-CC(I,3,K)
1482
+ TI2 = CC(I,1,K)+CC(I,3,K)
1483
+ TI3 = CC(I,2,K)+CC(I,4,K)
1484
+ TR4 = CC(I,4,K)-CC(I,2,K)
1485
+ TR1 = CC(I-1,1,K)-CC(I-1,3,K)
1486
+ TR2 = CC(I-1,1,K)+CC(I-1,3,K)
1487
+ TI4 = CC(I-1,2,K)-CC(I-1,4,K)
1488
+ TR3 = CC(I-1,2,K)+CC(I-1,4,K)
1489
+ CH(I-1,K,1) = TR2+TR3
1490
+ CR3 = TR2-TR3
1491
+ CH(I,K,1) = TI2+TI3
1492
+ CI3 = TI2-TI3
1493
+ CR2 = TR1+TR4
1494
+ CR4 = TR1-TR4
1495
+ CI2 = TI1+TI4
1496
+ CI4 = TI1-TI4
1497
+ CH(I-1,K,2) = WA1(I-1)*CR2-WA1(I)*CI2
1498
+ CH(I,K,2) = WA1(I-1)*CI2+WA1(I)*CR2
1499
+ CH(I-1,K,3) = WA2(I-1)*CR3-WA2(I)*CI3
1500
+ CH(I,K,3) = WA2(I-1)*CI3+WA2(I)*CR3
1501
+ CH(I-1,K,4) = WA3(I-1)*CR4-WA3(I)*CI4
1502
+ CH(I,K,4) = WA3(I-1)*CI4+WA3(I)*CR4
1503
+ 103 CONTINUE
1504
+ 104 CONTINUE
1505
+ RETURN
1506
+ END
1507
+ SUBROUTINE PASSB5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
1508
+ DIMENSION CC(IDO,5,L1) ,CH(IDO,L1,5) ,
1509
+ 1 WA1(*) ,WA2(*) ,WA3(*) ,WA4(*)
1510
+ DATA TR11,TI11,TR12,TI12 /.309016994374947,.951056516295154,
1511
+ 1-.809016994374947,.587785252292473/
1512
+ IF (IDO .NE. 2) GO TO 102
1513
+ DO 101 K=1,L1
1514
+ TI5 = CC(2,2,K)-CC(2,5,K)
1515
+ TI2 = CC(2,2,K)+CC(2,5,K)
1516
+ TI4 = CC(2,3,K)-CC(2,4,K)
1517
+ TI3 = CC(2,3,K)+CC(2,4,K)
1518
+ TR5 = CC(1,2,K)-CC(1,5,K)
1519
+ TR2 = CC(1,2,K)+CC(1,5,K)
1520
+ TR4 = CC(1,3,K)-CC(1,4,K)
1521
+ TR3 = CC(1,3,K)+CC(1,4,K)
1522
+ CH(1,K,1) = CC(1,1,K)+TR2+TR3
1523
+ CH(2,K,1) = CC(2,1,K)+TI2+TI3
1524
+ CR2 = CC(1,1,K)+TR11*TR2+TR12*TR3
1525
+ CI2 = CC(2,1,K)+TR11*TI2+TR12*TI3
1526
+ CR3 = CC(1,1,K)+TR12*TR2+TR11*TR3
1527
+ CI3 = CC(2,1,K)+TR12*TI2+TR11*TI3
1528
+ CR5 = TI11*TR5+TI12*TR4
1529
+ CI5 = TI11*TI5+TI12*TI4
1530
+ CR4 = TI12*TR5-TI11*TR4
1531
+ CI4 = TI12*TI5-TI11*TI4
1532
+ CH(1,K,2) = CR2-CI5
1533
+ CH(1,K,5) = CR2+CI5
1534
+ CH(2,K,2) = CI2+CR5
1535
+ CH(2,K,3) = CI3+CR4
1536
+ CH(1,K,3) = CR3-CI4
1537
+ CH(1,K,4) = CR3+CI4
1538
+ CH(2,K,4) = CI3-CR4
1539
+ CH(2,K,5) = CI2-CR5
1540
+ 101 CONTINUE
1541
+ RETURN
1542
+ 102 DO 104 K=1,L1
1543
+ DO 103 I=2,IDO,2
1544
+ TI5 = CC(I,2,K)-CC(I,5,K)
1545
+ TI2 = CC(I,2,K)+CC(I,5,K)
1546
+ TI4 = CC(I,3,K)-CC(I,4,K)
1547
+ TI3 = CC(I,3,K)+CC(I,4,K)
1548
+ TR5 = CC(I-1,2,K)-CC(I-1,5,K)
1549
+ TR2 = CC(I-1,2,K)+CC(I-1,5,K)
1550
+ TR4 = CC(I-1,3,K)-CC(I-1,4,K)
1551
+ TR3 = CC(I-1,3,K)+CC(I-1,4,K)
1552
+ CH(I-1,K,1) = CC(I-1,1,K)+TR2+TR3
1553
+ CH(I,K,1) = CC(I,1,K)+TI2+TI3
1554
+ CR2 = CC(I-1,1,K)+TR11*TR2+TR12*TR3
1555
+ CI2 = CC(I,1,K)+TR11*TI2+TR12*TI3
1556
+ CR3 = CC(I-1,1,K)+TR12*TR2+TR11*TR3
1557
+ CI3 = CC(I,1,K)+TR12*TI2+TR11*TI3
1558
+ CR5 = TI11*TR5+TI12*TR4
1559
+ CI5 = TI11*TI5+TI12*TI4
1560
+ CR4 = TI12*TR5-TI11*TR4
1561
+ CI4 = TI12*TI5-TI11*TI4
1562
+ DR3 = CR3-CI4
1563
+ DR4 = CR3+CI4
1564
+ DI3 = CI3+CR4
1565
+ DI4 = CI3-CR4
1566
+ DR5 = CR2+CI5
1567
+ DR2 = CR2-CI5
1568
+ DI5 = CI2-CR5
1569
+ DI2 = CI2+CR5
1570
+ CH(I-1,K,2) = WA1(I-1)*DR2-WA1(I)*DI2
1571
+ CH(I,K,2) = WA1(I-1)*DI2+WA1(I)*DR2
1572
+ CH(I-1,K,3) = WA2(I-1)*DR3-WA2(I)*DI3
1573
+ CH(I,K,3) = WA2(I-1)*DI3+WA2(I)*DR3
1574
+ CH(I-1,K,4) = WA3(I-1)*DR4-WA3(I)*DI4
1575
+ CH(I,K,4) = WA3(I-1)*DI4+WA3(I)*DR4
1576
+ CH(I-1,K,5) = WA4(I-1)*DR5-WA4(I)*DI5
1577
+ CH(I,K,5) = WA4(I-1)*DI5+WA4(I)*DR5
1578
+ 103 CONTINUE
1579
+ 104 CONTINUE
1580
+ RETURN
1581
+ END
1582
+ SUBROUTINE PASSB (NAC,IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
1583
+ DIMENSION CH(IDO,L1,IP) ,CC(IDO,IP,L1) ,
1584
+ 1 C1(IDO,L1,IP) ,WA(*) ,C2(IDL1,IP),
1585
+ 2 CH2(IDL1,IP)
1586
+ IDOT = IDO/2
1587
+ NT = IP*IDL1
1588
+ IPP2 = IP+2
1589
+ IPPH = (IP+1)/2
1590
+ IDP = IP*IDO
1591
+ C
1592
+ IF (IDO .LT. L1) GO TO 106
1593
+ DO 103 J=2,IPPH
1594
+ JC = IPP2-J
1595
+ DO 102 K=1,L1
1596
+ DO 101 I=1,IDO
1597
+ CH(I,K,J) = CC(I,J,K)+CC(I,JC,K)
1598
+ CH(I,K,JC) = CC(I,J,K)-CC(I,JC,K)
1599
+ 101 CONTINUE
1600
+ 102 CONTINUE
1601
+ 103 CONTINUE
1602
+ DO 105 K=1,L1
1603
+ DO 104 I=1,IDO
1604
+ CH(I,K,1) = CC(I,1,K)
1605
+ 104 CONTINUE
1606
+ 105 CONTINUE
1607
+ GO TO 112
1608
+ 106 DO 109 J=2,IPPH
1609
+ JC = IPP2-J
1610
+ DO 108 I=1,IDO
1611
+ DO 107 K=1,L1
1612
+ CH(I,K,J) = CC(I,J,K)+CC(I,JC,K)
1613
+ CH(I,K,JC) = CC(I,J,K)-CC(I,JC,K)
1614
+ 107 CONTINUE
1615
+ 108 CONTINUE
1616
+ 109 CONTINUE
1617
+ DO 111 I=1,IDO
1618
+ DO 110 K=1,L1
1619
+ CH(I,K,1) = CC(I,1,K)
1620
+ 110 CONTINUE
1621
+ 111 CONTINUE
1622
+ 112 IDL = 2-IDO
1623
+ INC = 0
1624
+ DO 116 L=2,IPPH
1625
+ LC = IPP2-L
1626
+ IDL = IDL+IDO
1627
+ DO 113 IK=1,IDL1
1628
+ C2(IK,L) = CH2(IK,1)+WA(IDL-1)*CH2(IK,2)
1629
+ C2(IK,LC) = WA(IDL)*CH2(IK,IP)
1630
+ 113 CONTINUE
1631
+ IDLJ = IDL
1632
+ INC = INC+IDO
1633
+ DO 115 J=3,IPPH
1634
+ JC = IPP2-J
1635
+ IDLJ = IDLJ+INC
1636
+ IF (IDLJ .GT. IDP) IDLJ = IDLJ-IDP
1637
+ WAR = WA(IDLJ-1)
1638
+ WAI = WA(IDLJ)
1639
+ DO 114 IK=1,IDL1
1640
+ C2(IK,L) = C2(IK,L)+WAR*CH2(IK,J)
1641
+ C2(IK,LC) = C2(IK,LC)+WAI*CH2(IK,JC)
1642
+ 114 CONTINUE
1643
+ 115 CONTINUE
1644
+ 116 CONTINUE
1645
+ DO 118 J=2,IPPH
1646
+ DO 117 IK=1,IDL1
1647
+ CH2(IK,1) = CH2(IK,1)+CH2(IK,J)
1648
+ 117 CONTINUE
1649
+ 118 CONTINUE
1650
+ DO 120 J=2,IPPH
1651
+ JC = IPP2-J
1652
+ DO 119 IK=2,IDL1,2
1653
+ CH2(IK-1,J) = C2(IK-1,J)-C2(IK,JC)
1654
+ CH2(IK-1,JC) = C2(IK-1,J)+C2(IK,JC)
1655
+ CH2(IK,J) = C2(IK,J)+C2(IK-1,JC)
1656
+ CH2(IK,JC) = C2(IK,J)-C2(IK-1,JC)
1657
+ 119 CONTINUE
1658
+ 120 CONTINUE
1659
+ NAC = 1
1660
+ IF (IDO .EQ. 2) RETURN
1661
+ NAC = 0
1662
+ DO 121 IK=1,IDL1
1663
+ C2(IK,1) = CH2(IK,1)
1664
+ 121 CONTINUE
1665
+ DO 123 J=2,IP
1666
+ DO 122 K=1,L1
1667
+ C1(1,K,J) = CH(1,K,J)
1668
+ C1(2,K,J) = CH(2,K,J)
1669
+ 122 CONTINUE
1670
+ 123 CONTINUE
1671
+ IF (IDOT .GT. L1) GO TO 127
1672
+ IDIJ = 0
1673
+ DO 126 J=2,IP
1674
+ IDIJ = IDIJ+2
1675
+ DO 125 I=4,IDO,2
1676
+ IDIJ = IDIJ+2
1677
+ DO 124 K=1,L1
1678
+ C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)-WA(IDIJ)*CH(I,K,J)
1679
+ C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)+WA(IDIJ)*CH(I-1,K,J)
1680
+ 124 CONTINUE
1681
+ 125 CONTINUE
1682
+ 126 CONTINUE
1683
+ RETURN
1684
+ 127 IDJ = 2-IDO
1685
+ DO 130 J=2,IP
1686
+ IDJ = IDJ+IDO
1687
+ DO 129 K=1,L1
1688
+ IDIJ = IDJ
1689
+ DO 128 I=4,IDO,2
1690
+ IDIJ = IDIJ+2
1691
+ C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)-WA(IDIJ)*CH(I,K,J)
1692
+ C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)+WA(IDIJ)*CH(I-1,K,J)
1693
+ 128 CONTINUE
1694
+ 129 CONTINUE
1695
+ 130 CONTINUE
1696
+ RETURN
1697
+ END
1698
+ SUBROUTINE CFFTF (N,C,WSAVE)
1699
+ DIMENSION C(*) ,WSAVE(*)
1700
+ C
1701
+ IF (N .EQ. 1) RETURN
1702
+ IW1 = N+N+1
1703
+ IW2 = IW1+N+N
1704
+ CALL CFFTF1 (N,C,WSAVE,WSAVE(IW1),WSAVE(IW2))
1705
+ RETURN
1706
+ END
1707
+ SUBROUTINE CFFTF1 (N,C,CH,WA,IFAC)
1708
+ DIMENSION CH(*) ,C(*) ,WA(*) ,IFAC(*)
1709
+ NF = IFAC(2)
1710
+ NA = 0
1711
+ L1 = 1
1712
+ IW = 1
1713
+ DO 116 K1=1,NF
1714
+ IP = IFAC(K1+2)
1715
+ L2 = IP*L1
1716
+ IDO = N/L2
1717
+ IDOT = IDO+IDO
1718
+ IDL1 = IDOT*L1
1719
+ IF (IP .NE. 4) GO TO 103
1720
+ IX2 = IW+IDOT
1721
+ IX3 = IX2+IDOT
1722
+ IF (NA .NE. 0) GO TO 101
1723
+ CALL PASSF4 (IDOT,L1,C,CH,WA(IW),WA(IX2),WA(IX3))
1724
+ GO TO 102
1725
+ 101 CALL PASSF4 (IDOT,L1,CH,C,WA(IW),WA(IX2),WA(IX3))
1726
+ 102 NA = 1-NA
1727
+ GO TO 115
1728
+ 103 IF (IP .NE. 2) GO TO 106
1729
+ IF (NA .NE. 0) GO TO 104
1730
+ CALL PASSF2 (IDOT,L1,C,CH,WA(IW))
1731
+ GO TO 105
1732
+ 104 CALL PASSF2 (IDOT,L1,CH,C,WA(IW))
1733
+ 105 NA = 1-NA
1734
+ GO TO 115
1735
+ 106 IF (IP .NE. 3) GO TO 109
1736
+ IX2 = IW+IDOT
1737
+ IF (NA .NE. 0) GO TO 107
1738
+ CALL PASSF3 (IDOT,L1,C,CH,WA(IW),WA(IX2))
1739
+ GO TO 108
1740
+ 107 CALL PASSF3 (IDOT,L1,CH,C,WA(IW),WA(IX2))
1741
+ 108 NA = 1-NA
1742
+ GO TO 115
1743
+ 109 IF (IP .NE. 5) GO TO 112
1744
+ IX2 = IW+IDOT
1745
+ IX3 = IX2+IDOT
1746
+ IX4 = IX3+IDOT
1747
+ IF (NA .NE. 0) GO TO 110
1748
+ CALL PASSF5 (IDOT,L1,C,CH,WA(IW),WA(IX2),WA(IX3),WA(IX4))
1749
+ GO TO 111
1750
+ 110 CALL PASSF5 (IDOT,L1,CH,C,WA(IW),WA(IX2),WA(IX3),WA(IX4))
1751
+ 111 NA = 1-NA
1752
+ GO TO 115
1753
+ 112 IF (NA .NE. 0) GO TO 113
1754
+ CALL PASSF (NAC,IDOT,IP,L1,IDL1,C,C,C,CH,CH,WA(IW))
1755
+ GO TO 114
1756
+ 113 CALL PASSF (NAC,IDOT,IP,L1,IDL1,CH,CH,CH,C,C,WA(IW))
1757
+ 114 IF (NAC .NE. 0) NA = 1-NA
1758
+ 115 L1 = L2
1759
+ IW = IW+(IP-1)*IDOT
1760
+ 116 CONTINUE
1761
+ IF (NA .EQ. 0) RETURN
1762
+ N2 = N+N
1763
+ DO 117 I=1,N2
1764
+ C(I) = CH(I)
1765
+ 117 CONTINUE
1766
+ RETURN
1767
+ END
1768
+ SUBROUTINE PASSF2 (IDO,L1,CC,CH,WA1)
1769
+ DIMENSION CC(IDO,2,L1) ,CH(IDO,L1,2) ,
1770
+ 1 WA1(*)
1771
+ IF (IDO .GT. 2) GO TO 102
1772
+ DO 101 K=1,L1
1773
+ CH(1,K,1) = CC(1,1,K)+CC(1,2,K)
1774
+ CH(1,K,2) = CC(1,1,K)-CC(1,2,K)
1775
+ CH(2,K,1) = CC(2,1,K)+CC(2,2,K)
1776
+ CH(2,K,2) = CC(2,1,K)-CC(2,2,K)
1777
+ 101 CONTINUE
1778
+ RETURN
1779
+ 102 DO 104 K=1,L1
1780
+ DO 103 I=2,IDO,2
1781
+ CH(I-1,K,1) = CC(I-1,1,K)+CC(I-1,2,K)
1782
+ TR2 = CC(I-1,1,K)-CC(I-1,2,K)
1783
+ CH(I,K,1) = CC(I,1,K)+CC(I,2,K)
1784
+ TI2 = CC(I,1,K)-CC(I,2,K)
1785
+ CH(I,K,2) = WA1(I-1)*TI2-WA1(I)*TR2
1786
+ CH(I-1,K,2) = WA1(I-1)*TR2+WA1(I)*TI2
1787
+ 103 CONTINUE
1788
+ 104 CONTINUE
1789
+ RETURN
1790
+ END
1791
+ SUBROUTINE PASSF3 (IDO,L1,CC,CH,WA1,WA2)
1792
+ DIMENSION CC(IDO,3,L1) ,CH(IDO,L1,3) ,
1793
+ 1 WA1(*) ,WA2(*)
1794
+ DATA TAUR,TAUI /-.5,-.866025403784439/
1795
+ IF (IDO .NE. 2) GO TO 102
1796
+ DO 101 K=1,L1
1797
+ TR2 = CC(1,2,K)+CC(1,3,K)
1798
+ CR2 = CC(1,1,K)+TAUR*TR2
1799
+ CH(1,K,1) = CC(1,1,K)+TR2
1800
+ TI2 = CC(2,2,K)+CC(2,3,K)
1801
+ CI2 = CC(2,1,K)+TAUR*TI2
1802
+ CH(2,K,1) = CC(2,1,K)+TI2
1803
+ CR3 = TAUI*(CC(1,2,K)-CC(1,3,K))
1804
+ CI3 = TAUI*(CC(2,2,K)-CC(2,3,K))
1805
+ CH(1,K,2) = CR2-CI3
1806
+ CH(1,K,3) = CR2+CI3
1807
+ CH(2,K,2) = CI2+CR3
1808
+ CH(2,K,3) = CI2-CR3
1809
+ 101 CONTINUE
1810
+ RETURN
1811
+ 102 DO 104 K=1,L1
1812
+ DO 103 I=2,IDO,2
1813
+ TR2 = CC(I-1,2,K)+CC(I-1,3,K)
1814
+ CR2 = CC(I-1,1,K)+TAUR*TR2
1815
+ CH(I-1,K,1) = CC(I-1,1,K)+TR2
1816
+ TI2 = CC(I,2,K)+CC(I,3,K)
1817
+ CI2 = CC(I,1,K)+TAUR*TI2
1818
+ CH(I,K,1) = CC(I,1,K)+TI2
1819
+ CR3 = TAUI*(CC(I-1,2,K)-CC(I-1,3,K))
1820
+ CI3 = TAUI*(CC(I,2,K)-CC(I,3,K))
1821
+ DR2 = CR2-CI3
1822
+ DR3 = CR2+CI3
1823
+ DI2 = CI2+CR3
1824
+ DI3 = CI2-CR3
1825
+ CH(I,K,2) = WA1(I-1)*DI2-WA1(I)*DR2
1826
+ CH(I-1,K,2) = WA1(I-1)*DR2+WA1(I)*DI2
1827
+ CH(I,K,3) = WA2(I-1)*DI3-WA2(I)*DR3
1828
+ CH(I-1,K,3) = WA2(I-1)*DR3+WA2(I)*DI3
1829
+ 103 CONTINUE
1830
+ 104 CONTINUE
1831
+ RETURN
1832
+ END
1833
+ SUBROUTINE PASSF4 (IDO,L1,CC,CH,WA1,WA2,WA3)
1834
+ DIMENSION CC(IDO,4,L1) ,CH(IDO,L1,4) ,
1835
+ 1 WA1(*) ,WA2(*) ,WA3(*)
1836
+ IF (IDO .NE. 2) GO TO 102
1837
+ DO 101 K=1,L1
1838
+ TI1 = CC(2,1,K)-CC(2,3,K)
1839
+ TI2 = CC(2,1,K)+CC(2,3,K)
1840
+ TR4 = CC(2,2,K)-CC(2,4,K)
1841
+ TI3 = CC(2,2,K)+CC(2,4,K)
1842
+ TR1 = CC(1,1,K)-CC(1,3,K)
1843
+ TR2 = CC(1,1,K)+CC(1,3,K)
1844
+ TI4 = CC(1,4,K)-CC(1,2,K)
1845
+ TR3 = CC(1,2,K)+CC(1,4,K)
1846
+ CH(1,K,1) = TR2+TR3
1847
+ CH(1,K,3) = TR2-TR3
1848
+ CH(2,K,1) = TI2+TI3
1849
+ CH(2,K,3) = TI2-TI3
1850
+ CH(1,K,2) = TR1+TR4
1851
+ CH(1,K,4) = TR1-TR4
1852
+ CH(2,K,2) = TI1+TI4
1853
+ CH(2,K,4) = TI1-TI4
1854
+ 101 CONTINUE
1855
+ RETURN
1856
+ 102 DO 104 K=1,L1
1857
+ DO 103 I=2,IDO,2
1858
+ TI1 = CC(I,1,K)-CC(I,3,K)
1859
+ TI2 = CC(I,1,K)+CC(I,3,K)
1860
+ TI3 = CC(I,2,K)+CC(I,4,K)
1861
+ TR4 = CC(I,2,K)-CC(I,4,K)
1862
+ TR1 = CC(I-1,1,K)-CC(I-1,3,K)
1863
+ TR2 = CC(I-1,1,K)+CC(I-1,3,K)
1864
+ TI4 = CC(I-1,4,K)-CC(I-1,2,K)
1865
+ TR3 = CC(I-1,2,K)+CC(I-1,4,K)
1866
+ CH(I-1,K,1) = TR2+TR3
1867
+ CR3 = TR2-TR3
1868
+ CH(I,K,1) = TI2+TI3
1869
+ CI3 = TI2-TI3
1870
+ CR2 = TR1+TR4
1871
+ CR4 = TR1-TR4
1872
+ CI2 = TI1+TI4
1873
+ CI4 = TI1-TI4
1874
+ CH(I-1,K,2) = WA1(I-1)*CR2+WA1(I)*CI2
1875
+ CH(I,K,2) = WA1(I-1)*CI2-WA1(I)*CR2
1876
+ CH(I-1,K,3) = WA2(I-1)*CR3+WA2(I)*CI3
1877
+ CH(I,K,3) = WA2(I-1)*CI3-WA2(I)*CR3
1878
+ CH(I-1,K,4) = WA3(I-1)*CR4+WA3(I)*CI4
1879
+ CH(I,K,4) = WA3(I-1)*CI4-WA3(I)*CR4
1880
+ 103 CONTINUE
1881
+ 104 CONTINUE
1882
+ RETURN
1883
+ END
1884
+ SUBROUTINE PASSF5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
1885
+ DIMENSION CC(IDO,5,L1) ,CH(IDO,L1,5) ,
1886
+ 1 WA1(*) ,WA2(*) ,WA3(*) ,WA4(*)
1887
+ DATA TR11,TI11,TR12,TI12 /.309016994374947,-.951056516295154,
1888
+ 1-.809016994374947,-.587785252292473/
1889
+ IF (IDO .NE. 2) GO TO 102
1890
+ DO 101 K=1,L1
1891
+ TI5 = CC(2,2,K)-CC(2,5,K)
1892
+ TI2 = CC(2,2,K)+CC(2,5,K)
1893
+ TI4 = CC(2,3,K)-CC(2,4,K)
1894
+ TI3 = CC(2,3,K)+CC(2,4,K)
1895
+ TR5 = CC(1,2,K)-CC(1,5,K)
1896
+ TR2 = CC(1,2,K)+CC(1,5,K)
1897
+ TR4 = CC(1,3,K)-CC(1,4,K)
1898
+ TR3 = CC(1,3,K)+CC(1,4,K)
1899
+ CH(1,K,1) = CC(1,1,K)+TR2+TR3
1900
+ CH(2,K,1) = CC(2,1,K)+TI2+TI3
1901
+ CR2 = CC(1,1,K)+TR11*TR2+TR12*TR3
1902
+ CI2 = CC(2,1,K)+TR11*TI2+TR12*TI3
1903
+ CR3 = CC(1,1,K)+TR12*TR2+TR11*TR3
1904
+ CI3 = CC(2,1,K)+TR12*TI2+TR11*TI3
1905
+ CR5 = TI11*TR5+TI12*TR4
1906
+ CI5 = TI11*TI5+TI12*TI4
1907
+ CR4 = TI12*TR5-TI11*TR4
1908
+ CI4 = TI12*TI5-TI11*TI4
1909
+ CH(1,K,2) = CR2-CI5
1910
+ CH(1,K,5) = CR2+CI5
1911
+ CH(2,K,2) = CI2+CR5
1912
+ CH(2,K,3) = CI3+CR4
1913
+ CH(1,K,3) = CR3-CI4
1914
+ CH(1,K,4) = CR3+CI4
1915
+ CH(2,K,4) = CI3-CR4
1916
+ CH(2,K,5) = CI2-CR5
1917
+ 101 CONTINUE
1918
+ RETURN
1919
+ 102 DO 104 K=1,L1
1920
+ DO 103 I=2,IDO,2
1921
+ TI5 = CC(I,2,K)-CC(I,5,K)
1922
+ TI2 = CC(I,2,K)+CC(I,5,K)
1923
+ TI4 = CC(I,3,K)-CC(I,4,K)
1924
+ TI3 = CC(I,3,K)+CC(I,4,K)
1925
+ TR5 = CC(I-1,2,K)-CC(I-1,5,K)
1926
+ TR2 = CC(I-1,2,K)+CC(I-1,5,K)
1927
+ TR4 = CC(I-1,3,K)-CC(I-1,4,K)
1928
+ TR3 = CC(I-1,3,K)+CC(I-1,4,K)
1929
+ CH(I-1,K,1) = CC(I-1,1,K)+TR2+TR3
1930
+ CH(I,K,1) = CC(I,1,K)+TI2+TI3
1931
+ CR2 = CC(I-1,1,K)+TR11*TR2+TR12*TR3
1932
+ CI2 = CC(I,1,K)+TR11*TI2+TR12*TI3
1933
+ CR3 = CC(I-1,1,K)+TR12*TR2+TR11*TR3
1934
+ CI3 = CC(I,1,K)+TR12*TI2+TR11*TI3
1935
+ CR5 = TI11*TR5+TI12*TR4
1936
+ CI5 = TI11*TI5+TI12*TI4
1937
+ CR4 = TI12*TR5-TI11*TR4
1938
+ CI4 = TI12*TI5-TI11*TI4
1939
+ DR3 = CR3-CI4
1940
+ DR4 = CR3+CI4
1941
+ DI3 = CI3+CR4
1942
+ DI4 = CI3-CR4
1943
+ DR5 = CR2+CI5
1944
+ DR2 = CR2-CI5
1945
+ DI5 = CI2-CR5
1946
+ DI2 = CI2+CR5
1947
+ CH(I-1,K,2) = WA1(I-1)*DR2+WA1(I)*DI2
1948
+ CH(I,K,2) = WA1(I-1)*DI2-WA1(I)*DR2
1949
+ CH(I-1,K,3) = WA2(I-1)*DR3+WA2(I)*DI3
1950
+ CH(I,K,3) = WA2(I-1)*DI3-WA2(I)*DR3
1951
+ CH(I-1,K,4) = WA3(I-1)*DR4+WA3(I)*DI4
1952
+ CH(I,K,4) = WA3(I-1)*DI4-WA3(I)*DR4
1953
+ CH(I-1,K,5) = WA4(I-1)*DR5+WA4(I)*DI5
1954
+ CH(I,K,5) = WA4(I-1)*DI5-WA4(I)*DR5
1955
+ 103 CONTINUE
1956
+ 104 CONTINUE
1957
+ RETURN
1958
+ END
1959
+ SUBROUTINE PASSF (NAC,IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
1960
+ DIMENSION CH(IDO,L1,IP) ,CC(IDO,IP,L1) ,
1961
+ 1 C1(IDO,L1,IP) ,WA(*) ,C2(IDL1,IP),
1962
+ 2 CH2(IDL1,IP)
1963
+ IDOT = IDO/2
1964
+ NT = IP*IDL1
1965
+ IPP2 = IP+2
1966
+ IPPH = (IP+1)/2
1967
+ IDP = IP*IDO
1968
+ C
1969
+ IF (IDO .LT. L1) GO TO 106
1970
+ DO 103 J=2,IPPH
1971
+ JC = IPP2-J
1972
+ DO 102 K=1,L1
1973
+ DO 101 I=1,IDO
1974
+ CH(I,K,J) = CC(I,J,K)+CC(I,JC,K)
1975
+ CH(I,K,JC) = CC(I,J,K)-CC(I,JC,K)
1976
+ 101 CONTINUE
1977
+ 102 CONTINUE
1978
+ 103 CONTINUE
1979
+ DO 105 K=1,L1
1980
+ DO 104 I=1,IDO
1981
+ CH(I,K,1) = CC(I,1,K)
1982
+ 104 CONTINUE
1983
+ 105 CONTINUE
1984
+ GO TO 112
1985
+ 106 DO 109 J=2,IPPH
1986
+ JC = IPP2-J
1987
+ DO 108 I=1,IDO
1988
+ DO 107 K=1,L1
1989
+ CH(I,K,J) = CC(I,J,K)+CC(I,JC,K)
1990
+ CH(I,K,JC) = CC(I,J,K)-CC(I,JC,K)
1991
+ 107 CONTINUE
1992
+ 108 CONTINUE
1993
+ 109 CONTINUE
1994
+ DO 111 I=1,IDO
1995
+ DO 110 K=1,L1
1996
+ CH(I,K,1) = CC(I,1,K)
1997
+ 110 CONTINUE
1998
+ 111 CONTINUE
1999
+ 112 IDL = 2-IDO
2000
+ INC = 0
2001
+ DO 116 L=2,IPPH
2002
+ LC = IPP2-L
2003
+ IDL = IDL+IDO
2004
+ DO 113 IK=1,IDL1
2005
+ C2(IK,L) = CH2(IK,1)+WA(IDL-1)*CH2(IK,2)
2006
+ C2(IK,LC) = -WA(IDL)*CH2(IK,IP)
2007
+ 113 CONTINUE
2008
+ IDLJ = IDL
2009
+ INC = INC+IDO
2010
+ DO 115 J=3,IPPH
2011
+ JC = IPP2-J
2012
+ IDLJ = IDLJ+INC
2013
+ IF (IDLJ .GT. IDP) IDLJ = IDLJ-IDP
2014
+ WAR = WA(IDLJ-1)
2015
+ WAI = WA(IDLJ)
2016
+ DO 114 IK=1,IDL1
2017
+ C2(IK,L) = C2(IK,L)+WAR*CH2(IK,J)
2018
+ C2(IK,LC) = C2(IK,LC)-WAI*CH2(IK,JC)
2019
+ 114 CONTINUE
2020
+ 115 CONTINUE
2021
+ 116 CONTINUE
2022
+ DO 118 J=2,IPPH
2023
+ DO 117 IK=1,IDL1
2024
+ CH2(IK,1) = CH2(IK,1)+CH2(IK,J)
2025
+ 117 CONTINUE
2026
+ 118 CONTINUE
2027
+ DO 120 J=2,IPPH
2028
+ JC = IPP2-J
2029
+ DO 119 IK=2,IDL1,2
2030
+ CH2(IK-1,J) = C2(IK-1,J)-C2(IK,JC)
2031
+ CH2(IK-1,JC) = C2(IK-1,J)+C2(IK,JC)
2032
+ CH2(IK,J) = C2(IK,J)+C2(IK-1,JC)
2033
+ CH2(IK,JC) = C2(IK,J)-C2(IK-1,JC)
2034
+ 119 CONTINUE
2035
+ 120 CONTINUE
2036
+ NAC = 1
2037
+ IF (IDO .EQ. 2) RETURN
2038
+ NAC = 0
2039
+ DO 121 IK=1,IDL1
2040
+ C2(IK,1) = CH2(IK,1)
2041
+ 121 CONTINUE
2042
+ DO 123 J=2,IP
2043
+ DO 122 K=1,L1
2044
+ C1(1,K,J) = CH(1,K,J)
2045
+ C1(2,K,J) = CH(2,K,J)
2046
+ 122 CONTINUE
2047
+ 123 CONTINUE
2048
+ IF (IDOT .GT. L1) GO TO 127
2049
+ IDIJ = 0
2050
+ DO 126 J=2,IP
2051
+ IDIJ = IDIJ+2
2052
+ DO 125 I=4,IDO,2
2053
+ IDIJ = IDIJ+2
2054
+ DO 124 K=1,L1
2055
+ C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)+WA(IDIJ)*CH(I,K,J)
2056
+ C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)-WA(IDIJ)*CH(I-1,K,J)
2057
+ 124 CONTINUE
2058
+ 125 CONTINUE
2059
+ 126 CONTINUE
2060
+ RETURN
2061
+ 127 IDJ = 2-IDO
2062
+ DO 130 J=2,IP
2063
+ IDJ = IDJ+IDO
2064
+ DO 129 K=1,L1
2065
+ IDIJ = IDJ
2066
+ DO 128 I=4,IDO,2
2067
+ IDIJ = IDIJ+2
2068
+ C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)+WA(IDIJ)*CH(I,K,J)
2069
+ C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)-WA(IDIJ)*CH(I-1,K,J)
2070
+ 128 CONTINUE
2071
+ 129 CONTINUE
2072
+ 130 CONTINUE
2073
+ RETURN
2074
+ END
2075
+ SUBROUTINE RFFTI (N,WSAVE)
2076
+ DIMENSION WSAVE(*)
2077
+ C
2078
+ IF (N .EQ. 1) RETURN
2079
+ CALL RFFTI1 (N,WSAVE(N+1),WSAVE(2*N+1))
2080
+ RETURN
2081
+ END
2082
+ SUBROUTINE RFFTI1 (N,WA,IFAC)
2083
+ DIMENSION WA(*) ,IFAC(*) ,NTRYH(4)
2084
+ DATA NTRYH(1),NTRYH(2),NTRYH(3),NTRYH(4)/4,2,3,5/
2085
+ NL = N
2086
+ NF = 0
2087
+ J = 0
2088
+ 101 J = J+1
2089
+ IF (J-4) 102,102,103
2090
+ 102 NTRY = NTRYH(J)
2091
+ GO TO 104
2092
+ 103 NTRY = NTRY+2
2093
+ 104 NQ = NL/NTRY
2094
+ NR = NL-NTRY*NQ
2095
+ IF (NR) 101,105,101
2096
+ 105 NF = NF+1
2097
+ IFAC(NF+2) = NTRY
2098
+ NL = NQ
2099
+ IF (NTRY .NE. 2) GO TO 107
2100
+ IF (NF .EQ. 1) GO TO 107
2101
+ DO 106 I=2,NF
2102
+ IB = NF-I+2
2103
+ IFAC(IB+2) = IFAC(IB+1)
2104
+ 106 CONTINUE
2105
+ IFAC(3) = 2
2106
+ 107 IF (NL .NE. 1) GO TO 104
2107
+ IFAC(1) = N
2108
+ IFAC(2) = NF
2109
+ TPI = 2.0*PIMACH(DUM)
2110
+ ARGH = TPI/FLOAT(N)
2111
+ IS = 0
2112
+ NFM1 = NF-1
2113
+ L1 = 1
2114
+ IF (NFM1 .EQ. 0) RETURN
2115
+ DO 110 K1=1,NFM1
2116
+ IP = IFAC(K1+2)
2117
+ LD = 0
2118
+ L2 = L1*IP
2119
+ IDO = N/L2
2120
+ IPM = IP-1
2121
+ DO 109 J=1,IPM
2122
+ LD = LD+L1
2123
+ I = IS
2124
+ ARGLD = FLOAT(LD)*ARGH
2125
+ FI = 0.
2126
+ DO 108 II=3,IDO,2
2127
+ I = I+2
2128
+ FI = FI+1.
2129
+ ARG = FI*ARGLD
2130
+ WA(I-1) = COS(ARG)
2131
+ WA(I) = SIN(ARG)
2132
+ 108 CONTINUE
2133
+ IS = IS+IDO
2134
+ 109 CONTINUE
2135
+ L1 = L2
2136
+ 110 CONTINUE
2137
+ RETURN
2138
+ END
2139
+ SUBROUTINE RFFTB (N,R,WSAVE)
2140
+ DIMENSION R(*) ,WSAVE(*)
2141
+ C
2142
+ IF (N .EQ. 1) RETURN
2143
+ CALL RFFTB1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))
2144
+ RETURN
2145
+ END
2146
+ SUBROUTINE RFFTB1 (N,C,CH,WA,IFAC)
2147
+ DIMENSION CH(*) ,C(*) ,WA(*) ,IFAC(*)
2148
+ NF = IFAC(2)
2149
+ NA = 0
2150
+ L1 = 1
2151
+ IW = 1
2152
+ DO 116 K1=1,NF
2153
+ IP = IFAC(K1+2)
2154
+ L2 = IP*L1
2155
+ IDO = N/L2
2156
+ IDL1 = IDO*L1
2157
+ IF (IP .NE. 4) GO TO 103
2158
+ IX2 = IW+IDO
2159
+ IX3 = IX2+IDO
2160
+ IF (NA .NE. 0) GO TO 101
2161
+ CALL RADB4 (IDO,L1,C,CH,WA(IW),WA(IX2),WA(IX3))
2162
+ GO TO 102
2163
+ 101 CALL RADB4 (IDO,L1,CH,C,WA(IW),WA(IX2),WA(IX3))
2164
+ 102 NA = 1-NA
2165
+ GO TO 115
2166
+ 103 IF (IP .NE. 2) GO TO 106
2167
+ IF (NA .NE. 0) GO TO 104
2168
+ CALL RADB2 (IDO,L1,C,CH,WA(IW))
2169
+ GO TO 105
2170
+ 104 CALL RADB2 (IDO,L1,CH,C,WA(IW))
2171
+ 105 NA = 1-NA
2172
+ GO TO 115
2173
+ 106 IF (IP .NE. 3) GO TO 109
2174
+ IX2 = IW+IDO
2175
+ IF (NA .NE. 0) GO TO 107
2176
+ CALL RADB3 (IDO,L1,C,CH,WA(IW),WA(IX2))
2177
+ GO TO 108
2178
+ 107 CALL RADB3 (IDO,L1,CH,C,WA(IW),WA(IX2))
2179
+ 108 NA = 1-NA
2180
+ GO TO 115
2181
+ 109 IF (IP .NE. 5) GO TO 112
2182
+ IX2 = IW+IDO
2183
+ IX3 = IX2+IDO
2184
+ IX4 = IX3+IDO
2185
+ IF (NA .NE. 0) GO TO 110
2186
+ CALL RADB5 (IDO,L1,C,CH,WA(IW),WA(IX2),WA(IX3),WA(IX4))
2187
+ GO TO 111
2188
+ 110 CALL RADB5 (IDO,L1,CH,C,WA(IW),WA(IX2),WA(IX3),WA(IX4))
2189
+ 111 NA = 1-NA
2190
+ GO TO 115
2191
+ 112 IF (NA .NE. 0) GO TO 113
2192
+ CALL RADBG (IDO,IP,L1,IDL1,C,C,C,CH,CH,WA(IW))
2193
+ GO TO 114
2194
+ 113 CALL RADBG (IDO,IP,L1,IDL1,CH,CH,CH,C,C,WA(IW))
2195
+ 114 IF (IDO .EQ. 1) NA = 1-NA
2196
+ 115 L1 = L2
2197
+ IW = IW+(IP-1)*IDO
2198
+ 116 CONTINUE
2199
+ IF (NA .EQ. 0) RETURN
2200
+ DO 117 I=1,N
2201
+ C(I) = CH(I)
2202
+ 117 CONTINUE
2203
+ RETURN
2204
+ END
2205
+ SUBROUTINE RADB2 (IDO,L1,CC,CH,WA1)
2206
+ DIMENSION CC(IDO,2,L1) ,CH(IDO,L1,2) ,
2207
+ 1 WA1(*)
2208
+ DO 101 K=1,L1
2209
+ CH(1,K,1) = CC(1,1,K)+CC(IDO,2,K)
2210
+ CH(1,K,2) = CC(1,1,K)-CC(IDO,2,K)
2211
+ 101 CONTINUE
2212
+ IF (IDO-2) 107,105,102
2213
+ 102 IDP2 = IDO+2
2214
+ DO 104 K=1,L1
2215
+ DO 103 I=3,IDO,2
2216
+ IC = IDP2-I
2217
+ CH(I-1,K,1) = CC(I-1,1,K)+CC(IC-1,2,K)
2218
+ TR2 = CC(I-1,1,K)-CC(IC-1,2,K)
2219
+ CH(I,K,1) = CC(I,1,K)-CC(IC,2,K)
2220
+ TI2 = CC(I,1,K)+CC(IC,2,K)
2221
+ CH(I-1,K,2) = WA1(I-2)*TR2-WA1(I-1)*TI2
2222
+ CH(I,K,2) = WA1(I-2)*TI2+WA1(I-1)*TR2
2223
+ 103 CONTINUE
2224
+ 104 CONTINUE
2225
+ IF (MOD(IDO,2) .EQ. 1) RETURN
2226
+ 105 DO 106 K=1,L1
2227
+ CH(IDO,K,1) = CC(IDO,1,K)+CC(IDO,1,K)
2228
+ CH(IDO,K,2) = -(CC(1,2,K)+CC(1,2,K))
2229
+ 106 CONTINUE
2230
+ 107 RETURN
2231
+ END
2232
+ SUBROUTINE RADB3 (IDO,L1,CC,CH,WA1,WA2)
2233
+ DIMENSION CC(IDO,3,L1) ,CH(IDO,L1,3) ,
2234
+ 1 WA1(*) ,WA2(*)
2235
+ DATA TAUR,TAUI /-.5,.866025403784439/
2236
+ DO 101 K=1,L1
2237
+ TR2 = CC(IDO,2,K)+CC(IDO,2,K)
2238
+ CR2 = CC(1,1,K)+TAUR*TR2
2239
+ CH(1,K,1) = CC(1,1,K)+TR2
2240
+ CI3 = TAUI*(CC(1,3,K)+CC(1,3,K))
2241
+ CH(1,K,2) = CR2-CI3
2242
+ CH(1,K,3) = CR2+CI3
2243
+ 101 CONTINUE
2244
+ IF (IDO .EQ. 1) RETURN
2245
+ IDP2 = IDO+2
2246
+ DO 103 K=1,L1
2247
+ DO 102 I=3,IDO,2
2248
+ IC = IDP2-I
2249
+ TR2 = CC(I-1,3,K)+CC(IC-1,2,K)
2250
+ CR2 = CC(I-1,1,K)+TAUR*TR2
2251
+ CH(I-1,K,1) = CC(I-1,1,K)+TR2
2252
+ TI2 = CC(I,3,K)-CC(IC,2,K)
2253
+ CI2 = CC(I,1,K)+TAUR*TI2
2254
+ CH(I,K,1) = CC(I,1,K)+TI2
2255
+ CR3 = TAUI*(CC(I-1,3,K)-CC(IC-1,2,K))
2256
+ CI3 = TAUI*(CC(I,3,K)+CC(IC,2,K))
2257
+ DR2 = CR2-CI3
2258
+ DR3 = CR2+CI3
2259
+ DI2 = CI2+CR3
2260
+ DI3 = CI2-CR3
2261
+ CH(I-1,K,2) = WA1(I-2)*DR2-WA1(I-1)*DI2
2262
+ CH(I,K,2) = WA1(I-2)*DI2+WA1(I-1)*DR2
2263
+ CH(I-1,K,3) = WA2(I-2)*DR3-WA2(I-1)*DI3
2264
+ CH(I,K,3) = WA2(I-2)*DI3+WA2(I-1)*DR3
2265
+ 102 CONTINUE
2266
+ 103 CONTINUE
2267
+ RETURN
2268
+ END
2269
+ SUBROUTINE RADB4 (IDO,L1,CC,CH,WA1,WA2,WA3)
2270
+ DIMENSION CC(IDO,4,L1) ,CH(IDO,L1,4) ,
2271
+ 1 WA1(*) ,WA2(*) ,WA3(*)
2272
+ DATA SQRT2 /1.414213562373095/
2273
+ DO 101 K=1,L1
2274
+ TR1 = CC(1,1,K)-CC(IDO,4,K)
2275
+ TR2 = CC(1,1,K)+CC(IDO,4,K)
2276
+ TR3 = CC(IDO,2,K)+CC(IDO,2,K)
2277
+ TR4 = CC(1,3,K)+CC(1,3,K)
2278
+ CH(1,K,1) = TR2+TR3
2279
+ CH(1,K,2) = TR1-TR4
2280
+ CH(1,K,3) = TR2-TR3
2281
+ CH(1,K,4) = TR1+TR4
2282
+ 101 CONTINUE
2283
+ IF (IDO-2) 107,105,102
2284
+ 102 IDP2 = IDO+2
2285
+ DO 104 K=1,L1
2286
+ DO 103 I=3,IDO,2
2287
+ IC = IDP2-I
2288
+ TI1 = CC(I,1,K)+CC(IC,4,K)
2289
+ TI2 = CC(I,1,K)-CC(IC,4,K)
2290
+ TI3 = CC(I,3,K)-CC(IC,2,K)
2291
+ TR4 = CC(I,3,K)+CC(IC,2,K)
2292
+ TR1 = CC(I-1,1,K)-CC(IC-1,4,K)
2293
+ TR2 = CC(I-1,1,K)+CC(IC-1,4,K)
2294
+ TI4 = CC(I-1,3,K)-CC(IC-1,2,K)
2295
+ TR3 = CC(I-1,3,K)+CC(IC-1,2,K)
2296
+ CH(I-1,K,1) = TR2+TR3
2297
+ CR3 = TR2-TR3
2298
+ CH(I,K,1) = TI2+TI3
2299
+ CI3 = TI2-TI3
2300
+ CR2 = TR1-TR4
2301
+ CR4 = TR1+TR4
2302
+ CI2 = TI1+TI4
2303
+ CI4 = TI1-TI4
2304
+ CH(I-1,K,2) = WA1(I-2)*CR2-WA1(I-1)*CI2
2305
+ CH(I,K,2) = WA1(I-2)*CI2+WA1(I-1)*CR2
2306
+ CH(I-1,K,3) = WA2(I-2)*CR3-WA2(I-1)*CI3
2307
+ CH(I,K,3) = WA2(I-2)*CI3+WA2(I-1)*CR3
2308
+ CH(I-1,K,4) = WA3(I-2)*CR4-WA3(I-1)*CI4
2309
+ CH(I,K,4) = WA3(I-2)*CI4+WA3(I-1)*CR4
2310
+ 103 CONTINUE
2311
+ 104 CONTINUE
2312
+ IF (MOD(IDO,2) .EQ. 1) RETURN
2313
+ 105 CONTINUE
2314
+ DO 106 K=1,L1
2315
+ TI1 = CC(1,2,K)+CC(1,4,K)
2316
+ TI2 = CC(1,4,K)-CC(1,2,K)
2317
+ TR1 = CC(IDO,1,K)-CC(IDO,3,K)
2318
+ TR2 = CC(IDO,1,K)+CC(IDO,3,K)
2319
+ CH(IDO,K,1) = TR2+TR2
2320
+ CH(IDO,K,2) = SQRT2*(TR1-TI1)
2321
+ CH(IDO,K,3) = TI2+TI2
2322
+ CH(IDO,K,4) = -SQRT2*(TR1+TI1)
2323
+ 106 CONTINUE
2324
+ 107 RETURN
2325
+ END
2326
+ SUBROUTINE RADB5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
2327
+ DIMENSION CC(IDO,5,L1) ,CH(IDO,L1,5) ,
2328
+ 1 WA1(*) ,WA2(*) ,WA3(*) ,WA4(*)
2329
+ DATA TR11,TI11,TR12,TI12 /.309016994374947,.951056516295154,
2330
+ 1-.809016994374947,.587785252292473/
2331
+ DO 101 K=1,L1
2332
+ TI5 = CC(1,3,K)+CC(1,3,K)
2333
+ TI4 = CC(1,5,K)+CC(1,5,K)
2334
+ TR2 = CC(IDO,2,K)+CC(IDO,2,K)
2335
+ TR3 = CC(IDO,4,K)+CC(IDO,4,K)
2336
+ CH(1,K,1) = CC(1,1,K)+TR2+TR3
2337
+ CR2 = CC(1,1,K)+TR11*TR2+TR12*TR3
2338
+ CR3 = CC(1,1,K)+TR12*TR2+TR11*TR3
2339
+ CI5 = TI11*TI5+TI12*TI4
2340
+ CI4 = TI12*TI5-TI11*TI4
2341
+ CH(1,K,2) = CR2-CI5
2342
+ CH(1,K,3) = CR3-CI4
2343
+ CH(1,K,4) = CR3+CI4
2344
+ CH(1,K,5) = CR2+CI5
2345
+ 101 CONTINUE
2346
+ IF (IDO .EQ. 1) RETURN
2347
+ IDP2 = IDO+2
2348
+ DO 103 K=1,L1
2349
+ DO 102 I=3,IDO,2
2350
+ IC = IDP2-I
2351
+ TI5 = CC(I,3,K)+CC(IC,2,K)
2352
+ TI2 = CC(I,3,K)-CC(IC,2,K)
2353
+ TI4 = CC(I,5,K)+CC(IC,4,K)
2354
+ TI3 = CC(I,5,K)-CC(IC,4,K)
2355
+ TR5 = CC(I-1,3,K)-CC(IC-1,2,K)
2356
+ TR2 = CC(I-1,3,K)+CC(IC-1,2,K)
2357
+ TR4 = CC(I-1,5,K)-CC(IC-1,4,K)
2358
+ TR3 = CC(I-1,5,K)+CC(IC-1,4,K)
2359
+ CH(I-1,K,1) = CC(I-1,1,K)+TR2+TR3
2360
+ CH(I,K,1) = CC(I,1,K)+TI2+TI3
2361
+ CR2 = CC(I-1,1,K)+TR11*TR2+TR12*TR3
2362
+ CI2 = CC(I,1,K)+TR11*TI2+TR12*TI3
2363
+ CR3 = CC(I-1,1,K)+TR12*TR2+TR11*TR3
2364
+ CI3 = CC(I,1,K)+TR12*TI2+TR11*TI3
2365
+ CR5 = TI11*TR5+TI12*TR4
2366
+ CI5 = TI11*TI5+TI12*TI4
2367
+ CR4 = TI12*TR5-TI11*TR4
2368
+ CI4 = TI12*TI5-TI11*TI4
2369
+ DR3 = CR3-CI4
2370
+ DR4 = CR3+CI4
2371
+ DI3 = CI3+CR4
2372
+ DI4 = CI3-CR4
2373
+ DR5 = CR2+CI5
2374
+ DR2 = CR2-CI5
2375
+ DI5 = CI2-CR5
2376
+ DI2 = CI2+CR5
2377
+ CH(I-1,K,2) = WA1(I-2)*DR2-WA1(I-1)*DI2
2378
+ CH(I,K,2) = WA1(I-2)*DI2+WA1(I-1)*DR2
2379
+ CH(I-1,K,3) = WA2(I-2)*DR3-WA2(I-1)*DI3
2380
+ CH(I,K,3) = WA2(I-2)*DI3+WA2(I-1)*DR3
2381
+ CH(I-1,K,4) = WA3(I-2)*DR4-WA3(I-1)*DI4
2382
+ CH(I,K,4) = WA3(I-2)*DI4+WA3(I-1)*DR4
2383
+ CH(I-1,K,5) = WA4(I-2)*DR5-WA4(I-1)*DI5
2384
+ CH(I,K,5) = WA4(I-2)*DI5+WA4(I-1)*DR5
2385
+ 102 CONTINUE
2386
+ 103 CONTINUE
2387
+ RETURN
2388
+ END
2389
+ SUBROUTINE RADBG (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
2390
+ DIMENSION CH(IDO,L1,IP) ,CC(IDO,IP,L1) ,
2391
+ 1 C1(IDO,L1,IP) ,C2(IDL1,IP),
2392
+ 2 CH2(IDL1,IP) ,WA(*)
2393
+ TPI = 2.0*PIMACH(DUM)
2394
+ ARG = TPI/FLOAT(IP)
2395
+ DCP = COS(ARG)
2396
+ DSP = SIN(ARG)
2397
+ IDP2 = IDO+2
2398
+ NBD = (IDO-1)/2
2399
+ IPP2 = IP+2
2400
+ IPPH = (IP+1)/2
2401
+ IF (IDO .LT. L1) GO TO 103
2402
+ DO 102 K=1,L1
2403
+ DO 101 I=1,IDO
2404
+ CH(I,K,1) = CC(I,1,K)
2405
+ 101 CONTINUE
2406
+ 102 CONTINUE
2407
+ GO TO 106
2408
+ 103 DO 105 I=1,IDO
2409
+ DO 104 K=1,L1
2410
+ CH(I,K,1) = CC(I,1,K)
2411
+ 104 CONTINUE
2412
+ 105 CONTINUE
2413
+ 106 DO 108 J=2,IPPH
2414
+ JC = IPP2-J
2415
+ J2 = J+J
2416
+ DO 107 K=1,L1
2417
+ CH(1,K,J) = CC(IDO,J2-2,K)+CC(IDO,J2-2,K)
2418
+ CH(1,K,JC) = CC(1,J2-1,K)+CC(1,J2-1,K)
2419
+ 107 CONTINUE
2420
+ 108 CONTINUE
2421
+ IF (IDO .EQ. 1) GO TO 116
2422
+ IF (NBD .LT. L1) GO TO 112
2423
+ DO 111 J=2,IPPH
2424
+ JC = IPP2-J
2425
+ DO 110 K=1,L1
2426
+ DO 109 I=3,IDO,2
2427
+ IC = IDP2-I
2428
+ CH(I-1,K,J) = CC(I-1,2*J-1,K)+CC(IC-1,2*J-2,K)
2429
+ CH(I-1,K,JC) = CC(I-1,2*J-1,K)-CC(IC-1,2*J-2,K)
2430
+ CH(I,K,J) = CC(I,2*J-1,K)-CC(IC,2*J-2,K)
2431
+ CH(I,K,JC) = CC(I,2*J-1,K)+CC(IC,2*J-2,K)
2432
+ 109 CONTINUE
2433
+ 110 CONTINUE
2434
+ 111 CONTINUE
2435
+ GO TO 116
2436
+ 112 DO 115 J=2,IPPH
2437
+ JC = IPP2-J
2438
+ DO 114 I=3,IDO,2
2439
+ IC = IDP2-I
2440
+ DO 113 K=1,L1
2441
+ CH(I-1,K,J) = CC(I-1,2*J-1,K)+CC(IC-1,2*J-2,K)
2442
+ CH(I-1,K,JC) = CC(I-1,2*J-1,K)-CC(IC-1,2*J-2,K)
2443
+ CH(I,K,J) = CC(I,2*J-1,K)-CC(IC,2*J-2,K)
2444
+ CH(I,K,JC) = CC(I,2*J-1,K)+CC(IC,2*J-2,K)
2445
+ 113 CONTINUE
2446
+ 114 CONTINUE
2447
+ 115 CONTINUE
2448
+ 116 AR1 = 1.
2449
+ AI1 = 0.
2450
+ DO 120 L=2,IPPH
2451
+ LC = IPP2-L
2452
+ AR1H = DCP*AR1-DSP*AI1
2453
+ AI1 = DCP*AI1+DSP*AR1
2454
+ AR1 = AR1H
2455
+ DO 117 IK=1,IDL1
2456
+ C2(IK,L) = CH2(IK,1)+AR1*CH2(IK,2)
2457
+ C2(IK,LC) = AI1*CH2(IK,IP)
2458
+ 117 CONTINUE
2459
+ DC2 = AR1
2460
+ DS2 = AI1
2461
+ AR2 = AR1
2462
+ AI2 = AI1
2463
+ DO 119 J=3,IPPH
2464
+ JC = IPP2-J
2465
+ AR2H = DC2*AR2-DS2*AI2
2466
+ AI2 = DC2*AI2+DS2*AR2
2467
+ AR2 = AR2H
2468
+ DO 118 IK=1,IDL1
2469
+ C2(IK,L) = C2(IK,L)+AR2*CH2(IK,J)
2470
+ C2(IK,LC) = C2(IK,LC)+AI2*CH2(IK,JC)
2471
+ 118 CONTINUE
2472
+ 119 CONTINUE
2473
+ 120 CONTINUE
2474
+ DO 122 J=2,IPPH
2475
+ DO 121 IK=1,IDL1
2476
+ CH2(IK,1) = CH2(IK,1)+CH2(IK,J)
2477
+ 121 CONTINUE
2478
+ 122 CONTINUE
2479
+ DO 124 J=2,IPPH
2480
+ JC = IPP2-J
2481
+ DO 123 K=1,L1
2482
+ CH(1,K,J) = C1(1,K,J)-C1(1,K,JC)
2483
+ CH(1,K,JC) = C1(1,K,J)+C1(1,K,JC)
2484
+ 123 CONTINUE
2485
+ 124 CONTINUE
2486
+ IF (IDO .EQ. 1) GO TO 132
2487
+ IF (NBD .LT. L1) GO TO 128
2488
+ DO 127 J=2,IPPH
2489
+ JC = IPP2-J
2490
+ DO 126 K=1,L1
2491
+ DO 125 I=3,IDO,2
2492
+ CH(I-1,K,J) = C1(I-1,K,J)-C1(I,K,JC)
2493
+ CH(I-1,K,JC) = C1(I-1,K,J)+C1(I,K,JC)
2494
+ CH(I,K,J) = C1(I,K,J)+C1(I-1,K,JC)
2495
+ CH(I,K,JC) = C1(I,K,J)-C1(I-1,K,JC)
2496
+ 125 CONTINUE
2497
+ 126 CONTINUE
2498
+ 127 CONTINUE
2499
+ GO TO 132
2500
+ 128 DO 131 J=2,IPPH
2501
+ JC = IPP2-J
2502
+ DO 130 I=3,IDO,2
2503
+ DO 129 K=1,L1
2504
+ CH(I-1,K,J) = C1(I-1,K,J)-C1(I,K,JC)
2505
+ CH(I-1,K,JC) = C1(I-1,K,J)+C1(I,K,JC)
2506
+ CH(I,K,J) = C1(I,K,J)+C1(I-1,K,JC)
2507
+ CH(I,K,JC) = C1(I,K,J)-C1(I-1,K,JC)
2508
+ 129 CONTINUE
2509
+ 130 CONTINUE
2510
+ 131 CONTINUE
2511
+ 132 CONTINUE
2512
+ IF (IDO .EQ. 1) RETURN
2513
+ DO 133 IK=1,IDL1
2514
+ C2(IK,1) = CH2(IK,1)
2515
+ 133 CONTINUE
2516
+ DO 135 J=2,IP
2517
+ DO 134 K=1,L1
2518
+ C1(1,K,J) = CH(1,K,J)
2519
+ 134 CONTINUE
2520
+ 135 CONTINUE
2521
+ IF (NBD .GT. L1) GO TO 139
2522
+ IS = -IDO
2523
+ DO 138 J=2,IP
2524
+ IS = IS+IDO
2525
+ IDIJ = IS
2526
+ DO 137 I=3,IDO,2
2527
+ IDIJ = IDIJ+2
2528
+ DO 136 K=1,L1
2529
+ C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)-WA(IDIJ)*CH(I,K,J)
2530
+ C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)+WA(IDIJ)*CH(I-1,K,J)
2531
+ 136 CONTINUE
2532
+ 137 CONTINUE
2533
+ 138 CONTINUE
2534
+ GO TO 143
2535
+ 139 IS = -IDO
2536
+ DO 142 J=2,IP
2537
+ IS = IS+IDO
2538
+ DO 141 K=1,L1
2539
+ IDIJ = IS
2540
+ DO 140 I=3,IDO,2
2541
+ IDIJ = IDIJ+2
2542
+ C1(I-1,K,J) = WA(IDIJ-1)*CH(I-1,K,J)-WA(IDIJ)*CH(I,K,J)
2543
+ C1(I,K,J) = WA(IDIJ-1)*CH(I,K,J)+WA(IDIJ)*CH(I-1,K,J)
2544
+ 140 CONTINUE
2545
+ 141 CONTINUE
2546
+ 142 CONTINUE
2547
+ 143 RETURN
2548
+ END
2549
+ SUBROUTINE RFFTF (N,R,WSAVE)
2550
+ DIMENSION R(*) ,WSAVE(*)
2551
+ C
2552
+ IF (N .EQ. 1) RETURN
2553
+ CALL RFFTF1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))
2554
+ RETURN
2555
+ END
2556
+ SUBROUTINE RFFTF1 (N,C,CH,WA,IFAC)
2557
+ DIMENSION CH(*) ,C(*) ,WA(*) ,IFAC(*)
2558
+ NF = IFAC(2)
2559
+ NA = 1
2560
+ L2 = N
2561
+ IW = N
2562
+ DO 111 K1=1,NF
2563
+ KH = NF-K1
2564
+ IP = IFAC(KH+3)
2565
+ L1 = L2/IP
2566
+ IDO = N/L2
2567
+ IDL1 = IDO*L1
2568
+ IW = IW-(IP-1)*IDO
2569
+ NA = 1-NA
2570
+ IF (IP .NE. 4) GO TO 102
2571
+ IX2 = IW+IDO
2572
+ IX3 = IX2+IDO
2573
+ IF (NA .NE. 0) GO TO 101
2574
+ CALL RADF4 (IDO,L1,C,CH,WA(IW),WA(IX2),WA(IX3))
2575
+ GO TO 110
2576
+ 101 CALL RADF4 (IDO,L1,CH,C,WA(IW),WA(IX2),WA(IX3))
2577
+ GO TO 110
2578
+ 102 IF (IP .NE. 2) GO TO 104
2579
+ IF (NA .NE. 0) GO TO 103
2580
+ CALL RADF2 (IDO,L1,C,CH,WA(IW))
2581
+ GO TO 110
2582
+ 103 CALL RADF2 (IDO,L1,CH,C,WA(IW))
2583
+ GO TO 110
2584
+ 104 IF (IP .NE. 3) GO TO 106
2585
+ IX2 = IW+IDO
2586
+ IF (NA .NE. 0) GO TO 105
2587
+ CALL RADF3 (IDO,L1,C,CH,WA(IW),WA(IX2))
2588
+ GO TO 110
2589
+ 105 CALL RADF3 (IDO,L1,CH,C,WA(IW),WA(IX2))
2590
+ GO TO 110
2591
+ 106 IF (IP .NE. 5) GO TO 108
2592
+ IX2 = IW+IDO
2593
+ IX3 = IX2+IDO
2594
+ IX4 = IX3+IDO
2595
+ IF (NA .NE. 0) GO TO 107
2596
+ CALL RADF5 (IDO,L1,C,CH,WA(IW),WA(IX2),WA(IX3),WA(IX4))
2597
+ GO TO 110
2598
+ 107 CALL RADF5 (IDO,L1,CH,C,WA(IW),WA(IX2),WA(IX3),WA(IX4))
2599
+ GO TO 110
2600
+ 108 IF (IDO .EQ. 1) NA = 1-NA
2601
+ IF (NA .NE. 0) GO TO 109
2602
+ CALL RADFG (IDO,IP,L1,IDL1,C,C,C,CH,CH,WA(IW))
2603
+ NA = 1
2604
+ GO TO 110
2605
+ 109 CALL RADFG (IDO,IP,L1,IDL1,CH,CH,CH,C,C,WA(IW))
2606
+ NA = 0
2607
+ 110 L2 = L1
2608
+ 111 CONTINUE
2609
+ IF (NA .EQ. 1) RETURN
2610
+ DO 112 I=1,N
2611
+ C(I) = CH(I)
2612
+ 112 CONTINUE
2613
+ RETURN
2614
+ END
2615
+ SUBROUTINE RADF2 (IDO,L1,CC,CH,WA1)
2616
+ DIMENSION CH(IDO,2,L1) ,CC(IDO,L1,2) ,
2617
+ 1 WA1(*)
2618
+ DO 101 K=1,L1
2619
+ CH(1,1,K) = CC(1,K,1)+CC(1,K,2)
2620
+ CH(IDO,2,K) = CC(1,K,1)-CC(1,K,2)
2621
+ 101 CONTINUE
2622
+ IF (IDO-2) 107,105,102
2623
+ 102 IDP2 = IDO+2
2624
+ DO 104 K=1,L1
2625
+ DO 103 I=3,IDO,2
2626
+ IC = IDP2-I
2627
+ TR2 = WA1(I-2)*CC(I-1,K,2)+WA1(I-1)*CC(I,K,2)
2628
+ TI2 = WA1(I-2)*CC(I,K,2)-WA1(I-1)*CC(I-1,K,2)
2629
+ CH(I,1,K) = CC(I,K,1)+TI2
2630
+ CH(IC,2,K) = TI2-CC(I,K,1)
2631
+ CH(I-1,1,K) = CC(I-1,K,1)+TR2
2632
+ CH(IC-1,2,K) = CC(I-1,K,1)-TR2
2633
+ 103 CONTINUE
2634
+ 104 CONTINUE
2635
+ IF (MOD(IDO,2) .EQ. 1) RETURN
2636
+ 105 DO 106 K=1,L1
2637
+ CH(1,2,K) = -CC(IDO,K,2)
2638
+ CH(IDO,1,K) = CC(IDO,K,1)
2639
+ 106 CONTINUE
2640
+ 107 RETURN
2641
+ END
2642
+ SUBROUTINE RADF3 (IDO,L1,CC,CH,WA1,WA2)
2643
+ DIMENSION CH(IDO,3,L1) ,CC(IDO,L1,3) ,
2644
+ 1 WA1(*) ,WA2(*)
2645
+ DATA TAUR,TAUI /-.5,.866025403784439/
2646
+ DO 101 K=1,L1
2647
+ CR2 = CC(1,K,2)+CC(1,K,3)
2648
+ CH(1,1,K) = CC(1,K,1)+CR2
2649
+ CH(1,3,K) = TAUI*(CC(1,K,3)-CC(1,K,2))
2650
+ CH(IDO,2,K) = CC(1,K,1)+TAUR*CR2
2651
+ 101 CONTINUE
2652
+ IF (IDO .EQ. 1) RETURN
2653
+ IDP2 = IDO+2
2654
+ DO 103 K=1,L1
2655
+ DO 102 I=3,IDO,2
2656
+ IC = IDP2-I
2657
+ DR2 = WA1(I-2)*CC(I-1,K,2)+WA1(I-1)*CC(I,K,2)
2658
+ DI2 = WA1(I-2)*CC(I,K,2)-WA1(I-1)*CC(I-1,K,2)
2659
+ DR3 = WA2(I-2)*CC(I-1,K,3)+WA2(I-1)*CC(I,K,3)
2660
+ DI3 = WA2(I-2)*CC(I,K,3)-WA2(I-1)*CC(I-1,K,3)
2661
+ CR2 = DR2+DR3
2662
+ CI2 = DI2+DI3
2663
+ CH(I-1,1,K) = CC(I-1,K,1)+CR2
2664
+ CH(I,1,K) = CC(I,K,1)+CI2
2665
+ TR2 = CC(I-1,K,1)+TAUR*CR2
2666
+ TI2 = CC(I,K,1)+TAUR*CI2
2667
+ TR3 = TAUI*(DI2-DI3)
2668
+ TI3 = TAUI*(DR3-DR2)
2669
+ CH(I-1,3,K) = TR2+TR3
2670
+ CH(IC-1,2,K) = TR2-TR3
2671
+ CH(I,3,K) = TI2+TI3
2672
+ CH(IC,2,K) = TI3-TI2
2673
+ 102 CONTINUE
2674
+ 103 CONTINUE
2675
+ RETURN
2676
+ END
2677
+ SUBROUTINE RADF4 (IDO,L1,CC,CH,WA1,WA2,WA3)
2678
+ DIMENSION CC(IDO,L1,4) ,CH(IDO,4,L1) ,
2679
+ 1 WA1(*) ,WA2(*) ,WA3(*)
2680
+ DATA HSQT2 /.7071067811865475/
2681
+ DO 101 K=1,L1
2682
+ TR1 = CC(1,K,2)+CC(1,K,4)
2683
+ TR2 = CC(1,K,1)+CC(1,K,3)
2684
+ CH(1,1,K) = TR1+TR2
2685
+ CH(IDO,4,K) = TR2-TR1
2686
+ CH(IDO,2,K) = CC(1,K,1)-CC(1,K,3)
2687
+ CH(1,3,K) = CC(1,K,4)-CC(1,K,2)
2688
+ 101 CONTINUE
2689
+ IF (IDO-2) 107,105,102
2690
+ 102 IDP2 = IDO+2
2691
+ DO 104 K=1,L1
2692
+ DO 103 I=3,IDO,2
2693
+ IC = IDP2-I
2694
+ CR2 = WA1(I-2)*CC(I-1,K,2)+WA1(I-1)*CC(I,K,2)
2695
+ CI2 = WA1(I-2)*CC(I,K,2)-WA1(I-1)*CC(I-1,K,2)
2696
+ CR3 = WA2(I-2)*CC(I-1,K,3)+WA2(I-1)*CC(I,K,3)
2697
+ CI3 = WA2(I-2)*CC(I,K,3)-WA2(I-1)*CC(I-1,K,3)
2698
+ CR4 = WA3(I-2)*CC(I-1,K,4)+WA3(I-1)*CC(I,K,4)
2699
+ CI4 = WA3(I-2)*CC(I,K,4)-WA3(I-1)*CC(I-1,K,4)
2700
+ TR1 = CR2+CR4
2701
+ TR4 = CR4-CR2
2702
+ TI1 = CI2+CI4
2703
+ TI4 = CI2-CI4
2704
+ TI2 = CC(I,K,1)+CI3
2705
+ TI3 = CC(I,K,1)-CI3
2706
+ TR2 = CC(I-1,K,1)+CR3
2707
+ TR3 = CC(I-1,K,1)-CR3
2708
+ CH(I-1,1,K) = TR1+TR2
2709
+ CH(IC-1,4,K) = TR2-TR1
2710
+ CH(I,1,K) = TI1+TI2
2711
+ CH(IC,4,K) = TI1-TI2
2712
+ CH(I-1,3,K) = TI4+TR3
2713
+ CH(IC-1,2,K) = TR3-TI4
2714
+ CH(I,3,K) = TR4+TI3
2715
+ CH(IC,2,K) = TR4-TI3
2716
+ 103 CONTINUE
2717
+ 104 CONTINUE
2718
+ IF (MOD(IDO,2) .EQ. 1) RETURN
2719
+ 105 CONTINUE
2720
+ DO 106 K=1,L1
2721
+ TI1 = -HSQT2*(CC(IDO,K,2)+CC(IDO,K,4))
2722
+ TR1 = HSQT2*(CC(IDO,K,2)-CC(IDO,K,4))
2723
+ CH(IDO,1,K) = TR1+CC(IDO,K,1)
2724
+ CH(IDO,3,K) = CC(IDO,K,1)-TR1
2725
+ CH(1,2,K) = TI1-CC(IDO,K,3)
2726
+ CH(1,4,K) = TI1+CC(IDO,K,3)
2727
+ 106 CONTINUE
2728
+ 107 RETURN
2729
+ END
2730
+ SUBROUTINE RADF5 (IDO,L1,CC,CH,WA1,WA2,WA3,WA4)
2731
+ DIMENSION CC(IDO,L1,5) ,CH(IDO,5,L1) ,
2732
+ 1 WA1(*) ,WA2(*) ,WA3(*) ,WA4(*)
2733
+ DATA TR11,TI11,TR12,TI12 /.309016994374947,.951056516295154,
2734
+ 1-.809016994374947,.587785252292473/
2735
+ DO 101 K=1,L1
2736
+ CR2 = CC(1,K,5)+CC(1,K,2)
2737
+ CI5 = CC(1,K,5)-CC(1,K,2)
2738
+ CR3 = CC(1,K,4)+CC(1,K,3)
2739
+ CI4 = CC(1,K,4)-CC(1,K,3)
2740
+ CH(1,1,K) = CC(1,K,1)+CR2+CR3
2741
+ CH(IDO,2,K) = CC(1,K,1)+TR11*CR2+TR12*CR3
2742
+ CH(1,3,K) = TI11*CI5+TI12*CI4
2743
+ CH(IDO,4,K) = CC(1,K,1)+TR12*CR2+TR11*CR3
2744
+ CH(1,5,K) = TI12*CI5-TI11*CI4
2745
+ 101 CONTINUE
2746
+ IF (IDO .EQ. 1) RETURN
2747
+ IDP2 = IDO+2
2748
+ DO 103 K=1,L1
2749
+ DO 102 I=3,IDO,2
2750
+ IC = IDP2-I
2751
+ DR2 = WA1(I-2)*CC(I-1,K,2)+WA1(I-1)*CC(I,K,2)
2752
+ DI2 = WA1(I-2)*CC(I,K,2)-WA1(I-1)*CC(I-1,K,2)
2753
+ DR3 = WA2(I-2)*CC(I-1,K,3)+WA2(I-1)*CC(I,K,3)
2754
+ DI3 = WA2(I-2)*CC(I,K,3)-WA2(I-1)*CC(I-1,K,3)
2755
+ DR4 = WA3(I-2)*CC(I-1,K,4)+WA3(I-1)*CC(I,K,4)
2756
+ DI4 = WA3(I-2)*CC(I,K,4)-WA3(I-1)*CC(I-1,K,4)
2757
+ DR5 = WA4(I-2)*CC(I-1,K,5)+WA4(I-1)*CC(I,K,5)
2758
+ DI5 = WA4(I-2)*CC(I,K,5)-WA4(I-1)*CC(I-1,K,5)
2759
+ CR2 = DR2+DR5
2760
+ CI5 = DR5-DR2
2761
+ CR5 = DI2-DI5
2762
+ CI2 = DI2+DI5
2763
+ CR3 = DR3+DR4
2764
+ CI4 = DR4-DR3
2765
+ CR4 = DI3-DI4
2766
+ CI3 = DI3+DI4
2767
+ CH(I-1,1,K) = CC(I-1,K,1)+CR2+CR3
2768
+ CH(I,1,K) = CC(I,K,1)+CI2+CI3
2769
+ TR2 = CC(I-1,K,1)+TR11*CR2+TR12*CR3
2770
+ TI2 = CC(I,K,1)+TR11*CI2+TR12*CI3
2771
+ TR3 = CC(I-1,K,1)+TR12*CR2+TR11*CR3
2772
+ TI3 = CC(I,K,1)+TR12*CI2+TR11*CI3
2773
+ TR5 = TI11*CR5+TI12*CR4
2774
+ TI5 = TI11*CI5+TI12*CI4
2775
+ TR4 = TI12*CR5-TI11*CR4
2776
+ TI4 = TI12*CI5-TI11*CI4
2777
+ CH(I-1,3,K) = TR2+TR5
2778
+ CH(IC-1,2,K) = TR2-TR5
2779
+ CH(I,3,K) = TI2+TI5
2780
+ CH(IC,2,K) = TI5-TI2
2781
+ CH(I-1,5,K) = TR3+TR4
2782
+ CH(IC-1,4,K) = TR3-TR4
2783
+ CH(I,5,K) = TI3+TI4
2784
+ CH(IC,4,K) = TI4-TI3
2785
+ 102 CONTINUE
2786
+ 103 CONTINUE
2787
+ RETURN
2788
+ END
2789
+ SUBROUTINE RADFG (IDO,IP,L1,IDL1,CC,C1,C2,CH,CH2,WA)
2790
+ DIMENSION CH(IDO,L1,IP) ,CC(IDO,IP,L1) ,
2791
+ 1 C1(IDO,L1,IP) ,C2(IDL1,IP),
2792
+ 2 CH2(IDL1,IP) ,WA(*)
2793
+ TPI = 2.0*PIMACH(DUM)
2794
+ ARG = TPI/FLOAT(IP)
2795
+ DCP = COS(ARG)
2796
+ DSP = SIN(ARG)
2797
+ IPPH = (IP+1)/2
2798
+ IPP2 = IP+2
2799
+ IDP2 = IDO+2
2800
+ NBD = (IDO-1)/2
2801
+ IF (IDO .EQ. 1) GO TO 119
2802
+ DO 101 IK=1,IDL1
2803
+ CH2(IK,1) = C2(IK,1)
2804
+ 101 CONTINUE
2805
+ DO 103 J=2,IP
2806
+ DO 102 K=1,L1
2807
+ CH(1,K,J) = C1(1,K,J)
2808
+ 102 CONTINUE
2809
+ 103 CONTINUE
2810
+ IF (NBD .GT. L1) GO TO 107
2811
+ IS = -IDO
2812
+ DO 106 J=2,IP
2813
+ IS = IS+IDO
2814
+ IDIJ = IS
2815
+ DO 105 I=3,IDO,2
2816
+ IDIJ = IDIJ+2
2817
+ DO 104 K=1,L1
2818
+ CH(I-1,K,J) = WA(IDIJ-1)*C1(I-1,K,J)+WA(IDIJ)*C1(I,K,J)
2819
+ CH(I,K,J) = WA(IDIJ-1)*C1(I,K,J)-WA(IDIJ)*C1(I-1,K,J)
2820
+ 104 CONTINUE
2821
+ 105 CONTINUE
2822
+ 106 CONTINUE
2823
+ GO TO 111
2824
+ 107 IS = -IDO
2825
+ DO 110 J=2,IP
2826
+ IS = IS+IDO
2827
+ DO 109 K=1,L1
2828
+ IDIJ = IS
2829
+ DO 108 I=3,IDO,2
2830
+ IDIJ = IDIJ+2
2831
+ CH(I-1,K,J) = WA(IDIJ-1)*C1(I-1,K,J)+WA(IDIJ)*C1(I,K,J)
2832
+ CH(I,K,J) = WA(IDIJ-1)*C1(I,K,J)-WA(IDIJ)*C1(I-1,K,J)
2833
+ 108 CONTINUE
2834
+ 109 CONTINUE
2835
+ 110 CONTINUE
2836
+ 111 IF (NBD .LT. L1) GO TO 115
2837
+ DO 114 J=2,IPPH
2838
+ JC = IPP2-J
2839
+ DO 113 K=1,L1
2840
+ DO 112 I=3,IDO,2
2841
+ C1(I-1,K,J) = CH(I-1,K,J)+CH(I-1,K,JC)
2842
+ C1(I-1,K,JC) = CH(I,K,J)-CH(I,K,JC)
2843
+ C1(I,K,J) = CH(I,K,J)+CH(I,K,JC)
2844
+ C1(I,K,JC) = CH(I-1,K,JC)-CH(I-1,K,J)
2845
+ 112 CONTINUE
2846
+ 113 CONTINUE
2847
+ 114 CONTINUE
2848
+ GO TO 121
2849
+ 115 DO 118 J=2,IPPH
2850
+ JC = IPP2-J
2851
+ DO 117 I=3,IDO,2
2852
+ DO 116 K=1,L1
2853
+ C1(I-1,K,J) = CH(I-1,K,J)+CH(I-1,K,JC)
2854
+ C1(I-1,K,JC) = CH(I,K,J)-CH(I,K,JC)
2855
+ C1(I,K,J) = CH(I,K,J)+CH(I,K,JC)
2856
+ C1(I,K,JC) = CH(I-1,K,JC)-CH(I-1,K,J)
2857
+ 116 CONTINUE
2858
+ 117 CONTINUE
2859
+ 118 CONTINUE
2860
+ GO TO 121
2861
+ 119 DO 120 IK=1,IDL1
2862
+ C2(IK,1) = CH2(IK,1)
2863
+ 120 CONTINUE
2864
+ 121 DO 123 J=2,IPPH
2865
+ JC = IPP2-J
2866
+ DO 122 K=1,L1
2867
+ C1(1,K,J) = CH(1,K,J)+CH(1,K,JC)
2868
+ C1(1,K,JC) = CH(1,K,JC)-CH(1,K,J)
2869
+ 122 CONTINUE
2870
+ 123 CONTINUE
2871
+ C
2872
+ AR1 = 1.
2873
+ AI1 = 0.
2874
+ DO 127 L=2,IPPH
2875
+ LC = IPP2-L
2876
+ AR1H = DCP*AR1-DSP*AI1
2877
+ AI1 = DCP*AI1+DSP*AR1
2878
+ AR1 = AR1H
2879
+ DO 124 IK=1,IDL1
2880
+ CH2(IK,L) = C2(IK,1)+AR1*C2(IK,2)
2881
+ CH2(IK,LC) = AI1*C2(IK,IP)
2882
+ 124 CONTINUE
2883
+ DC2 = AR1
2884
+ DS2 = AI1
2885
+ AR2 = AR1
2886
+ AI2 = AI1
2887
+ DO 126 J=3,IPPH
2888
+ JC = IPP2-J
2889
+ AR2H = DC2*AR2-DS2*AI2
2890
+ AI2 = DC2*AI2+DS2*AR2
2891
+ AR2 = AR2H
2892
+ DO 125 IK=1,IDL1
2893
+ CH2(IK,L) = CH2(IK,L)+AR2*C2(IK,J)
2894
+ CH2(IK,LC) = CH2(IK,LC)+AI2*C2(IK,JC)
2895
+ 125 CONTINUE
2896
+ 126 CONTINUE
2897
+ 127 CONTINUE
2898
+ DO 129 J=2,IPPH
2899
+ DO 128 IK=1,IDL1
2900
+ CH2(IK,1) = CH2(IK,1)+C2(IK,J)
2901
+ 128 CONTINUE
2902
+ 129 CONTINUE
2903
+ C
2904
+ IF (IDO .LT. L1) GO TO 132
2905
+ DO 131 K=1,L1
2906
+ DO 130 I=1,IDO
2907
+ CC(I,1,K) = CH(I,K,1)
2908
+ 130 CONTINUE
2909
+ 131 CONTINUE
2910
+ GO TO 135
2911
+ 132 DO 134 I=1,IDO
2912
+ DO 133 K=1,L1
2913
+ CC(I,1,K) = CH(I,K,1)
2914
+ 133 CONTINUE
2915
+ 134 CONTINUE
2916
+ 135 DO 137 J=2,IPPH
2917
+ JC = IPP2-J
2918
+ J2 = J+J
2919
+ DO 136 K=1,L1
2920
+ CC(IDO,J2-2,K) = CH(1,K,J)
2921
+ CC(1,J2-1,K) = CH(1,K,JC)
2922
+ 136 CONTINUE
2923
+ 137 CONTINUE
2924
+ IF (IDO .EQ. 1) RETURN
2925
+ IF (NBD .LT. L1) GO TO 141
2926
+ DO 140 J=2,IPPH
2927
+ JC = IPP2-J
2928
+ J2 = J+J
2929
+ DO 139 K=1,L1
2930
+ DO 138 I=3,IDO,2
2931
+ IC = IDP2-I
2932
+ CC(I-1,J2-1,K) = CH(I-1,K,J)+CH(I-1,K,JC)
2933
+ CC(IC-1,J2-2,K) = CH(I-1,K,J)-CH(I-1,K,JC)
2934
+ CC(I,J2-1,K) = CH(I,K,J)+CH(I,K,JC)
2935
+ CC(IC,J2-2,K) = CH(I,K,JC)-CH(I,K,J)
2936
+ 138 CONTINUE
2937
+ 139 CONTINUE
2938
+ 140 CONTINUE
2939
+ RETURN
2940
+ 141 DO 144 J=2,IPPH
2941
+ JC = IPP2-J
2942
+ J2 = J+J
2943
+ DO 143 I=3,IDO,2
2944
+ IC = IDP2-I
2945
+ DO 142 K=1,L1
2946
+ CC(I-1,J2-1,K) = CH(I-1,K,J)+CH(I-1,K,JC)
2947
+ CC(IC-1,J2-2,K) = CH(I-1,K,J)-CH(I-1,K,JC)
2948
+ CC(I,J2-1,K) = CH(I,K,J)+CH(I,K,JC)
2949
+ CC(IC,J2-2,K) = CH(I,K,JC)-CH(I,K,J)
2950
+ 142 CONTINUE
2951
+ 143 CONTINUE
2952
+ 144 CONTINUE
2953
+ RETURN
2954
+ END
2955
+ FUNCTION PIMACH (DUM)
2956
+ C PI=3.1415926535897932384626433832795028841971693993751058209749446
2957
+ C
2958
+ PIMACH = 4.*ATAN(1.0)
2959
+ RETURN
2960
+ C SEPTEMBER 1973 VERSION 1
2961
+ C APRIL 1976 VERSION 2
2962
+ C JANUARY 1978 VERSION 3
2963
+ C DECEMBER 1979 VERSION 3.1
2964
+ C FEBRUARY 1985 DOCUMENTATION UPGRADE
2965
+ C NOVEMBER 1988 VERSION 3.2, FORTRAN 77 CHANGES
2966
+ C JUNE 1989 ADD FUNCTION PIMACH FOR DISTRIBUTION PURPOSES
2967
+ C-----------------------------------------------------------------------
2968
+ END