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.
- PyFishPack/__init__.py +86 -0
- PyFishPack/__pycache__/__init__.cpython-313.pyc +0 -0
- PyFishPack/__pycache__/apps.cpython-313.pyc +0 -0
- PyFishPack/_dummy.c +23 -0
- PyFishPack/_dummy.cp313-win_amd64.pyd +0 -0
- PyFishPack/apps.py +3640 -0
- PyFishPack/fishpack.cp313-win_amd64.dll.a +0 -0
- PyFishPack/fishpack.cp313-win_amd64.pyd +0 -0
- PyFishPack/meson.build +213 -0
- PyFishPack/src/archive/f77/Makefile +19 -0
- PyFishPack/src/archive/f77/blktri.f +1404 -0
- PyFishPack/src/archive/f77/cblktri.f +1414 -0
- PyFishPack/src/archive/f77/cmgnbn.f +1592 -0
- PyFishPack/src/archive/f77/comf.f +186 -0
- PyFishPack/src/archive/f77/fftpack.f +2968 -0
- PyFishPack/src/archive/f77/genbun.f +1335 -0
- PyFishPack/src/archive/f77/gnbnaux.f +314 -0
- PyFishPack/src/archive/f77/hstcrt.f +443 -0
- PyFishPack/src/archive/f77/hstcsp.f +683 -0
- PyFishPack/src/archive/f77/hstcyl.f +485 -0
- PyFishPack/src/archive/f77/hstplr.f +538 -0
- PyFishPack/src/archive/f77/hstssp.f +634 -0
- PyFishPack/src/archive/f77/hw3crt.f +687 -0
- PyFishPack/src/archive/f77/hwscrt.f +512 -0
- PyFishPack/src/archive/f77/hwscsp.f +728 -0
- PyFishPack/src/archive/f77/hwscyl.f +538 -0
- PyFishPack/src/archive/f77/hwsplr.f +602 -0
- PyFishPack/src/archive/f77/hwsssp.f +780 -0
- PyFishPack/src/archive/f77/pois3d.f +550 -0
- PyFishPack/src/archive/f77/poistg.f +875 -0
- PyFishPack/src/archive/f77/sepaux.f +361 -0
- PyFishPack/src/archive/f77/sepeli.f +1029 -0
- PyFishPack/src/archive/f77/sepx4.f +958 -0
- PyFishPack/src/centered_axisymmetric_spherical_solver.f90 +1002 -0
- PyFishPack/src/centered_cartesian_helmholtz_solver_3d.f90 +819 -0
- PyFishPack/src/centered_cartesian_solver.f90 +583 -0
- PyFishPack/src/centered_cylindrical_solver.f90 +634 -0
- PyFishPack/src/centered_helmholtz_solvers.f90 +156 -0
- PyFishPack/src/centered_polar_solver.f90 +746 -0
- PyFishPack/src/centered_real_linear_systems_solver.f90 +280 -0
- PyFishPack/src/centered_spherical_solver.f90 +928 -0
- PyFishPack/src/complex_block_tridiagonal_linear_systems_solver.f90 +1947 -0
- PyFishPack/src/complex_linear_systems_solver.f90 +1787 -0
- PyFishPack/src/fftpack_c_api.f90 +86 -0
- PyFishPack/src/fishpack.f90 +191 -0
- PyFishPack/src/fishpack.pyf +504 -0
- PyFishPack/src/fishpack_c_api.f90 +365 -0
- PyFishPack/src/fishpack_original.pyf +2119 -0
- PyFishPack/src/fishpack_precision.f90 +53 -0
- PyFishPack/src/general_linear_systems_solver_3d.f90 +296 -0
- PyFishPack/src/iterative_solvers.f90 +969 -0
- PyFishPack/src/main.f90 +10 -0
- PyFishPack/src/pyfishpack_module.c +1302 -0
- PyFishPack/src/real_block_tridiagonal_linear_systems_solver.f90 +319 -0
- PyFishPack/src/sepeli.f90 +1454 -0
- PyFishPack/src/sepx4.f90 +1338 -0
- PyFishPack/src/staggered_axisymmetric_spherical_solver.f90 +908 -0
- PyFishPack/src/staggered_cartesian_solver.f90 +553 -0
- PyFishPack/src/staggered_cylindrical_solver.f90 +630 -0
- PyFishPack/src/staggered_helmholtz_solvers.f90 +172 -0
- PyFishPack/src/staggered_polar_solver.f90 +651 -0
- PyFishPack/src/staggered_real_linear_systems_solver.f90 +258 -0
- PyFishPack/src/staggered_spherical_solver.f90 +758 -0
- PyFishPack/src/three_dimensional_solvers.f90 +602 -0
- PyFishPack/src/type_CenteredCyclicReductionUtility.f90 +1714 -0
- PyFishPack/src/type_CyclicReductionUtility.f90 +472 -0
- PyFishPack/src/type_FishpackWorkspace.f90 +290 -0
- PyFishPack/src/type_GeneralizedCyclicReductionUtility.f90 +1980 -0
- PyFishPack/src/type_PeriodicFastFourierTransform.f90 +3789 -0
- PyFishPack/src/type_SepAux.f90 +586 -0
- PyFishPack/src/type_StaggeredCyclicReductionUtility.f90 +893 -0
- pyfishpack-0.1.0.dist-info/DELVEWHEEL +2 -0
- pyfishpack-0.1.0.dist-info/METADATA +81 -0
- pyfishpack-0.1.0.dist-info/RECORD +81 -0
- pyfishpack-0.1.0.dist-info/WHEEL +5 -0
- pyfishpack-0.1.0.dist-info/licenses/LICENSE +21 -0
- pyfishpack-0.1.0.dist-info/top_level.txt +1 -0
- pyfishpack.libs/libgcc_s_seh-1-25d59ccffa1a9009644065b069829e07.dll +0 -0
- pyfishpack.libs/libgfortran-5-08f2195cfa0d823e13371c5c3186a82a.dll +0 -0
- pyfishpack.libs/libquadmath-0-c5abb9113f1ee64b87a889958e4b7418.dll +0 -0
- 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
|