PyFishPack 0.1.0__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. PyFishPack/__init__.py +86 -0
  2. PyFishPack/__pycache__/__init__.cpython-313.pyc +0 -0
  3. PyFishPack/__pycache__/apps.cpython-313.pyc +0 -0
  4. PyFishPack/_dummy.c +23 -0
  5. PyFishPack/_dummy.cp313-win_amd64.pyd +0 -0
  6. PyFishPack/apps.py +3640 -0
  7. PyFishPack/fishpack.cp313-win_amd64.dll.a +0 -0
  8. PyFishPack/fishpack.cp313-win_amd64.pyd +0 -0
  9. PyFishPack/meson.build +213 -0
  10. PyFishPack/src/archive/f77/Makefile +19 -0
  11. PyFishPack/src/archive/f77/blktri.f +1404 -0
  12. PyFishPack/src/archive/f77/cblktri.f +1414 -0
  13. PyFishPack/src/archive/f77/cmgnbn.f +1592 -0
  14. PyFishPack/src/archive/f77/comf.f +186 -0
  15. PyFishPack/src/archive/f77/fftpack.f +2968 -0
  16. PyFishPack/src/archive/f77/genbun.f +1335 -0
  17. PyFishPack/src/archive/f77/gnbnaux.f +314 -0
  18. PyFishPack/src/archive/f77/hstcrt.f +443 -0
  19. PyFishPack/src/archive/f77/hstcsp.f +683 -0
  20. PyFishPack/src/archive/f77/hstcyl.f +485 -0
  21. PyFishPack/src/archive/f77/hstplr.f +538 -0
  22. PyFishPack/src/archive/f77/hstssp.f +634 -0
  23. PyFishPack/src/archive/f77/hw3crt.f +687 -0
  24. PyFishPack/src/archive/f77/hwscrt.f +512 -0
  25. PyFishPack/src/archive/f77/hwscsp.f +728 -0
  26. PyFishPack/src/archive/f77/hwscyl.f +538 -0
  27. PyFishPack/src/archive/f77/hwsplr.f +602 -0
  28. PyFishPack/src/archive/f77/hwsssp.f +780 -0
  29. PyFishPack/src/archive/f77/pois3d.f +550 -0
  30. PyFishPack/src/archive/f77/poistg.f +875 -0
  31. PyFishPack/src/archive/f77/sepaux.f +361 -0
  32. PyFishPack/src/archive/f77/sepeli.f +1029 -0
  33. PyFishPack/src/archive/f77/sepx4.f +958 -0
  34. PyFishPack/src/centered_axisymmetric_spherical_solver.f90 +1002 -0
  35. PyFishPack/src/centered_cartesian_helmholtz_solver_3d.f90 +819 -0
  36. PyFishPack/src/centered_cartesian_solver.f90 +583 -0
  37. PyFishPack/src/centered_cylindrical_solver.f90 +634 -0
  38. PyFishPack/src/centered_helmholtz_solvers.f90 +156 -0
  39. PyFishPack/src/centered_polar_solver.f90 +746 -0
  40. PyFishPack/src/centered_real_linear_systems_solver.f90 +280 -0
  41. PyFishPack/src/centered_spherical_solver.f90 +928 -0
  42. PyFishPack/src/complex_block_tridiagonal_linear_systems_solver.f90 +1947 -0
  43. PyFishPack/src/complex_linear_systems_solver.f90 +1787 -0
  44. PyFishPack/src/fftpack_c_api.f90 +86 -0
  45. PyFishPack/src/fishpack.f90 +191 -0
  46. PyFishPack/src/fishpack.pyf +504 -0
  47. PyFishPack/src/fishpack_c_api.f90 +365 -0
  48. PyFishPack/src/fishpack_original.pyf +2119 -0
  49. PyFishPack/src/fishpack_precision.f90 +53 -0
  50. PyFishPack/src/general_linear_systems_solver_3d.f90 +296 -0
  51. PyFishPack/src/iterative_solvers.f90 +969 -0
  52. PyFishPack/src/main.f90 +10 -0
  53. PyFishPack/src/pyfishpack_module.c +1302 -0
  54. PyFishPack/src/real_block_tridiagonal_linear_systems_solver.f90 +319 -0
  55. PyFishPack/src/sepeli.f90 +1454 -0
  56. PyFishPack/src/sepx4.f90 +1338 -0
  57. PyFishPack/src/staggered_axisymmetric_spherical_solver.f90 +908 -0
  58. PyFishPack/src/staggered_cartesian_solver.f90 +553 -0
  59. PyFishPack/src/staggered_cylindrical_solver.f90 +630 -0
  60. PyFishPack/src/staggered_helmholtz_solvers.f90 +172 -0
  61. PyFishPack/src/staggered_polar_solver.f90 +651 -0
  62. PyFishPack/src/staggered_real_linear_systems_solver.f90 +258 -0
  63. PyFishPack/src/staggered_spherical_solver.f90 +758 -0
  64. PyFishPack/src/three_dimensional_solvers.f90 +602 -0
  65. PyFishPack/src/type_CenteredCyclicReductionUtility.f90 +1714 -0
  66. PyFishPack/src/type_CyclicReductionUtility.f90 +472 -0
  67. PyFishPack/src/type_FishpackWorkspace.f90 +290 -0
  68. PyFishPack/src/type_GeneralizedCyclicReductionUtility.f90 +1980 -0
  69. PyFishPack/src/type_PeriodicFastFourierTransform.f90 +3789 -0
  70. PyFishPack/src/type_SepAux.f90 +586 -0
  71. PyFishPack/src/type_StaggeredCyclicReductionUtility.f90 +893 -0
  72. pyfishpack-0.1.0.dist-info/DELVEWHEEL +2 -0
  73. pyfishpack-0.1.0.dist-info/METADATA +81 -0
  74. pyfishpack-0.1.0.dist-info/RECORD +81 -0
  75. pyfishpack-0.1.0.dist-info/WHEEL +5 -0
  76. pyfishpack-0.1.0.dist-info/licenses/LICENSE +21 -0
  77. pyfishpack-0.1.0.dist-info/top_level.txt +1 -0
  78. pyfishpack.libs/libgcc_s_seh-1-25d59ccffa1a9009644065b069829e07.dll +0 -0
  79. pyfishpack.libs/libgfortran-5-08f2195cfa0d823e13371c5c3186a82a.dll +0 -0
  80. pyfishpack.libs/libquadmath-0-c5abb9113f1ee64b87a889958e4b7418.dll +0 -0
  81. pyfishpack.libs/libwinpthread-1-83908d14abfafb8b3bfa38cf51ecee56.dll +0 -0
@@ -0,0 +1,1592 @@
1
+ C
2
+ C file cmgnbn.f
3
+ C
4
+ SUBROUTINE CMGNBN (NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,
5
+ 1 IERROR,W)
6
+ C
7
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
8
+ C * *
9
+ C * copyright (c) 1999 by UCAR *
10
+ C * *
11
+ C * UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH *
12
+ C * *
13
+ C * all rights reserved *
14
+ C * *
15
+ C * FISHPACK version 4.1 *
16
+ C * *
17
+ C * A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF *
18
+ C * *
19
+ C * SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS *
20
+ C * *
21
+ C * BY *
22
+ C * *
23
+ C * JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET *
24
+ C * *
25
+ C * OF *
26
+ C * *
27
+ C * THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH *
28
+ C * *
29
+ C * BOULDER, COLORADO (80307) U.S.A. *
30
+ C * *
31
+ C * WHICH IS SPONSORED BY *
32
+ C * *
33
+ C * THE NATIONAL SCIENCE FOUNDATION *
34
+ C * *
35
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
36
+ C
37
+ C
38
+ C
39
+ C DIMENSION OF A(M),B(M),C(M),Y(IDIMY,N),
40
+ C W(SEE PARAMETER LIST)
41
+ C ARGUMENTS
42
+ C
43
+ C LATEST REVISION NOVEMBER 1988
44
+ C
45
+ C PURPOSE THE NAME OF THIS PACKAGE IS A MNEMONIC FOR THE
46
+ C COMPLEX GENERALIZED BUNEMAN ALGORITHM.
47
+ C IT SOLVES THE COMPLEX LINEAR SYSTEM OF EQUATION
48
+ C
49
+ C A(I)*X(I-1,J) + B(I)*X(I,J) + C(I)*X(I+1,J)
50
+ C + X(I,J-1) - 2.*X(I,J) + X(I,J+1) = Y(I,J)
51
+ C
52
+ C FOR I = 1,2,...,M AND J = 1,2,...,N.
53
+ C
54
+ C INDICES I+1 AND I-1 ARE EVALUATED MODULO M,
55
+ C I.E., X(0,J) = X(M,J) AND X(M+1,J) = X(1,J),
56
+ C AND X(I,0) MAY EQUAL 0, X(I,2), OR X(I,N),
57
+ C AND X(I,N+1) MAY EQUAL 0, X(I,N-1), OR X(I,1)
58
+ C DEPENDING ON AN INPUT PARAMETER.
59
+ C
60
+ C USAGE CALL CMGNBN (NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,
61
+ C IERROR,W)
62
+ C
63
+ C ARGUMENTS
64
+ C
65
+ C ON INPUT NPEROD
66
+ C
67
+ C INDICATES THE VALUES THAT X(I,0) AND
68
+ C X(I,N+1) ARE ASSUMED TO HAVE.
69
+ C
70
+ C = 0 IF X(I,0) = X(I,N) AND X(I,N+1) =
71
+ C X(I,1).
72
+ C = 1 IF X(I,0) = X(I,N+1) = 0 .
73
+ C = 2 IF X(I,0) = 0 AND X(I,N+1) = X(I,N-1).
74
+ C = 3 IF X(I,0) = X(I,2) AND X(I,N+1) =
75
+ C X(I,N-1).
76
+ C = 4 IF X(I,0) = X(I,2) AND X(I,N+1) = 0.
77
+ C
78
+ C N
79
+ C THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.
80
+ C N MUST BE GREATER THAN 2.
81
+ C
82
+ C MPEROD
83
+ C = 0 IF A(1) AND C(M) ARE NOT ZERO
84
+ C = 1 IF A(1) = C(M) = 0
85
+ C
86
+ C M
87
+ C THE NUMBER OF UNKNOWNS IN THE I-DIRECTION.
88
+ C N MUST BE GREATER THAN 2.
89
+ C
90
+ C A,B,C
91
+ C ONE-DIMENSIONAL COMPLEX ARRAYS OF LENGTH M
92
+ C THAT SPECIFY THE COEFFICIENTS IN THE LINEAR
93
+ C EQUATIONS GIVEN ABOVE. IF MPEROD = 0
94
+ C THE ARRAY ELEMENTS MUST NOT DEPEND UPON
95
+ C THE INDEX I, BUT MUST BE CONSTANT.
96
+ C SPECIFICALLY, THE SUBROUTINE CHECKS THE
97
+ C FOLLOWING CONDITION .
98
+ C
99
+ C A(I) = C(1)
100
+ C C(I) = C(1)
101
+ C B(I) = B(1)
102
+ C
103
+ C FOR I=1,2,...,M.
104
+ C
105
+ C IDIMY
106
+ C THE ROW (OR FIRST) DIMENSION OF THE
107
+ C TWO-DIMENSIONAL ARRAY Y AS IT APPEARS
108
+ C IN THE PROGRAM CALLING CMGNBN.
109
+ C THIS PARAMETER IS USED TO SPECIFY THE
110
+ C VARIABLE DIMENSION OF Y.
111
+ C IDIMY MUST BE AT LEAST M.
112
+ C
113
+ C Y
114
+ C A TWO-DIMENSIONAL COMPLEX ARRAY THAT
115
+ C SPECIFIES THE VALUES OF THE RIGHT SIDE
116
+ C OF THE LINEAR SYSTEM OF EQUATIONS GIVEN
117
+ C ABOVE.
118
+ C Y MUST BE DIMENSIONED AT LEAST M*N.
119
+ C
120
+ C W
121
+ C A ONE-DIMENSIONAL COMPLEX ARRAY THAT
122
+ C MUST BE PROVIDED BY THE USER FOR WORK
123
+ C SPACE. W MAY REQUIRE UP TO 4*N +
124
+ C (10 + INT(LOG2(N)))*M LOCATIONS.
125
+ C THE ACTUAL NUMBER OF LOCATIONS USED IS
126
+ C COMPUTED BY CMGNBN AND IS RETURNED IN
127
+ C LOCATION W(1).
128
+ C
129
+ C
130
+ C ON OUTPUT Y
131
+ C
132
+ C CONTAINS THE SOLUTION X.
133
+ C
134
+ C IERROR
135
+ C AN ERROR FLAG WHICH INDICATES INVALID
136
+ C INPUT PARAMETERS EXCEPT FOR NUMBER
137
+ C ZERO, A SOLUTION IS NOT ATTEMPTED.
138
+ C
139
+ C = 0 NO ERROR.
140
+ C = 1 M .LE. 2 .
141
+ C = 2 N .LE. 2
142
+ C = 3 IDIMY .LT. M
143
+ C = 4 NPEROD .LT. 0 OR NPEROD .GT. 4
144
+ C = 5 MPEROD .LT. 0 OR MPEROD .GT. 1
145
+ C = 6 A(I) .NE. C(1) OR C(I) .NE. C(1) OR
146
+ C B(I) .NE. B(1) FOR
147
+ C SOME I=1,2,...,M.
148
+ C = 7 A(1) .NE. 0 OR C(M) .NE. 0 AND
149
+ C MPEROD = 1
150
+ C
151
+ C W
152
+ C W(1) CONTAINS THE REQUIRED LENGTH OF W.
153
+ C
154
+ C SPECIAL CONDITONS NONE
155
+ C
156
+ C I/O NONE
157
+ C
158
+ C PRECISION SINGLE
159
+ C
160
+ C REQUIRED LIBRARY COMF AND ULIBER, WHICH ARE LOADED BY DEFAULT
161
+ C FILES ON NCAR'S CRAY MACHINES.
162
+ C
163
+ C LANGUAGE FORTRAN
164
+ C
165
+ C HISTORY WRITTEN IN 1979 BY ROLAND SWEET OF NCAR'S
166
+ C SCIENTIFIC COMPUTING DIVISION. MADE AVAILABLE
167
+ C ON NCAR'S PUBLIC LIBRARIES IN JANUARY, 1980.
168
+ C
169
+ C ALGORITHM THE LINEAR SYSTEM IS SOLVED BY A CYCLIC
170
+ C REDUCTION ALGORITHM DESCRIBED IN THE
171
+ C REFERENCE BELOW.
172
+ C
173
+ C PORTABILITY FORTRAN 77. ALL MACHINE DEPENDENT CONSTANTS
174
+ C ARE DEFINED IN FUNCTION P1MACH.
175
+ C
176
+ C REFERENCES SWEET, R., 'A CYCLIC REDUCTION ALGORITHM FOR
177
+ C SOLVING BLOCK TRIDIAGONAL SYSTEMS OF ARBITRARY
178
+ C DIMENSIONS,' SIAM J. ON NUMER. ANAL.,
179
+ C 14(SEPT., 1977), PP. 706-720.
180
+ C
181
+ C ACCURACY THIS TEST WAS PERFORMED ON A CDC 7600:
182
+ C
183
+ C A UNIFORM RANDOM NUMBER GENERATOR WAS USED
184
+ C TO CREATE A SOLUTION ARRAY X FOR THE SYSTEM
185
+ C GIVEN IN THE 'PURPOSE' DESCRIPTION ABOVE
186
+ C WITH
187
+ C A(I) = C(I) = -0.5*B(I) = 1, I=1,2,...,M
188
+ C
189
+ C AND, WHEN MPEROD = 1
190
+ C
191
+ C A(1) = C(M) = 0
192
+ C A(M) = C(1) = 2.
193
+ C
194
+ C THE SOLUTION X WAS SUBSTITUTED INTO THE
195
+ C GIVEN SYSTEM AND A RIGHT SIDE Y WAS
196
+ C COMPUTED. USING THIS ARRAY Y, SUBROUTINE
197
+ C CMGNBN WAS CALLED TO PRODUCE APPROXIMATE
198
+ C SOLUTION Z. THEN RELATIVE ERROR
199
+ C E = MAX(CABS(Z(I,J)-X(I,J)))/
200
+ C MAX(CABS(X(I,J)))
201
+ C WAS COMPUTED, WHERE THE TWO MAXIMA ARE TAKEN
202
+ C OVER I=1,2,...,M AND J=1,...,N.
203
+ C
204
+ C THE VALUE OF E IS GIVEN IN THE TABLE
205
+ C BELOW FOR SOME TYPICAL VALUES OF M AND N.
206
+ C
207
+ C M (=N) MPEROD NPEROD T(MSECS) E
208
+ C ------ ------ ------ -------- ------
209
+ C
210
+ C 31 0 0 77 1.E-12
211
+ C 31 1 1 45 4.E-13
212
+ C 31 1 3 91 2.E-12
213
+ C 32 0 0 59 7.E-14
214
+ C 32 1 1 65 5.E-13
215
+ C 32 1 3 97 2.E-13
216
+ C 33 0 0 80 6.E-13
217
+ C 33 1 1 67 5.E-13
218
+ C 33 1 3 76 3.E-12
219
+ C 63 0 0 350 5.E-12
220
+ C 63 1 1 215 6.E-13
221
+ C 63 1 3 412 1.E-11
222
+ C 64 0 0 264 1.E-13
223
+ C 64 1 1 287 3.E-12
224
+ C 64 1 3 421 3.E-13
225
+ C 65 0 0 338 2.E-12
226
+ C 65 1 1 292 5.E-13
227
+ C 65 1 3 329 1.E-11
228
+ C
229
+ C***********************************************************************
230
+ COMPLEX A ,B ,C ,Y ,
231
+ 1 W ,A1
232
+ DIMENSION Y(IDIMY,1)
233
+ DIMENSION W(*) ,B(*) ,A(*) ,C(*)
234
+ C
235
+ IERROR = 0
236
+ IF (M .LE. 2) IERROR = 1
237
+ IF (N .LE. 2) IERROR = 2
238
+ IF (IDIMY .LT. M) IERROR = 3
239
+ IF (NPEROD.LT.0 .OR. NPEROD.GT.4) IERROR = 4
240
+ IF (MPEROD.LT.0 .OR. MPEROD.GT.1) IERROR = 5
241
+ IF (MPEROD .EQ. 1) GO TO 102
242
+ DO 101 I=2,M
243
+ IF (CABS(A(I)-C(1)) .NE. 0.) GO TO 103
244
+ IF (CABS(C(I)-C(1)) .NE. 0.) GO TO 103
245
+ IF (CABS(B(I)-B(1)) .NE. 0.) GO TO 103
246
+ 101 CONTINUE
247
+ GO TO 104
248
+ 102 IF (CABS(A(1)).NE.0. .AND. CABS(C(M)).NE.0.) IERROR = 7
249
+ GO TO 104
250
+ 103 IERROR = 6
251
+ 104 IF (IERROR .NE. 0) RETURN
252
+ IWBA = M+1
253
+ IWBB = IWBA+M
254
+ IWBC = IWBB+M
255
+ IWB2 = IWBC+M
256
+ IWB3 = IWB2+M
257
+ IWW1 = IWB3+M
258
+ IWW2 = IWW1+M
259
+ IWW3 = IWW2+M
260
+ IWD = IWW3+M
261
+ IWTCOS = IWD+M
262
+ IWP = IWTCOS+4*N
263
+ DO 106 I=1,M
264
+ K = IWBA+I-1
265
+ W(K) = -A(I)
266
+ K = IWBC+I-1
267
+ W(K) = -C(I)
268
+ K = IWBB+I-1
269
+ W(K) = 2.-B(I)
270
+ DO 105 J=1,N
271
+ Y(I,J) = -Y(I,J)
272
+ 105 CONTINUE
273
+ 106 CONTINUE
274
+ MP = MPEROD+1
275
+ NP = NPEROD+1
276
+ GO TO (114,107),MP
277
+ 107 GO TO (108,109,110,111,123),NP
278
+ 108 CALL CMPOSP (M,N,W(IWBA),W(IWBB),W(IWBC),Y,IDIMY,W,W(IWB2),
279
+ 1 W(IWB3),W(IWW1),W(IWW2),W(IWW3),W(IWD),W(IWTCOS),
280
+ 2 W(IWP))
281
+ GO TO 112
282
+ 109 CALL CMPOSD (M,N,1,W(IWBA),W(IWBB),W(IWBC),Y,IDIMY,W,W(IWW1),
283
+ 1 W(IWD),W(IWTCOS),W(IWP))
284
+ GO TO 112
285
+ 110 CALL CMPOSN (M,N,1,2,W(IWBA),W(IWBB),W(IWBC),Y,IDIMY,W,W(IWB2),
286
+ 1 W(IWB3),W(IWW1),W(IWW2),W(IWW3),W(IWD),W(IWTCOS),
287
+ 2 W(IWP))
288
+ GO TO 112
289
+ 111 CALL CMPOSN (M,N,1,1,W(IWBA),W(IWBB),W(IWBC),Y,IDIMY,W,W(IWB2),
290
+ 1 W(IWB3),W(IWW1),W(IWW2),W(IWW3),W(IWD),W(IWTCOS),
291
+ 2 W(IWP))
292
+ 112 IPSTOR = REAL(W(IWW1))
293
+ IREV = 2
294
+ IF (NPEROD .EQ. 4) GO TO 124
295
+ 113 GO TO (127,133),MP
296
+ 114 CONTINUE
297
+ C
298
+ C REORDER UNKNOWNS WHEN MP =0
299
+ C
300
+ MH = (M+1)/2
301
+ MHM1 = MH-1
302
+ MODD = 1
303
+ IF (MH*2 .EQ. M) MODD = 2
304
+ DO 119 J=1,N
305
+ DO 115 I=1,MHM1
306
+ MHPI = MH+I
307
+ MHMI = MH-I
308
+ W(I) = Y(MHMI,J)-Y(MHPI,J)
309
+ W(MHPI) = Y(MHMI,J)+Y(MHPI,J)
310
+ 115 CONTINUE
311
+ W(MH) = 2.*Y(MH,J)
312
+ GO TO (117,116),MODD
313
+ 116 W(M) = 2.*Y(M,J)
314
+ 117 CONTINUE
315
+ DO 118 I=1,M
316
+ Y(I,J) = W(I)
317
+ 118 CONTINUE
318
+ 119 CONTINUE
319
+ K = IWBC+MHM1-1
320
+ I = IWBA+MHM1
321
+ W(K) = (0.,0.)
322
+ W(I) = (0.,0.)
323
+ W(K+1) = 2.*W(K+1)
324
+ GO TO (120,121),MODD
325
+ 120 CONTINUE
326
+ K = IWBB+MHM1-1
327
+ W(K) = W(K)-W(I-1)
328
+ W(IWBC-1) = W(IWBC-1)+W(IWBB-1)
329
+ GO TO 122
330
+ 121 W(IWBB-1) = W(K+1)
331
+ 122 CONTINUE
332
+ GO TO 107
333
+ C
334
+ C REVERSE COLUMNS WHEN NPEROD = 4
335
+ C
336
+ 123 IREV = 1
337
+ NBY2 = N/2
338
+ 124 DO 126 J=1,NBY2
339
+ MSKIP = N+1-J
340
+ DO 125 I=1,M
341
+ A1 = Y(I,J)
342
+ Y(I,J) = Y(I,MSKIP)
343
+ Y(I,MSKIP) = A1
344
+ 125 CONTINUE
345
+ 126 CONTINUE
346
+ GO TO (110,113),IREV
347
+ 127 CONTINUE
348
+ DO 132 J=1,N
349
+ DO 128 I=1,MHM1
350
+ MHMI = MH-I
351
+ MHPI = MH+I
352
+ W(MHMI) = .5*(Y(MHPI,J)+Y(I,J))
353
+ W(MHPI) = .5*(Y(MHPI,J)-Y(I,J))
354
+ 128 CONTINUE
355
+ W(MH) = .5*Y(MH,J)
356
+ GO TO (130,129),MODD
357
+ 129 W(M) = .5*Y(M,J)
358
+ 130 CONTINUE
359
+ DO 131 I=1,M
360
+ Y(I,J) = W(I)
361
+ 131 CONTINUE
362
+ 132 CONTINUE
363
+ 133 CONTINUE
364
+ C
365
+ C RETURN STORAGE REQUIREMENTS FOR W ARRAY.
366
+ C
367
+ W(1) = CMPLX(FLOAT(IPSTOR+IWP-1),0.)
368
+ RETURN
369
+ END
370
+ SUBROUTINE CMPOSD (MR,NR,ISTAG,BA,BB,BC,Q,IDIMQ,B,W,D,TCOS,P)
371
+ C
372
+ C SUBROUTINE TO SOLVE POISSON'S EQUATION FOR DIRICHLET BOUNDARY
373
+ C CONDITIONS.
374
+ C
375
+ C ISTAG = 1 IF THE LAST DIAGONAL BLOCK IS THE MATRIX A.
376
+ C ISTAG = 2 IF THE LAST DIAGONAL BLOCK IS THE MATRIX A+I.
377
+ C
378
+ COMPLEX BA ,BB ,BC ,Q ,
379
+ 1 B ,W ,D ,TCOS ,
380
+ 2 P ,T
381
+ DIMENSION Q(IDIMQ,1) ,BA(*) ,BB(*) ,BC(*) ,
382
+ 1 TCOS(*) ,B(*) ,D(*) ,W(*) ,
383
+ 2 P(*)
384
+ M = MR
385
+ N = NR
386
+ FI = 1./FLOAT(ISTAG)
387
+ IP = -M
388
+ IPSTOR = 0
389
+ JSH = 0
390
+ GO TO (101,102),ISTAG
391
+ 101 KR = 0
392
+ IRREG = 1
393
+ IF (N .GT. 1) GO TO 106
394
+ TCOS(1) = (0.,0.)
395
+ GO TO 103
396
+ 102 KR = 1
397
+ JSTSAV = 1
398
+ IRREG = 2
399
+ IF (N .GT. 1) GO TO 106
400
+ TCOS(1) = CMPLX(-1.,0.)
401
+ 103 DO 104 I=1,M
402
+ B(I) = Q(I,1)
403
+ 104 CONTINUE
404
+ CALL CMPTRX (1,0,M,BA,BB,BC,B,TCOS,D,W)
405
+ DO 105 I=1,M
406
+ Q(I,1) = B(I)
407
+ 105 CONTINUE
408
+ GO TO 183
409
+ 106 LR = 0
410
+ DO 107 I=1,M
411
+ P(I) = CMPLX(0.,0.)
412
+ 107 CONTINUE
413
+ NUN = N
414
+ JST = 1
415
+ JSP = N
416
+ C
417
+ C IRREG = 1 WHEN NO IRREGULARITIES HAVE OCCURRED, OTHERWISE IT IS 2.
418
+ C
419
+ 108 L = 2*JST
420
+ NODD = 2-2*((NUN+1)/2)+NUN
421
+ C
422
+ C NODD = 1 WHEN NUN IS ODD, OTHERWISE IT IS 2.
423
+ C
424
+ GO TO (110,109),NODD
425
+ 109 JSP = JSP-L
426
+ GO TO 111
427
+ 110 JSP = JSP-JST
428
+ IF (IRREG .NE. 1) JSP = JSP-L
429
+ 111 CONTINUE
430
+ C
431
+ C REGULAR REDUCTION
432
+ C
433
+ CALL CMPCSG (JST,1,0.5,0.0,TCOS)
434
+ IF (L .GT. JSP) GO TO 118
435
+ DO 117 J=L,JSP,L
436
+ JM1 = J-JSH
437
+ JP1 = J+JSH
438
+ JM2 = J-JST
439
+ JP2 = J+JST
440
+ JM3 = JM2-JSH
441
+ JP3 = JP2+JSH
442
+ IF (JST .NE. 1) GO TO 113
443
+ DO 112 I=1,M
444
+ B(I) = 2.*Q(I,J)
445
+ Q(I,J) = Q(I,JM2)+Q(I,JP2)
446
+ 112 CONTINUE
447
+ GO TO 115
448
+ 113 DO 114 I=1,M
449
+ T = Q(I,J)-Q(I,JM1)-Q(I,JP1)+Q(I,JM2)+Q(I,JP2)
450
+ B(I) = T+Q(I,J)-Q(I,JM3)-Q(I,JP3)
451
+ Q(I,J) = T
452
+ 114 CONTINUE
453
+ 115 CONTINUE
454
+ CALL CMPTRX (JST,0,M,BA,BB,BC,B,TCOS,D,W)
455
+ DO 116 I=1,M
456
+ Q(I,J) = Q(I,J)+B(I)
457
+ 116 CONTINUE
458
+ 117 CONTINUE
459
+ C
460
+ C REDUCTION FOR LAST UNKNOWN
461
+ C
462
+ 118 GO TO (119,136),NODD
463
+ 119 GO TO (152,120),IRREG
464
+ C
465
+ C ODD NUMBER OF UNKNOWNS
466
+ C
467
+ 120 JSP = JSP+L
468
+ J = JSP
469
+ JM1 = J-JSH
470
+ JP1 = J+JSH
471
+ JM2 = J-JST
472
+ JP2 = J+JST
473
+ JM3 = JM2-JSH
474
+ GO TO (123,121),ISTAG
475
+ 121 CONTINUE
476
+ IF (JST .NE. 1) GO TO 123
477
+ DO 122 I=1,M
478
+ B(I) = Q(I,J)
479
+ Q(I,J) = CMPLX(0.,0.)
480
+ 122 CONTINUE
481
+ GO TO 130
482
+ 123 GO TO (124,126),NODDPR
483
+ 124 DO 125 I=1,M
484
+ IP1 = IP+I
485
+ B(I) = .5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))+P(IP1)+Q(I,J)
486
+ 125 CONTINUE
487
+ GO TO 128
488
+ 126 DO 127 I=1,M
489
+ B(I) = .5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))+Q(I,JP2)-Q(I,JP1)+Q(I,J)
490
+ 127 CONTINUE
491
+ 128 DO 129 I=1,M
492
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
493
+ 129 CONTINUE
494
+ 130 CALL CMPTRX (JST,0,M,BA,BB,BC,B,TCOS,D,W)
495
+ IP = IP+M
496
+ IPSTOR = MAX0(IPSTOR,IP+M)
497
+ DO 131 I=1,M
498
+ IP1 = IP+I
499
+ P(IP1) = Q(I,J)+B(I)
500
+ B(I) = Q(I,JP2)+P(IP1)
501
+ 131 CONTINUE
502
+ IF (LR .NE. 0) GO TO 133
503
+ DO 132 I=1,JST
504
+ KRPI = KR+I
505
+ TCOS(KRPI) = TCOS(I)
506
+ 132 CONTINUE
507
+ GO TO 134
508
+ 133 CONTINUE
509
+ CALL CMPCSG (LR,JSTSAV,0.,FI,TCOS(JST+1))
510
+ CALL CMPMRG (TCOS,0,JST,JST,LR,KR)
511
+ 134 CONTINUE
512
+ CALL CMPCSG (KR,JSTSAV,0.0,FI,TCOS)
513
+ CALL CMPTRX (KR,KR,M,BA,BB,BC,B,TCOS,D,W)
514
+ DO 135 I=1,M
515
+ IP1 = IP+I
516
+ Q(I,J) = Q(I,JM2)+B(I)+P(IP1)
517
+ 135 CONTINUE
518
+ LR = KR
519
+ KR = KR+L
520
+ GO TO 152
521
+ C
522
+ C EVEN NUMBER OF UNKNOWNS
523
+ C
524
+ 136 JSP = JSP+L
525
+ J = JSP
526
+ JM1 = J-JSH
527
+ JP1 = J+JSH
528
+ JM2 = J-JST
529
+ JP2 = J+JST
530
+ JM3 = JM2-JSH
531
+ GO TO (137,138),IRREG
532
+ 137 CONTINUE
533
+ JSTSAV = JST
534
+ IDEG = JST
535
+ KR = L
536
+ GO TO 139
537
+ 138 CALL CMPCSG (KR,JSTSAV,0.0,FI,TCOS)
538
+ CALL CMPCSG (LR,JSTSAV,0.0,FI,TCOS(KR+1))
539
+ IDEG = KR
540
+ KR = KR+JST
541
+ 139 IF (JST .NE. 1) GO TO 141
542
+ IRREG = 2
543
+ DO 140 I=1,M
544
+ B(I) = Q(I,J)
545
+ Q(I,J) = Q(I,JM2)
546
+ 140 CONTINUE
547
+ GO TO 150
548
+ 141 DO 142 I=1,M
549
+ B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
550
+ 142 CONTINUE
551
+ GO TO (143,145),IRREG
552
+ 143 DO 144 I=1,M
553
+ Q(I,J) = Q(I,JM2)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
554
+ 144 CONTINUE
555
+ IRREG = 2
556
+ GO TO 150
557
+ 145 CONTINUE
558
+ GO TO (146,148),NODDPR
559
+ 146 DO 147 I=1,M
560
+ IP1 = IP+I
561
+ Q(I,J) = Q(I,JM2)+P(IP1)
562
+ 147 CONTINUE
563
+ IP = IP-M
564
+ GO TO 150
565
+ 148 DO 149 I=1,M
566
+ Q(I,J) = Q(I,JM2)+Q(I,J)-Q(I,JM1)
567
+ 149 CONTINUE
568
+ 150 CALL CMPTRX (IDEG,LR,M,BA,BB,BC,B,TCOS,D,W)
569
+ DO 151 I=1,M
570
+ Q(I,J) = Q(I,J)+B(I)
571
+ 151 CONTINUE
572
+ 152 NUN = NUN/2
573
+ NODDPR = NODD
574
+ JSH = JST
575
+ JST = 2*JST
576
+ IF (NUN .GE. 2) GO TO 108
577
+ C
578
+ C START SOLUTION.
579
+ C
580
+ J = JSP
581
+ DO 153 I=1,M
582
+ B(I) = Q(I,J)
583
+ 153 CONTINUE
584
+ GO TO (154,155),IRREG
585
+ 154 CONTINUE
586
+ CALL CMPCSG (JST,1,0.5,0.0,TCOS)
587
+ IDEG = JST
588
+ GO TO 156
589
+ 155 KR = LR+JST
590
+ CALL CMPCSG (KR,JSTSAV,0.0,FI,TCOS)
591
+ CALL CMPCSG (LR,JSTSAV,0.0,FI,TCOS(KR+1))
592
+ IDEG = KR
593
+ 156 CONTINUE
594
+ CALL CMPTRX (IDEG,LR,M,BA,BB,BC,B,TCOS,D,W)
595
+ JM1 = J-JSH
596
+ JP1 = J+JSH
597
+ GO TO (157,159),IRREG
598
+ 157 DO 158 I=1,M
599
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
600
+ 158 CONTINUE
601
+ GO TO 164
602
+ 159 GO TO (160,162),NODDPR
603
+ 160 DO 161 I=1,M
604
+ IP1 = IP+I
605
+ Q(I,J) = P(IP1)+B(I)
606
+ 161 CONTINUE
607
+ IP = IP-M
608
+ GO TO 164
609
+ 162 DO 163 I=1,M
610
+ Q(I,J) = Q(I,J)-Q(I,JM1)+B(I)
611
+ 163 CONTINUE
612
+ 164 CONTINUE
613
+ C
614
+ C START BACK SUBSTITUTION.
615
+ C
616
+ JST = JST/2
617
+ JSH = JST/2
618
+ NUN = 2*NUN
619
+ IF (NUN .GT. N) GO TO 183
620
+ DO 182 J=JST,N,L
621
+ JM1 = J-JSH
622
+ JP1 = J+JSH
623
+ JM2 = J-JST
624
+ JP2 = J+JST
625
+ IF (J .GT. JST) GO TO 166
626
+ DO 165 I=1,M
627
+ B(I) = Q(I,J)+Q(I,JP2)
628
+ 165 CONTINUE
629
+ GO TO 170
630
+ 166 IF (JP2 .LE. N) GO TO 168
631
+ DO 167 I=1,M
632
+ B(I) = Q(I,J)+Q(I,JM2)
633
+ 167 CONTINUE
634
+ IF (JST .LT. JSTSAV) IRREG = 1
635
+ GO TO (170,171),IRREG
636
+ 168 DO 169 I=1,M
637
+ B(I) = Q(I,J)+Q(I,JM2)+Q(I,JP2)
638
+ 169 CONTINUE
639
+ 170 CONTINUE
640
+ CALL CMPCSG (JST,1,0.5,0.0,TCOS)
641
+ IDEG = JST
642
+ JDEG = 0
643
+ GO TO 172
644
+ 171 IF (J+L .GT. N) LR = LR-JST
645
+ KR = JST+LR
646
+ CALL CMPCSG (KR,JSTSAV,0.0,FI,TCOS)
647
+ CALL CMPCSG (LR,JSTSAV,0.0,FI,TCOS(KR+1))
648
+ IDEG = KR
649
+ JDEG = LR
650
+ 172 CONTINUE
651
+ CALL CMPTRX (IDEG,JDEG,M,BA,BB,BC,B,TCOS,D,W)
652
+ IF (JST .GT. 1) GO TO 174
653
+ DO 173 I=1,M
654
+ Q(I,J) = B(I)
655
+ 173 CONTINUE
656
+ GO TO 182
657
+ 174 IF (JP2 .GT. N) GO TO 177
658
+ 175 DO 176 I=1,M
659
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
660
+ 176 CONTINUE
661
+ GO TO 182
662
+ 177 GO TO (175,178),IRREG
663
+ 178 IF (J+JSH .GT. N) GO TO 180
664
+ DO 179 I=1,M
665
+ IP1 = IP+I
666
+ Q(I,J) = B(I)+P(IP1)
667
+ 179 CONTINUE
668
+ IP = IP-M
669
+ GO TO 182
670
+ 180 DO 181 I=1,M
671
+ Q(I,J) = B(I)+Q(I,J)-Q(I,JM1)
672
+ 181 CONTINUE
673
+ 182 CONTINUE
674
+ L = L/2
675
+ GO TO 164
676
+ 183 CONTINUE
677
+ C
678
+ C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
679
+ C
680
+ W(1) = CMPLX(FLOAT(IPSTOR),0.)
681
+ RETURN
682
+ END
683
+ SUBROUTINE CMPOSN (M,N,ISTAG,MIXBND,A,BB,C,Q,IDIMQ,B,B2,B3,W,W2,
684
+ 1 W3,D,TCOS,P)
685
+ C
686
+ C SUBROUTINE TO SOLVE POISSON'S EQUATION WITH NEUMANN BOUNDARY
687
+ C CONDITIONS.
688
+ C
689
+ C ISTAG = 1 IF THE LAST DIAGONAL BLOCK IS A.
690
+ C ISTAG = 2 IF THE LAST DIAGONAL BLOCK IS A-I.
691
+ C MIXBND = 1 IF HAVE NEUMANN BOUNDARY CONDITIONS AT BOTH BOUNDARIES.
692
+ C MIXBND = 2 IF HAVE NEUMANN BOUNDARY CONDITIONS AT BOTTOM AND
693
+ C DIRICHLET CONDITION AT TOP. (FOR THIS CASE, MUST HAVE ISTAG = 1.)
694
+ C
695
+ COMPLEX A ,BB ,C ,Q ,
696
+ 1 B ,B2 ,B3 ,W ,
697
+ 2 W2 ,W3 ,D ,TCOS ,
698
+ 3 P ,FI ,T
699
+ DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,*) ,
700
+ 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
701
+ 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
702
+ 3 K(4) ,P(*)
703
+ EQUIVALENCE (K(1),K1) ,(K(2),K2) ,(K(3),K3) ,(K(4),K4)
704
+ FISTAG = 3-ISTAG
705
+ FNUM = 1./FLOAT(ISTAG)
706
+ FDEN = 0.5*FLOAT(ISTAG-1)
707
+ MR = M
708
+ IP = -MR
709
+ IPSTOR = 0
710
+ I2R = 1
711
+ JR = 2
712
+ NR = N
713
+ NLAST = N
714
+ KR = 1
715
+ LR = 0
716
+ GO TO (101,103),ISTAG
717
+ 101 CONTINUE
718
+ DO 102 I=1,MR
719
+ Q(I,N) = .5*Q(I,N)
720
+ 102 CONTINUE
721
+ GO TO (103,104),MIXBND
722
+ 103 IF (N .LE. 3) GO TO 155
723
+ 104 CONTINUE
724
+ JR = 2*I2R
725
+ NROD = 1
726
+ IF ((NR/2)*2 .EQ. NR) NROD = 0
727
+ GO TO (105,106),MIXBND
728
+ 105 JSTART = 1
729
+ GO TO 107
730
+ 106 JSTART = JR
731
+ NROD = 1-NROD
732
+ 107 CONTINUE
733
+ JSTOP = NLAST-JR
734
+ IF (NROD .EQ. 0) JSTOP = JSTOP-I2R
735
+ CALL CMPCSG (I2R,1,0.5,0.0,TCOS)
736
+ I2RBY2 = I2R/2
737
+ IF (JSTOP .GE. JSTART) GO TO 108
738
+ J = JR
739
+ GO TO 116
740
+ 108 CONTINUE
741
+ C
742
+ C REGULAR REDUCTION.
743
+ C
744
+ DO 115 J=JSTART,JSTOP,JR
745
+ JP1 = J+I2RBY2
746
+ JP2 = J+I2R
747
+ JP3 = JP2+I2RBY2
748
+ JM1 = J-I2RBY2
749
+ JM2 = J-I2R
750
+ JM3 = JM2-I2RBY2
751
+ IF (J .NE. 1) GO TO 109
752
+ JM1 = JP1
753
+ JM2 = JP2
754
+ JM3 = JP3
755
+ 109 CONTINUE
756
+ IF (I2R .NE. 1) GO TO 111
757
+ IF (J .EQ. 1) JM2 = JP2
758
+ DO 110 I=1,MR
759
+ B(I) = 2.*Q(I,J)
760
+ Q(I,J) = Q(I,JM2)+Q(I,JP2)
761
+ 110 CONTINUE
762
+ GO TO 113
763
+ 111 CONTINUE
764
+ DO 112 I=1,MR
765
+ FI = Q(I,J)
766
+ Q(I,J) = Q(I,J)-Q(I,JM1)-Q(I,JP1)+Q(I,JM2)+Q(I,JP2)
767
+ B(I) = FI+Q(I,J)-Q(I,JM3)-Q(I,JP3)
768
+ 112 CONTINUE
769
+ 113 CONTINUE
770
+ CALL CMPTRX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
771
+ DO 114 I=1,MR
772
+ Q(I,J) = Q(I,J)+B(I)
773
+ 114 CONTINUE
774
+ C
775
+ C END OF REDUCTION FOR REGULAR UNKNOWNS.
776
+ C
777
+ 115 CONTINUE
778
+ C
779
+ C BEGIN SPECIAL REDUCTION FOR LAST UNKNOWN.
780
+ C
781
+ J = JSTOP+JR
782
+ 116 NLAST = J
783
+ JM1 = J-I2RBY2
784
+ JM2 = J-I2R
785
+ JM3 = JM2-I2RBY2
786
+ IF (NROD .EQ. 0) GO TO 128
787
+ C
788
+ C ODD NUMBER OF UNKNOWNS
789
+ C
790
+ IF (I2R .NE. 1) GO TO 118
791
+ DO 117 I=1,MR
792
+ B(I) = FISTAG*Q(I,J)
793
+ Q(I,J) = Q(I,JM2)
794
+ 117 CONTINUE
795
+ GO TO 126
796
+ 118 DO 119 I=1,MR
797
+ B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
798
+ 119 CONTINUE
799
+ IF (NRODPR .NE. 0) GO TO 121
800
+ DO 120 I=1,MR
801
+ II = IP+I
802
+ Q(I,J) = Q(I,JM2)+P(II)
803
+ 120 CONTINUE
804
+ IP = IP-MR
805
+ GO TO 123
806
+ 121 CONTINUE
807
+ DO 122 I=1,MR
808
+ Q(I,J) = Q(I,J)-Q(I,JM1)+Q(I,JM2)
809
+ 122 CONTINUE
810
+ 123 IF (LR .EQ. 0) GO TO 124
811
+ CALL CMPCSG (LR,1,0.5,FDEN,TCOS(KR+1))
812
+ GO TO 126
813
+ 124 CONTINUE
814
+ DO 125 I=1,MR
815
+ B(I) = FISTAG*B(I)
816
+ 125 CONTINUE
817
+ 126 CONTINUE
818
+ CALL CMPCSG (KR,1,0.5,FDEN,TCOS)
819
+ CALL CMPTRX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
820
+ DO 127 I=1,MR
821
+ Q(I,J) = Q(I,J)+B(I)
822
+ 127 CONTINUE
823
+ KR = KR+I2R
824
+ GO TO 151
825
+ 128 CONTINUE
826
+ C
827
+ C EVEN NUMBER OF UNKNOWNS
828
+ C
829
+ JP1 = J+I2RBY2
830
+ JP2 = J+I2R
831
+ IF (I2R .NE. 1) GO TO 135
832
+ DO 129 I=1,MR
833
+ B(I) = Q(I,J)
834
+ 129 CONTINUE
835
+ CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
836
+ IP = 0
837
+ IPSTOR = MR
838
+ GO TO (133,130),ISTAG
839
+ 130 DO 131 I=1,MR
840
+ P(I) = B(I)
841
+ B(I) = B(I)+Q(I,N)
842
+ 131 CONTINUE
843
+ TCOS(1) = CMPLX(1.,0.)
844
+ TCOS(2) = CMPLX(0.,0.)
845
+ CALL CMPTRX (1,1,MR,A,BB,C,B,TCOS,D,W)
846
+ DO 132 I=1,MR
847
+ Q(I,J) = Q(I,JM2)+P(I)+B(I)
848
+ 132 CONTINUE
849
+ GO TO 150
850
+ 133 CONTINUE
851
+ DO 134 I=1,MR
852
+ P(I) = B(I)
853
+ Q(I,J) = Q(I,JM2)+2.*Q(I,JP2)+3.*B(I)
854
+ 134 CONTINUE
855
+ GO TO 150
856
+ 135 CONTINUE
857
+ DO 136 I=1,MR
858
+ B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
859
+ 136 CONTINUE
860
+ IF (NRODPR .NE. 0) GO TO 138
861
+ DO 137 I=1,MR
862
+ II = IP+I
863
+ B(I) = B(I)+P(II)
864
+ 137 CONTINUE
865
+ GO TO 140
866
+ 138 CONTINUE
867
+ DO 139 I=1,MR
868
+ B(I) = B(I)+Q(I,JP2)-Q(I,JP1)
869
+ 139 CONTINUE
870
+ 140 CONTINUE
871
+ CALL CMPTRX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
872
+ IP = IP+MR
873
+ IPSTOR = MAX0(IPSTOR,IP+MR)
874
+ DO 141 I=1,MR
875
+ II = IP+I
876
+ P(II) = B(I)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
877
+ B(I) = P(II)+Q(I,JP2)
878
+ 141 CONTINUE
879
+ IF (LR .EQ. 0) GO TO 142
880
+ CALL CMPCSG (LR,1,0.5,FDEN,TCOS(I2R+1))
881
+ CALL CMPMRG (TCOS,0,I2R,I2R,LR,KR)
882
+ GO TO 144
883
+ 142 DO 143 I=1,I2R
884
+ II = KR+I
885
+ TCOS(II) = TCOS(I)
886
+ 143 CONTINUE
887
+ 144 CALL CMPCSG (KR,1,0.5,FDEN,TCOS)
888
+ IF (LR .NE. 0) GO TO 145
889
+ GO TO (146,145),ISTAG
890
+ 145 CONTINUE
891
+ CALL CMPTRX (KR,KR,MR,A,BB,C,B,TCOS,D,W)
892
+ GO TO 148
893
+ 146 CONTINUE
894
+ DO 147 I=1,MR
895
+ B(I) = FISTAG*B(I)
896
+ 147 CONTINUE
897
+ 148 CONTINUE
898
+ DO 149 I=1,MR
899
+ II = IP+I
900
+ Q(I,J) = Q(I,JM2)+P(II)+B(I)
901
+ 149 CONTINUE
902
+ 150 CONTINUE
903
+ LR = KR
904
+ KR = KR+JR
905
+ 151 CONTINUE
906
+ GO TO (152,153),MIXBND
907
+ 152 NR = (NLAST-1)/JR+1
908
+ IF (NR .LE. 3) GO TO 155
909
+ GO TO 154
910
+ 153 NR = NLAST/JR
911
+ IF (NR .LE. 1) GO TO 192
912
+ 154 I2R = JR
913
+ NRODPR = NROD
914
+ GO TO 104
915
+ 155 CONTINUE
916
+ C
917
+ C BEGIN SOLUTION
918
+ C
919
+ J = 1+JR
920
+ JM1 = J-I2R
921
+ JP1 = J+I2R
922
+ JM2 = NLAST-I2R
923
+ IF (NR .EQ. 2) GO TO 184
924
+ IF (LR .NE. 0) GO TO 170
925
+ IF (N .NE. 3) GO TO 161
926
+ C
927
+ C CASE N = 3.
928
+ C
929
+ GO TO (156,168),ISTAG
930
+ 156 CONTINUE
931
+ DO 157 I=1,MR
932
+ B(I) = Q(I,2)
933
+ 157 CONTINUE
934
+ TCOS(1) = CMPLX(0.,0.)
935
+ CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
936
+ DO 158 I=1,MR
937
+ Q(I,2) = B(I)
938
+ B(I) = 4.*B(I)+Q(I,1)+2.*Q(I,3)
939
+ 158 CONTINUE
940
+ TCOS(1) = CMPLX(-2.,0.)
941
+ TCOS(2) = CMPLX(2.,0.)
942
+ I1 = 2
943
+ I2 = 0
944
+ CALL CMPTRX (I1,I2,MR,A,BB,C,B,TCOS,D,W)
945
+ DO 159 I=1,MR
946
+ Q(I,2) = Q(I,2)+B(I)
947
+ B(I) = Q(I,1)+2.*Q(I,2)
948
+ 159 CONTINUE
949
+ TCOS(1) = (0.,0.)
950
+ CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
951
+ DO 160 I=1,MR
952
+ Q(I,1) = B(I)
953
+ 160 CONTINUE
954
+ JR = 1
955
+ I2R = 0
956
+ GO TO 194
957
+ C
958
+ C CASE N = 2**P+1
959
+ C
960
+ 161 CONTINUE
961
+ GO TO (162,170),ISTAG
962
+ 162 CONTINUE
963
+ DO 163 I=1,MR
964
+ B(I) = Q(I,J)+.5*Q(I,1)-Q(I,JM1)+Q(I,NLAST)-Q(I,JM2)
965
+ 163 CONTINUE
966
+ CALL CMPCSG (JR,1,0.5,0.0,TCOS)
967
+ CALL CMPTRX (JR,0,MR,A,BB,C,B,TCOS,D,W)
968
+ DO 164 I=1,MR
969
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
970
+ B(I) = Q(I,1)+2.*Q(I,NLAST)+4.*Q(I,J)
971
+ 164 CONTINUE
972
+ JR2 = 2*JR
973
+ CALL CMPCSG (JR,1,0.0,0.0,TCOS)
974
+ DO 165 I=1,JR
975
+ I1 = JR+I
976
+ I2 = JR+1-I
977
+ TCOS(I1) = -TCOS(I2)
978
+ 165 CONTINUE
979
+ CALL CMPTRX (JR2,0,MR,A,BB,C,B,TCOS,D,W)
980
+ DO 166 I=1,MR
981
+ Q(I,J) = Q(I,J)+B(I)
982
+ B(I) = Q(I,1)+2.*Q(I,J)
983
+ 166 CONTINUE
984
+ CALL CMPCSG (JR,1,0.5,0.0,TCOS)
985
+ CALL CMPTRX (JR,0,MR,A,BB,C,B,TCOS,D,W)
986
+ DO 167 I=1,MR
987
+ Q(I,1) = .5*Q(I,1)-Q(I,JM1)+B(I)
988
+ 167 CONTINUE
989
+ GO TO 194
990
+ C
991
+ C CASE OF GENERAL N WITH NR = 3 .
992
+ C
993
+ 168 DO 169 I=1,MR
994
+ B(I) = Q(I,2)
995
+ Q(I,2) = (0.,0.)
996
+ B2(I) = Q(I,3)
997
+ B3(I) = Q(I,1)
998
+ 169 CONTINUE
999
+ JR = 1
1000
+ I2R = 0
1001
+ J = 2
1002
+ GO TO 177
1003
+ 170 CONTINUE
1004
+ DO 171 I=1,MR
1005
+ B(I) = .5*Q(I,1)-Q(I,JM1)+Q(I,J)
1006
+ 171 CONTINUE
1007
+ IF (NROD .NE. 0) GO TO 173
1008
+ DO 172 I=1,MR
1009
+ II = IP+I
1010
+ B(I) = B(I)+P(II)
1011
+ 172 CONTINUE
1012
+ GO TO 175
1013
+ 173 DO 174 I=1,MR
1014
+ B(I) = B(I)+Q(I,NLAST)-Q(I,JM2)
1015
+ 174 CONTINUE
1016
+ 175 CONTINUE
1017
+ DO 176 I=1,MR
1018
+ T = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
1019
+ Q(I,J) = T
1020
+ B2(I) = Q(I,NLAST)+T
1021
+ B3(I) = Q(I,1)+2.*T
1022
+ 176 CONTINUE
1023
+ 177 CONTINUE
1024
+ K1 = KR+2*JR-1
1025
+ K2 = KR+JR
1026
+ TCOS(K1+1) = (-2.,0.)
1027
+ K4 = K1+3-ISTAG
1028
+ CALL CMPCSG (K2+ISTAG-2,1,0.0,FNUM,TCOS(K4))
1029
+ K4 = K1+K2+1
1030
+ CALL CMPCSG (JR-1,1,0.0,1.0,TCOS(K4))
1031
+ CALL CMPMRG (TCOS,K1,K2,K1+K2,JR-1,0)
1032
+ K3 = K1+K2+LR
1033
+ CALL CMPCSG (JR,1,0.5,0.0,TCOS(K3+1))
1034
+ K4 = K3+JR+1
1035
+ CALL CMPCSG (KR,1,0.5,FDEN,TCOS(K4))
1036
+ CALL CMPMRG (TCOS,K3,JR,K3+JR,KR,K1)
1037
+ IF (LR .EQ. 0) GO TO 178
1038
+ CALL CMPCSG (LR,1,0.5,FDEN,TCOS(K4))
1039
+ CALL CMPMRG (TCOS,K3,JR,K3+JR,LR,K3-LR)
1040
+ CALL CMPCSG (KR,1,0.5,FDEN,TCOS(K4))
1041
+ 178 K3 = KR
1042
+ K4 = KR
1043
+ CALL CMPTR3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
1044
+ DO 179 I=1,MR
1045
+ B(I) = B(I)+B2(I)+B3(I)
1046
+ 179 CONTINUE
1047
+ TCOS(1) = (2.,0.)
1048
+ CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
1049
+ DO 180 I=1,MR
1050
+ Q(I,J) = Q(I,J)+B(I)
1051
+ B(I) = Q(I,1)+2.*Q(I,J)
1052
+ 180 CONTINUE
1053
+ CALL CMPCSG (JR,1,0.5,0.0,TCOS)
1054
+ CALL CMPTRX (JR,0,MR,A,BB,C,B,TCOS,D,W)
1055
+ IF (JR .NE. 1) GO TO 182
1056
+ DO 181 I=1,MR
1057
+ Q(I,1) = B(I)
1058
+ 181 CONTINUE
1059
+ GO TO 194
1060
+ 182 CONTINUE
1061
+ DO 183 I=1,MR
1062
+ Q(I,1) = .5*Q(I,1)-Q(I,JM1)+B(I)
1063
+ 183 CONTINUE
1064
+ GO TO 194
1065
+ 184 CONTINUE
1066
+ IF (N .NE. 2) GO TO 188
1067
+ C
1068
+ C CASE N = 2
1069
+ C
1070
+ DO 185 I=1,MR
1071
+ B(I) = Q(I,1)
1072
+ 185 CONTINUE
1073
+ TCOS(1) = (0.,0.)
1074
+ CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
1075
+ DO 186 I=1,MR
1076
+ Q(I,1) = B(I)
1077
+ B(I) = 2.*(Q(I,2)+B(I))*FISTAG
1078
+ 186 CONTINUE
1079
+ TCOS(1) = CMPLX(-FISTAG,0.)
1080
+ TCOS(2) = CMPLX(2.,0.)
1081
+ CALL CMPTRX (2,0,MR,A,BB,C,B,TCOS,D,W)
1082
+ DO 187 I=1,MR
1083
+ Q(I,1) = Q(I,1)+B(I)
1084
+ 187 CONTINUE
1085
+ JR = 1
1086
+ I2R = 0
1087
+ GO TO 194
1088
+ 188 CONTINUE
1089
+ C
1090
+ C CASE OF GENERAL N AND NR = 2 .
1091
+ C
1092
+ DO 189 I=1,MR
1093
+ II = IP+I
1094
+ B3(I) = (0.,0.)
1095
+ B(I) = Q(I,1)+2.*P(II)
1096
+ Q(I,1) = .5*Q(I,1)-Q(I,JM1)
1097
+ B2(I) = 2.*(Q(I,1)+Q(I,NLAST))
1098
+ 189 CONTINUE
1099
+ K1 = KR+JR-1
1100
+ TCOS(K1+1) = (-2.,0.)
1101
+ K4 = K1+3-ISTAG
1102
+ CALL CMPCSG (KR+ISTAG-2,1,0.0,FNUM,TCOS(K4))
1103
+ K4 = K1+KR+1
1104
+ CALL CMPCSG (JR-1,1,0.0,1.0,TCOS(K4))
1105
+ CALL CMPMRG (TCOS,K1,KR,K1+KR,JR-1,0)
1106
+ CALL CMPCSG (KR,1,0.5,FDEN,TCOS(K1+1))
1107
+ K2 = KR
1108
+ K4 = K1+K2+1
1109
+ CALL CMPCSG (LR,1,0.5,FDEN,TCOS(K4))
1110
+ K3 = LR
1111
+ K4 = 0
1112
+ CALL CMPTR3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
1113
+ DO 190 I=1,MR
1114
+ B(I) = B(I)+B2(I)
1115
+ 190 CONTINUE
1116
+ TCOS(1) = (2.,0.)
1117
+ CALL CMPTRX (1,0,MR,A,BB,C,B,TCOS,D,W)
1118
+ DO 191 I=1,MR
1119
+ Q(I,1) = Q(I,1)+B(I)
1120
+ 191 CONTINUE
1121
+ GO TO 194
1122
+ 192 DO 193 I=1,MR
1123
+ B(I) = Q(I,NLAST)
1124
+ 193 CONTINUE
1125
+ GO TO 196
1126
+ 194 CONTINUE
1127
+ C
1128
+ C START BACK SUBSTITUTION.
1129
+ C
1130
+ J = NLAST-JR
1131
+ DO 195 I=1,MR
1132
+ B(I) = Q(I,NLAST)+Q(I,J)
1133
+ 195 CONTINUE
1134
+ 196 JM2 = NLAST-I2R
1135
+ IF (JR .NE. 1) GO TO 198
1136
+ DO 197 I=1,MR
1137
+ Q(I,NLAST) = (0.,0.)
1138
+ 197 CONTINUE
1139
+ GO TO 202
1140
+ 198 CONTINUE
1141
+ IF (NROD .NE. 0) GO TO 200
1142
+ DO 199 I=1,MR
1143
+ II = IP+I
1144
+ Q(I,NLAST) = P(II)
1145
+ 199 CONTINUE
1146
+ IP = IP-MR
1147
+ GO TO 202
1148
+ 200 DO 201 I=1,MR
1149
+ Q(I,NLAST) = Q(I,NLAST)-Q(I,JM2)
1150
+ 201 CONTINUE
1151
+ 202 CONTINUE
1152
+ CALL CMPCSG (KR,1,0.5,FDEN,TCOS)
1153
+ CALL CMPCSG (LR,1,0.5,FDEN,TCOS(KR+1))
1154
+ IF (LR .NE. 0) GO TO 204
1155
+ DO 203 I=1,MR
1156
+ B(I) = FISTAG*B(I)
1157
+ 203 CONTINUE
1158
+ 204 CONTINUE
1159
+ CALL CMPTRX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
1160
+ DO 205 I=1,MR
1161
+ Q(I,NLAST) = Q(I,NLAST)+B(I)
1162
+ 205 CONTINUE
1163
+ NLASTP = NLAST
1164
+ 206 CONTINUE
1165
+ JSTEP = JR
1166
+ JR = I2R
1167
+ I2R = I2R/2
1168
+ IF (JR .EQ. 0) GO TO 222
1169
+ GO TO (207,208),MIXBND
1170
+ 207 JSTART = 1+JR
1171
+ GO TO 209
1172
+ 208 JSTART = JR
1173
+ 209 CONTINUE
1174
+ KR = KR-JR
1175
+ IF (NLAST+JR .GT. N) GO TO 210
1176
+ KR = KR-JR
1177
+ NLAST = NLAST+JR
1178
+ JSTOP = NLAST-JSTEP
1179
+ GO TO 211
1180
+ 210 CONTINUE
1181
+ JSTOP = NLAST-JR
1182
+ 211 CONTINUE
1183
+ LR = KR-JR
1184
+ CALL CMPCSG (JR,1,0.5,0.0,TCOS)
1185
+ DO 221 J=JSTART,JSTOP,JSTEP
1186
+ JM2 = J-JR
1187
+ JP2 = J+JR
1188
+ IF (J .NE. JR) GO TO 213
1189
+ DO 212 I=1,MR
1190
+ B(I) = Q(I,J)+Q(I,JP2)
1191
+ 212 CONTINUE
1192
+ GO TO 215
1193
+ 213 CONTINUE
1194
+ DO 214 I=1,MR
1195
+ B(I) = Q(I,J)+Q(I,JM2)+Q(I,JP2)
1196
+ 214 CONTINUE
1197
+ 215 CONTINUE
1198
+ IF (JR .NE. 1) GO TO 217
1199
+ DO 216 I=1,MR
1200
+ Q(I,J) = (0.,0.)
1201
+ 216 CONTINUE
1202
+ GO TO 219
1203
+ 217 CONTINUE
1204
+ JM1 = J-I2R
1205
+ JP1 = J+I2R
1206
+ DO 218 I=1,MR
1207
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
1208
+ 218 CONTINUE
1209
+ 219 CONTINUE
1210
+ CALL CMPTRX (JR,0,MR,A,BB,C,B,TCOS,D,W)
1211
+ DO 220 I=1,MR
1212
+ Q(I,J) = Q(I,J)+B(I)
1213
+ 220 CONTINUE
1214
+ 221 CONTINUE
1215
+ NROD = 1
1216
+ IF (NLAST+I2R .LE. N) NROD = 0
1217
+ IF (NLASTP .NE. NLAST) GO TO 194
1218
+ GO TO 206
1219
+ 222 CONTINUE
1220
+ C
1221
+ C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
1222
+ C
1223
+ W(1) = CMPLX(FLOAT(IPSTOR),0.)
1224
+ RETURN
1225
+ END
1226
+ SUBROUTINE CMPOSP (M,N,A,BB,C,Q,IDIMQ,B,B2,B3,W,W2,W3,D,TCOS,P)
1227
+ C
1228
+ C SUBROUTINE TO SOLVE POISSON EQUATION WITH PERIODIC BOUNDARY
1229
+ C CONDITIONS.
1230
+ C
1231
+ COMPLEX A ,BB ,C ,Q ,
1232
+ 1 B ,B2 ,B3 ,W ,
1233
+ 2 W2 ,W3 ,D ,TCOS ,
1234
+ 3 P ,S ,T
1235
+ DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,1) ,
1236
+ 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
1237
+ 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
1238
+ 3 P(*)
1239
+ MR = M
1240
+ NR = (N+1)/2
1241
+ NRM1 = NR-1
1242
+ IF (2*NR .NE. N) GO TO 107
1243
+ C
1244
+ C EVEN NUMBER OF UNKNOWNS
1245
+ C
1246
+ DO 102 J=1,NRM1
1247
+ NRMJ = NR-J
1248
+ NRPJ = NR+J
1249
+ DO 101 I=1,MR
1250
+ S = Q(I,NRMJ)-Q(I,NRPJ)
1251
+ T = Q(I,NRMJ)+Q(I,NRPJ)
1252
+ Q(I,NRMJ) = S
1253
+ Q(I,NRPJ) = T
1254
+ 101 CONTINUE
1255
+ 102 CONTINUE
1256
+ DO 103 I=1,MR
1257
+ Q(I,NR) = 2.*Q(I,NR)
1258
+ Q(I,N) = 2.*Q(I,N)
1259
+ 103 CONTINUE
1260
+ CALL CMPOSD (MR,NRM1,1,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
1261
+ IPSTOR = REAL(W(1))
1262
+ CALL CMPOSN (MR,NR+1,1,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
1263
+ 1 TCOS,P)
1264
+ IPSTOR = MAX0(IPSTOR,INT(REAL(W(1))))
1265
+ DO 105 J=1,NRM1
1266
+ NRMJ = NR-J
1267
+ NRPJ = NR+J
1268
+ DO 104 I=1,MR
1269
+ S = .5*(Q(I,NRPJ)+Q(I,NRMJ))
1270
+ T = .5*(Q(I,NRPJ)-Q(I,NRMJ))
1271
+ Q(I,NRMJ) = S
1272
+ Q(I,NRPJ) = T
1273
+ 104 CONTINUE
1274
+ 105 CONTINUE
1275
+ DO 106 I=1,MR
1276
+ Q(I,NR) = .5*Q(I,NR)
1277
+ Q(I,N) = .5*Q(I,N)
1278
+ 106 CONTINUE
1279
+ GO TO 118
1280
+ 107 CONTINUE
1281
+ C
1282
+ C ODD NUMBER OF UNKNOWNS
1283
+ C
1284
+ DO 109 J=1,NRM1
1285
+ NRPJ = N+1-J
1286
+ DO 108 I=1,MR
1287
+ S = Q(I,J)-Q(I,NRPJ)
1288
+ T = Q(I,J)+Q(I,NRPJ)
1289
+ Q(I,J) = S
1290
+ Q(I,NRPJ) = T
1291
+ 108 CONTINUE
1292
+ 109 CONTINUE
1293
+ DO 110 I=1,MR
1294
+ Q(I,NR) = 2.*Q(I,NR)
1295
+ 110 CONTINUE
1296
+ LH = NRM1/2
1297
+ DO 112 J=1,LH
1298
+ NRMJ = NR-J
1299
+ DO 111 I=1,MR
1300
+ S = Q(I,J)
1301
+ Q(I,J) = Q(I,NRMJ)
1302
+ Q(I,NRMJ) = S
1303
+ 111 CONTINUE
1304
+ 112 CONTINUE
1305
+ CALL CMPOSD (MR,NRM1,2,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
1306
+ IPSTOR = REAL(W(1))
1307
+ CALL CMPOSN (MR,NR,2,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
1308
+ 1 TCOS,P)
1309
+ IPSTOR = MAX0(IPSTOR,INT(REAL(W(1))))
1310
+ DO 114 J=1,NRM1
1311
+ NRPJ = NR+J
1312
+ DO 113 I=1,MR
1313
+ S = .5*(Q(I,NRPJ)+Q(I,J))
1314
+ T = .5*(Q(I,NRPJ)-Q(I,J))
1315
+ Q(I,NRPJ) = T
1316
+ Q(I,J) = S
1317
+ 113 CONTINUE
1318
+ 114 CONTINUE
1319
+ DO 115 I=1,MR
1320
+ Q(I,NR) = .5*Q(I,NR)
1321
+ 115 CONTINUE
1322
+ DO 117 J=1,LH
1323
+ NRMJ = NR-J
1324
+ DO 116 I=1,MR
1325
+ S = Q(I,J)
1326
+ Q(I,J) = Q(I,NRMJ)
1327
+ Q(I,NRMJ) = S
1328
+ 116 CONTINUE
1329
+ 117 CONTINUE
1330
+ 118 CONTINUE
1331
+ C
1332
+ C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
1333
+ C
1334
+ W(1) = CMPLX(FLOAT(IPSTOR),0.)
1335
+ RETURN
1336
+ END
1337
+ SUBROUTINE CMPCSG (N,IJUMP,FNUM,FDEN,A)
1338
+ COMPLEX A
1339
+ DIMENSION A(*)
1340
+ C
1341
+ C
1342
+ C THIS SUBROUTINE COMPUTES REQUIRED COSINE VALUES IN ASCENDING
1343
+ C ORDER. WHEN IJUMP .GT. 1 THE ROUTINE COMPUTES VALUES
1344
+ C
1345
+ C 2*COS(J*PI/L) , J=1,2,...,L AND J .NE. 0(MOD N/IJUMP+1)
1346
+ C
1347
+ C WHERE L = IJUMP*(N/IJUMP+1).
1348
+ C
1349
+ C
1350
+ C WHEN IJUMP = 1 IT COMPUTES
1351
+ C
1352
+ C 2*COS((J-FNUM)*PI/(N+FDEN)) , J=1, 2, ... ,N
1353
+ C
1354
+ C WHERE
1355
+ C FNUM = 0.5, FDEN = 0.0, FOR REGULAR REDUCTION VALUES
1356
+ C FNUM = 0.0, FDEN = 1.0, FOR B-R AND C-R WHEN ISTAG = 1
1357
+ C FNUM = 0.0, FDEN = 0.5, FOR B-R AND C-R WHEN ISTAG = 2
1358
+ C FNUM = 0.5, FDEN = 0.5, FOR B-R AND C-R WHEN ISTAG = 2
1359
+ C IN CMPOSN ONLY.
1360
+ C
1361
+ C
1362
+ PI = PIMACH(DUM)
1363
+ IF (N .EQ. 0) GO TO 105
1364
+ IF (IJUMP .EQ. 1) GO TO 103
1365
+ K3 = N/IJUMP+1
1366
+ K4 = K3-1
1367
+ PIBYN = PI/FLOAT(N+IJUMP)
1368
+ DO 102 K=1,IJUMP
1369
+ K1 = (K-1)*K3
1370
+ K5 = (K-1)*K4
1371
+ DO 101 I=1,K4
1372
+ X = K1+I
1373
+ K2 = K5+I
1374
+ A(K2) = CMPLX(-2.*COS(X*PIBYN),0.)
1375
+ 101 CONTINUE
1376
+ 102 CONTINUE
1377
+ GO TO 105
1378
+ 103 CONTINUE
1379
+ NP1 = N+1
1380
+ Y = PI/(FLOAT(N)+FDEN)
1381
+ DO 104 I=1,N
1382
+ X = FLOAT(NP1-I)-FNUM
1383
+ A(I) = CMPLX(2.*COS(X*Y),0.)
1384
+ 104 CONTINUE
1385
+ 105 CONTINUE
1386
+ RETURN
1387
+ END
1388
+ SUBROUTINE CMPMRG (TCOS,I1,M1,I2,M2,I3)
1389
+ COMPLEX TCOS ,X ,Y
1390
+ DIMENSION TCOS(*)
1391
+ C
1392
+ C
1393
+ C THIS SUBROUTINE MERGES TWO ASCENDING STRINGS OF NUMBERS IN THE
1394
+ C ARRAY TCOS. THE FIRST STRING IS OF LENGTH M1 AND STARTS AT
1395
+ C TCOS(I1+1). THE SECOND STRING IS OF LENGTH M2 AND STARTS AT
1396
+ C TCOS(I2+1). THE MERGED STRING GOES INTO TCOS(I3+1).
1397
+ C
1398
+ C
1399
+ J1 = 1
1400
+ J2 = 1
1401
+ J = I3
1402
+ IF (M1 .EQ. 0) GO TO 107
1403
+ IF (M2 .EQ. 0) GO TO 104
1404
+ 101 J = J+1
1405
+ L = J1+I1
1406
+ X = TCOS(L)
1407
+ L = J2+I2
1408
+ Y = TCOS(L)
1409
+ IF (REAL(X-Y)) 102,102,103
1410
+ 102 TCOS(J) = X
1411
+ J1 = J1+1
1412
+ IF (J1 .GT. M1) GO TO 106
1413
+ GO TO 101
1414
+ 103 TCOS(J) = Y
1415
+ J2 = J2+1
1416
+ IF (J2 .LE. M2) GO TO 101
1417
+ IF (J1 .GT. M1) GO TO 109
1418
+ 104 K = J-J1+1
1419
+ DO 105 J=J1,M1
1420
+ M = K+J
1421
+ L = J+I1
1422
+ TCOS(M) = TCOS(L)
1423
+ 105 CONTINUE
1424
+ GO TO 109
1425
+ 106 CONTINUE
1426
+ IF (J2 .GT. M2) GO TO 109
1427
+ 107 K = J-J2+1
1428
+ DO 108 J=J2,M2
1429
+ M = K+J
1430
+ L = J+I2
1431
+ TCOS(M) = TCOS(L)
1432
+ 108 CONTINUE
1433
+ 109 CONTINUE
1434
+ RETURN
1435
+ END
1436
+ SUBROUTINE CMPTRX (IDEGBR,IDEGCR,M,A,B,C,Y,TCOS,D,W)
1437
+ C
1438
+ C SUBROUTINE TO SOLVE A SYSTEM OF LINEAR EQUATIONS WHERE THE
1439
+ C COEFFICIENT MATRIX IS A RATIONAL FUNCTION IN THE MATRIX GIVEN BY
1440
+ C TRIDIAGONAL ( . . . , A(I), B(I), C(I), . . . ).
1441
+ C
1442
+ COMPLEX A ,B ,C ,Y ,
1443
+ 1 TCOS ,D ,W ,X ,
1444
+ 2 XX ,Z
1445
+ DIMENSION A(*) ,B(*) ,C(*) ,Y(*) ,
1446
+ 1 TCOS(*) ,D(*) ,W(*)
1447
+ MM1 = M-1
1448
+ IFB = IDEGBR+1
1449
+ IFC = IDEGCR+1
1450
+ L = IFB/IFC
1451
+ LINT = 1
1452
+ DO 108 K=1,IDEGBR
1453
+ X = TCOS(K)
1454
+ IF (K .NE. L) GO TO 102
1455
+ I = IDEGBR+LINT
1456
+ XX = X-TCOS(I)
1457
+ DO 101 I=1,M
1458
+ W(I) = Y(I)
1459
+ Y(I) = XX*Y(I)
1460
+ 101 CONTINUE
1461
+ 102 CONTINUE
1462
+ Z = 1./(B(1)-X)
1463
+ D(1) = C(1)*Z
1464
+ Y(1) = Y(1)*Z
1465
+ DO 103 I=2,MM1
1466
+ Z = 1./(B(I)-X-A(I)*D(I-1))
1467
+ D(I) = C(I)*Z
1468
+ Y(I) = (Y(I)-A(I)*Y(I-1))*Z
1469
+ 103 CONTINUE
1470
+ Z = B(M)-X-A(M)*D(MM1)
1471
+ IF (CABS(Z) .NE. 0.) GO TO 104
1472
+ Y(M) = (0.,0.)
1473
+ GO TO 105
1474
+ 104 Y(M) = (Y(M)-A(M)*Y(MM1))/Z
1475
+ 105 CONTINUE
1476
+ DO 106 IP=1,MM1
1477
+ I = M-IP
1478
+ Y(I) = Y(I)-D(I)*Y(I+1)
1479
+ 106 CONTINUE
1480
+ IF (K .NE. L) GO TO 108
1481
+ DO 107 I=1,M
1482
+ Y(I) = Y(I)+W(I)
1483
+ 107 CONTINUE
1484
+ LINT = LINT+1
1485
+ L = (LINT*IFB)/IFC
1486
+ 108 CONTINUE
1487
+ RETURN
1488
+ END
1489
+ SUBROUTINE CMPTR3 (M,A,B,C,K,Y1,Y2,Y3,TCOS,D,W1,W2,W3)
1490
+ COMPLEX A ,B ,C ,Y1 ,
1491
+ 1 Y2 ,Y3 ,TCOS ,D ,
1492
+ 2 W1 ,W2 ,W3 ,X ,
1493
+ 3 XX ,Z
1494
+ DIMENSION A(*) ,B(*) ,C(*) ,K(4) ,
1495
+ 1 TCOS(*) ,Y1(*) ,Y2(*) ,Y3(*) ,
1496
+ 2 D(*) ,W1(*) ,W2(*) ,W3(*)
1497
+ C
1498
+ C SUBROUTINE TO SOLVE TRIDIAGONAL SYSTEMS
1499
+ C
1500
+ MM1 = M-1
1501
+ K1 = K(1)
1502
+ K2 = K(2)
1503
+ K3 = K(3)
1504
+ K4 = K(4)
1505
+ IF1 = K1+1
1506
+ IF2 = K2+1
1507
+ IF3 = K3+1
1508
+ IF4 = K4+1
1509
+ K2K3K4 = K2+K3+K4
1510
+ IF (K2K3K4 .EQ. 0) GO TO 101
1511
+ L1 = IF1/IF2
1512
+ L2 = IF1/IF3
1513
+ L3 = IF1/IF4
1514
+ LINT1 = 1
1515
+ LINT2 = 1
1516
+ LINT3 = 1
1517
+ KINT1 = K1
1518
+ KINT2 = KINT1+K2
1519
+ KINT3 = KINT2+K3
1520
+ 101 CONTINUE
1521
+ DO 115 N=1,K1
1522
+ X = TCOS(N)
1523
+ IF (K2K3K4 .EQ. 0) GO TO 107
1524
+ IF (N .NE. L1) GO TO 103
1525
+ DO 102 I=1,M
1526
+ W1(I) = Y1(I)
1527
+ 102 CONTINUE
1528
+ 103 IF (N .NE. L2) GO TO 105
1529
+ DO 104 I=1,M
1530
+ W2(I) = Y2(I)
1531
+ 104 CONTINUE
1532
+ 105 IF (N .NE. L3) GO TO 107
1533
+ DO 106 I=1,M
1534
+ W3(I) = Y3(I)
1535
+ 106 CONTINUE
1536
+ 107 CONTINUE
1537
+ Z = 1./(B(1)-X)
1538
+ D(1) = C(1)*Z
1539
+ Y1(1) = Y1(1)*Z
1540
+ Y2(1) = Y2(1)*Z
1541
+ Y3(1) = Y3(1)*Z
1542
+ DO 108 I=2,M
1543
+ Z = 1./(B(I)-X-A(I)*D(I-1))
1544
+ D(I) = C(I)*Z
1545
+ Y1(I) = (Y1(I)-A(I)*Y1(I-1))*Z
1546
+ Y2(I) = (Y2(I)-A(I)*Y2(I-1))*Z
1547
+ Y3(I) = (Y3(I)-A(I)*Y3(I-1))*Z
1548
+ 108 CONTINUE
1549
+ DO 109 IP=1,MM1
1550
+ I = M-IP
1551
+ Y1(I) = Y1(I)-D(I)*Y1(I+1)
1552
+ Y2(I) = Y2(I)-D(I)*Y2(I+1)
1553
+ Y3(I) = Y3(I)-D(I)*Y3(I+1)
1554
+ 109 CONTINUE
1555
+ IF (K2K3K4 .EQ. 0) GO TO 115
1556
+ IF (N .NE. L1) GO TO 111
1557
+ I = LINT1+KINT1
1558
+ XX = X-TCOS(I)
1559
+ DO 110 I=1,M
1560
+ Y1(I) = XX*Y1(I)+W1(I)
1561
+ 110 CONTINUE
1562
+ LINT1 = LINT1+1
1563
+ L1 = (LINT1*IF1)/IF2
1564
+ 111 IF (N .NE. L2) GO TO 113
1565
+ I = LINT2+KINT2
1566
+ XX = X-TCOS(I)
1567
+ DO 112 I=1,M
1568
+ Y2(I) = XX*Y2(I)+W2(I)
1569
+ 112 CONTINUE
1570
+ LINT2 = LINT2+1
1571
+ L2 = (LINT2*IF1)/IF3
1572
+ 113 IF (N .NE. L3) GO TO 115
1573
+ I = LINT3+KINT3
1574
+ XX = X-TCOS(I)
1575
+ DO 114 I=1,M
1576
+ Y3(I) = XX*Y3(I)+W3(I)
1577
+ 114 CONTINUE
1578
+ LINT3 = LINT3+1
1579
+ L3 = (LINT3*IF1)/IF4
1580
+ 115 CONTINUE
1581
+ RETURN
1582
+ C
1583
+ C REVISION HISTORY---
1584
+ C
1585
+ C SEPTEMBER 1973 VERSION 1
1586
+ C APRIL 1976 VERSION 2
1587
+ C JANUARY 1978 VERSION 3
1588
+ C DECEMBER 1979 VERSION 3.1
1589
+ C FEBRUARY 1985 DOCUMENTATION UPGRADE
1590
+ C NOVEMBER 1988 VERSION 3.2, FORTRAN 77 CHANGES
1591
+ C-----------------------------------------------------------------------
1592
+ END