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,1335 @@
1
+ C
2
+ C file genbun.f
3
+ C
4
+ SUBROUTINE GENBUN (NPEROD,N,MPEROD,M,A,B,C,IDIMY,Y,IERROR,W)
5
+ C
6
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
7
+ C * *
8
+ C * copyright (c) 1999 by UCAR *
9
+ C * *
10
+ C * UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH *
11
+ C * *
12
+ C * all rights reserved *
13
+ C * *
14
+ C * FISHPACK version 4.1 *
15
+ C * *
16
+ C * A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF *
17
+ C * *
18
+ C * SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS *
19
+ C * *
20
+ C * BY *
21
+ C * *
22
+ C * JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET *
23
+ C * *
24
+ C * OF *
25
+ C * *
26
+ C * THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH *
27
+ C * *
28
+ C * BOULDER, COLORADO (80307) U.S.A. *
29
+ C * *
30
+ C * WHICH IS SPONSORED BY *
31
+ C * *
32
+ C * THE NATIONAL SCIENCE FOUNDATION *
33
+ C * *
34
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
35
+ C
36
+ C
37
+ C
38
+ C DIMENSION OF A(M),B(M),C(M),Y(IDIMY,N),
39
+ C W(SEE PARAMETER LIST)
40
+ C ARGUMENTS
41
+ C
42
+ C LATEST REVISION NOVEMBER 1988
43
+ C
44
+ C PURPOSE THE NAME OF THIS PACKAGE IS A MNEMONIC FOR THE
45
+ C GENERALIZED BUNEMAN ALGORITHM.
46
+ C
47
+ C IT SOLVES THE REAL LINEAR SYSTEM OF EQUATIONS
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 GENBUN (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 ARRAYS OF LENGTH M THAT
92
+ C 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 GENBUN.
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 ARRAY THAT MUST
122
+ C 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 GENBUN 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 GNBNAUX FROM FISHPACK
161
+ C FILES
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.
172
+ C
173
+ C PORTABILITY FORTRAN 77 --
174
+ C THE MACHINE DEPENDENT CONSTANT PI IS
175
+ C DEFINED IN FUNCTION PIMACH.
176
+ C
177
+ C REFERENCES SWEET, R., "A CYCLIC REDUCTION ALGORITHM FOR
178
+ C SOLVING BLOCK TRIDIAGONAL SYSTEMS OF ARBITRARY
179
+ C DIMENSIONS," SIAM J. ON NUMER. ANAL., 14 (1977)
180
+ C PP. 706-720.
181
+ C
182
+ C ACCURACY THIS TEST WAS PERFORMED ON A CDC 7600:
183
+ C
184
+ C A UNIFORM RANDOM NUMBER GENERATOR WAS USED
185
+ C TO CREATE A SOLUTION ARRAY X FOR THE SYSTEM
186
+ C GIVEN IN THE 'PURPOSE' DESCRIPTION ABOVE
187
+ C WITH
188
+ C A(I) = C(I) = -0.5*B(I) = 1, I=1,2,...,M
189
+ C
190
+ C AND, WHEN MPEROD = 1
191
+ C
192
+ C A(1) = C(M) = 0
193
+ C A(M) = C(1) = 2.
194
+ C
195
+ C THE SOLUTION X WAS SUBSTITUTED INTO THE
196
+ C GIVEN SYSTEM AND, USING DOUBLE PRECISION
197
+ C A RIGHT SIDE Y WAS COMPUTED.
198
+ C USING THIS ARRAY Y, SUBROUTINE GENBUN
199
+ C WAS CALLED TO PRODUCE APPROXIMATE
200
+ C SOLUTION Z. THEN RELATIVE ERROR
201
+ C E = MAX(ABS(Z(I,J)-X(I,J)))/
202
+ C MAX(ABS(X(I,J)))
203
+ C WAS COMPUTED, WHERE THE TWO MAXIMA ARE TAKEN
204
+ C OVER I=1,2,...,M AND J=1,...,N.
205
+ C
206
+ C THE VALUE OF E IS GIVEN IN THE TABLE
207
+ C BELOW FOR SOME TYPICAL VALUES OF M AND N.
208
+ C
209
+ C M (=N) MPEROD NPEROD T(MSECS) E
210
+ C ------ ------ ------ -------- ------
211
+ C
212
+ C 31 0 0 36 6.E-14
213
+ C 31 1 1 21 4.E-13
214
+ C 31 1 3 41 3.E-13
215
+ C 32 0 0 29 9.E-14
216
+ C 32 1 1 32 3.E-13
217
+ C 32 1 3 48 1.E-13
218
+ C 33 0 0 36 9.E-14
219
+ C 33 1 1 30 4.E-13
220
+ C 33 1 3 34 1.E-13
221
+ C 63 0 0 150 1.E-13
222
+ C 63 1 1 91 1.E-12
223
+ C 63 1 3 173 2.E-13
224
+ C 64 0 0 122 1.E-13
225
+ C 64 1 1 128 1.E-12
226
+ C 64 1 3 199 6.E-13
227
+ C 65 0 0 143 2.E-13
228
+ C 65 1 1 120 1.E-12
229
+ C 65 1 3 138 4.E-13
230
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
231
+ DIMENSION Y(IDIMY,1)
232
+ DIMENSION W(*) ,B(*) ,A(*) ,C(*)
233
+ C
234
+ IERROR = 0
235
+ IF (M .LE. 2) IERROR = 1
236
+ IF (N .LE. 2) IERROR = 2
237
+ IF (IDIMY .LT. M) IERROR = 3
238
+ IF (NPEROD.LT.0 .OR. NPEROD.GT.4) IERROR = 4
239
+ IF (MPEROD.LT.0 .OR. MPEROD.GT.1) IERROR = 5
240
+ IF (MPEROD .EQ. 1) GO TO 102
241
+ DO 101 I=2,M
242
+ IF (A(I) .NE. C(1)) GO TO 103
243
+ IF (C(I) .NE. C(1)) GO TO 103
244
+ IF (B(I) .NE. B(1)) GO TO 103
245
+ 101 CONTINUE
246
+ GO TO 104
247
+ 102 IF (A(1).NE.0. .OR. C(M).NE.0.) IERROR = 7
248
+ GO TO 104
249
+ 103 IERROR = 6
250
+ 104 IF (IERROR .NE. 0) RETURN
251
+ MP1 = M+1
252
+ IWBA = MP1
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 POISP2 (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 POISD2 (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 POISN2 (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 POISN2 (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 = 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.
322
+ W(I) = 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) = IPSTOR+IWP-1
368
+ RETURN
369
+ END
370
+ SUBROUTINE POISD2 (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
+ DIMENSION Q(IDIMQ,1) ,BA(*) ,BB(*) ,BC(*) ,
379
+ 1 TCOS(*) ,B(*) ,D(*) ,W(*) ,
380
+ 2 P(*)
381
+ M = MR
382
+ N = NR
383
+ JSH = 0
384
+ FI = 1./FLOAT(ISTAG)
385
+ IP = -M
386
+ IPSTOR = 0
387
+ GO TO (101,102),ISTAG
388
+ 101 KR = 0
389
+ IRREG = 1
390
+ IF (N .GT. 1) GO TO 106
391
+ TCOS(1) = 0.
392
+ GO TO 103
393
+ 102 KR = 1
394
+ JSTSAV = 1
395
+ IRREG = 2
396
+ IF (N .GT. 1) GO TO 106
397
+ TCOS(1) = -1.
398
+ 103 DO 104 I=1,M
399
+ B(I) = Q(I,1)
400
+ 104 CONTINUE
401
+ CALL TRIX (1,0,M,BA,BB,BC,B,TCOS,D,W)
402
+ DO 105 I=1,M
403
+ Q(I,1) = B(I)
404
+ 105 CONTINUE
405
+ GO TO 183
406
+ 106 LR = 0
407
+ DO 107 I=1,M
408
+ P(I) = 0.
409
+ 107 CONTINUE
410
+ NUN = N
411
+ JST = 1
412
+ JSP = N
413
+ C
414
+ C IRREG = 1 WHEN NO IRREGULARITIES HAVE OCCURRED, OTHERWISE IT IS 2.
415
+ C
416
+ 108 L = 2*JST
417
+ NODD = 2-2*((NUN+1)/2)+NUN
418
+ C
419
+ C NODD = 1 WHEN NUN IS ODD, OTHERWISE IT IS 2.
420
+ C
421
+ GO TO (110,109),NODD
422
+ 109 JSP = JSP-L
423
+ GO TO 111
424
+ 110 JSP = JSP-JST
425
+ IF (IRREG .NE. 1) JSP = JSP-L
426
+ 111 CONTINUE
427
+ C
428
+ C REGULAR REDUCTION
429
+ C
430
+ CALL COSGEN (JST,1,0.5,0.0,TCOS)
431
+ IF (L .GT. JSP) GO TO 118
432
+ DO 117 J=L,JSP,L
433
+ JM1 = J-JSH
434
+ JP1 = J+JSH
435
+ JM2 = J-JST
436
+ JP2 = J+JST
437
+ JM3 = JM2-JSH
438
+ JP3 = JP2+JSH
439
+ IF (JST .NE. 1) GO TO 113
440
+ DO 112 I=1,M
441
+ B(I) = 2.*Q(I,J)
442
+ Q(I,J) = Q(I,JM2)+Q(I,JP2)
443
+ 112 CONTINUE
444
+ GO TO 115
445
+ 113 DO 114 I=1,M
446
+ T = Q(I,J)-Q(I,JM1)-Q(I,JP1)+Q(I,JM2)+Q(I,JP2)
447
+ B(I) = T+Q(I,J)-Q(I,JM3)-Q(I,JP3)
448
+ Q(I,J) = T
449
+ 114 CONTINUE
450
+ 115 CONTINUE
451
+ CALL TRIX (JST,0,M,BA,BB,BC,B,TCOS,D,W)
452
+ DO 116 I=1,M
453
+ Q(I,J) = Q(I,J)+B(I)
454
+ 116 CONTINUE
455
+ 117 CONTINUE
456
+ C
457
+ C REDUCTION FOR LAST UNKNOWN
458
+ C
459
+ 118 GO TO (119,136),NODD
460
+ 119 GO TO (152,120),IRREG
461
+ C
462
+ C ODD NUMBER OF UNKNOWNS
463
+ C
464
+ 120 JSP = JSP+L
465
+ J = JSP
466
+ JM1 = J-JSH
467
+ JP1 = J+JSH
468
+ JM2 = J-JST
469
+ JP2 = J+JST
470
+ JM3 = JM2-JSH
471
+ GO TO (123,121),ISTAG
472
+ 121 CONTINUE
473
+ IF (JST .NE. 1) GO TO 123
474
+ DO 122 I=1,M
475
+ B(I) = Q(I,J)
476
+ Q(I,J) = 0.
477
+ 122 CONTINUE
478
+ GO TO 130
479
+ 123 GO TO (124,126),NODDPR
480
+ 124 DO 125 I=1,M
481
+ IP1 = IP+I
482
+ B(I) = .5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))+P(IP1)+Q(I,J)
483
+ 125 CONTINUE
484
+ GO TO 128
485
+ 126 DO 127 I=1,M
486
+ B(I) = .5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))+Q(I,JP2)-Q(I,JP1)+Q(I,J)
487
+ 127 CONTINUE
488
+ 128 DO 129 I=1,M
489
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
490
+ 129 CONTINUE
491
+ 130 CALL TRIX (JST,0,M,BA,BB,BC,B,TCOS,D,W)
492
+ IP = IP+M
493
+ IPSTOR = MAX0(IPSTOR,IP+M)
494
+ DO 131 I=1,M
495
+ IP1 = IP+I
496
+ P(IP1) = Q(I,J)+B(I)
497
+ B(I) = Q(I,JP2)+P(IP1)
498
+ 131 CONTINUE
499
+ IF (LR .NE. 0) GO TO 133
500
+ DO 132 I=1,JST
501
+ KRPI = KR+I
502
+ TCOS(KRPI) = TCOS(I)
503
+ 132 CONTINUE
504
+ GO TO 134
505
+ 133 CONTINUE
506
+ CALL COSGEN (LR,JSTSAV,0.,FI,TCOS(JST+1))
507
+ CALL MERGE (TCOS,0,JST,JST,LR,KR)
508
+ 134 CONTINUE
509
+ CALL COSGEN (KR,JSTSAV,0.0,FI,TCOS)
510
+ CALL TRIX (KR,KR,M,BA,BB,BC,B,TCOS,D,W)
511
+ DO 135 I=1,M
512
+ IP1 = IP+I
513
+ Q(I,J) = Q(I,JM2)+B(I)+P(IP1)
514
+ 135 CONTINUE
515
+ LR = KR
516
+ KR = KR+L
517
+ GO TO 152
518
+ C
519
+ C EVEN NUMBER OF UNKNOWNS
520
+ C
521
+ 136 JSP = JSP+L
522
+ J = JSP
523
+ JM1 = J-JSH
524
+ JP1 = J+JSH
525
+ JM2 = J-JST
526
+ JP2 = J+JST
527
+ JM3 = JM2-JSH
528
+ GO TO (137,138),IRREG
529
+ 137 CONTINUE
530
+ JSTSAV = JST
531
+ IDEG = JST
532
+ KR = L
533
+ GO TO 139
534
+ 138 CALL COSGEN (KR,JSTSAV,0.0,FI,TCOS)
535
+ CALL COSGEN (LR,JSTSAV,0.0,FI,TCOS(KR+1))
536
+ IDEG = KR
537
+ KR = KR+JST
538
+ 139 IF (JST .NE. 1) GO TO 141
539
+ IRREG = 2
540
+ DO 140 I=1,M
541
+ B(I) = Q(I,J)
542
+ Q(I,J) = Q(I,JM2)
543
+ 140 CONTINUE
544
+ GO TO 150
545
+ 141 DO 142 I=1,M
546
+ B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
547
+ 142 CONTINUE
548
+ GO TO (143,145),IRREG
549
+ 143 DO 144 I=1,M
550
+ Q(I,J) = Q(I,JM2)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
551
+ 144 CONTINUE
552
+ IRREG = 2
553
+ GO TO 150
554
+ 145 CONTINUE
555
+ GO TO (146,148),NODDPR
556
+ 146 DO 147 I=1,M
557
+ IP1 = IP+I
558
+ Q(I,J) = Q(I,JM2)+P(IP1)
559
+ 147 CONTINUE
560
+ IP = IP-M
561
+ GO TO 150
562
+ 148 DO 149 I=1,M
563
+ Q(I,J) = Q(I,JM2)+Q(I,J)-Q(I,JM1)
564
+ 149 CONTINUE
565
+ 150 CALL TRIX (IDEG,LR,M,BA,BB,BC,B,TCOS,D,W)
566
+ DO 151 I=1,M
567
+ Q(I,J) = Q(I,J)+B(I)
568
+ 151 CONTINUE
569
+ 152 NUN = NUN/2
570
+ NODDPR = NODD
571
+ JSH = JST
572
+ JST = 2*JST
573
+ IF (NUN .GE. 2) GO TO 108
574
+ C
575
+ C START SOLUTION.
576
+ C
577
+ J = JSP
578
+ DO 153 I=1,M
579
+ B(I) = Q(I,J)
580
+ 153 CONTINUE
581
+ GO TO (154,155),IRREG
582
+ 154 CONTINUE
583
+ CALL COSGEN (JST,1,0.5,0.0,TCOS)
584
+ IDEG = JST
585
+ GO TO 156
586
+ 155 KR = LR+JST
587
+ CALL COSGEN (KR,JSTSAV,0.0,FI,TCOS)
588
+ CALL COSGEN (LR,JSTSAV,0.0,FI,TCOS(KR+1))
589
+ IDEG = KR
590
+ 156 CONTINUE
591
+ CALL TRIX (IDEG,LR,M,BA,BB,BC,B,TCOS,D,W)
592
+ JM1 = J-JSH
593
+ JP1 = J+JSH
594
+ GO TO (157,159),IRREG
595
+ 157 DO 158 I=1,M
596
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
597
+ 158 CONTINUE
598
+ GO TO 164
599
+ 159 GO TO (160,162),NODDPR
600
+ 160 DO 161 I=1,M
601
+ IP1 = IP+I
602
+ Q(I,J) = P(IP1)+B(I)
603
+ 161 CONTINUE
604
+ IP = IP-M
605
+ GO TO 164
606
+ 162 DO 163 I=1,M
607
+ Q(I,J) = Q(I,J)-Q(I,JM1)+B(I)
608
+ 163 CONTINUE
609
+ 164 CONTINUE
610
+ C
611
+ C START BACK SUBSTITUTION.
612
+ C
613
+ JST = JST/2
614
+ JSH = JST/2
615
+ NUN = 2*NUN
616
+ IF (NUN .GT. N) GO TO 183
617
+ DO 182 J=JST,N,L
618
+ JM1 = J-JSH
619
+ JP1 = J+JSH
620
+ JM2 = J-JST
621
+ JP2 = J+JST
622
+ IF (J .GT. JST) GO TO 166
623
+ DO 165 I=1,M
624
+ B(I) = Q(I,J)+Q(I,JP2)
625
+ 165 CONTINUE
626
+ GO TO 170
627
+ 166 IF (JP2 .LE. N) GO TO 168
628
+ DO 167 I=1,M
629
+ B(I) = Q(I,J)+Q(I,JM2)
630
+ 167 CONTINUE
631
+ IF (JST .LT. JSTSAV) IRREG = 1
632
+ GO TO (170,171),IRREG
633
+ 168 DO 169 I=1,M
634
+ B(I) = Q(I,J)+Q(I,JM2)+Q(I,JP2)
635
+ 169 CONTINUE
636
+ 170 CONTINUE
637
+ CALL COSGEN (JST,1,0.5,0.0,TCOS)
638
+ IDEG = JST
639
+ JDEG = 0
640
+ GO TO 172
641
+ 171 IF (J+L .GT. N) LR = LR-JST
642
+ KR = JST+LR
643
+ CALL COSGEN (KR,JSTSAV,0.0,FI,TCOS)
644
+ CALL COSGEN (LR,JSTSAV,0.0,FI,TCOS(KR+1))
645
+ IDEG = KR
646
+ JDEG = LR
647
+ 172 CONTINUE
648
+ CALL TRIX (IDEG,JDEG,M,BA,BB,BC,B,TCOS,D,W)
649
+ IF (JST .GT. 1) GO TO 174
650
+ DO 173 I=1,M
651
+ Q(I,J) = B(I)
652
+ 173 CONTINUE
653
+ GO TO 182
654
+ 174 IF (JP2 .GT. N) GO TO 177
655
+ 175 DO 176 I=1,M
656
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
657
+ 176 CONTINUE
658
+ GO TO 182
659
+ 177 GO TO (175,178),IRREG
660
+ 178 IF (J+JSH .GT. N) GO TO 180
661
+ DO 179 I=1,M
662
+ IP1 = IP+I
663
+ Q(I,J) = B(I)+P(IP1)
664
+ 179 CONTINUE
665
+ IP = IP-M
666
+ GO TO 182
667
+ 180 DO 181 I=1,M
668
+ Q(I,J) = B(I)+Q(I,J)-Q(I,JM1)
669
+ 181 CONTINUE
670
+ 182 CONTINUE
671
+ L = L/2
672
+ GO TO 164
673
+ 183 CONTINUE
674
+ C
675
+ C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
676
+ C
677
+ W(1) = IPSTOR
678
+ RETURN
679
+ END
680
+ SUBROUTINE POISN2 (M,N,ISTAG,MIXBND,A,BB,C,Q,IDIMQ,B,B2,B3,W,W2,
681
+ 1 W3,D,TCOS,P)
682
+ C
683
+ C SUBROUTINE TO SOLVE POISSON'S EQUATION WITH NEUMANN BOUNDARY
684
+ C CONDITIONS.
685
+ C
686
+ C ISTAG = 1 IF THE LAST DIAGONAL BLOCK IS A.
687
+ C ISTAG = 2 IF THE LAST DIAGONAL BLOCK IS A-I.
688
+ C MIXBND = 1 IF HAVE NEUMANN BOUNDARY CONDITIONS AT BOTH BOUNDARIES.
689
+ C MIXBND = 2 IF HAVE NEUMANN BOUNDARY CONDITIONS AT BOTTOM AND
690
+ C DIRICHLET CONDITION AT TOP. (FOR THIS CASE, MUST HAVE ISTAG = 1.)
691
+ C
692
+ DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,*) ,
693
+ 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
694
+ 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
695
+ 3 K(4) ,P(*)
696
+ EQUIVALENCE (K(1),K1) ,(K(2),K2) ,(K(3),K3) ,(K(4),K4)
697
+ FISTAG = 3-ISTAG
698
+ FNUM = 1./FLOAT(ISTAG)
699
+ FDEN = 0.5*FLOAT(ISTAG-1)
700
+ MR = M
701
+ IP = -MR
702
+ IPSTOR = 0
703
+ I2R = 1
704
+ JR = 2
705
+ NR = N
706
+ NLAST = N
707
+ KR = 1
708
+ LR = 0
709
+ GO TO (101,103),ISTAG
710
+ 101 CONTINUE
711
+ DO 102 I=1,MR
712
+ Q(I,N) = .5*Q(I,N)
713
+ 102 CONTINUE
714
+ GO TO (103,104),MIXBND
715
+ 103 IF (N .LE. 3) GO TO 155
716
+ 104 CONTINUE
717
+ JR = 2*I2R
718
+ NROD = 1
719
+ IF ((NR/2)*2 .EQ. NR) NROD = 0
720
+ GO TO (105,106),MIXBND
721
+ 105 JSTART = 1
722
+ GO TO 107
723
+ 106 JSTART = JR
724
+ NROD = 1-NROD
725
+ 107 CONTINUE
726
+ JSTOP = NLAST-JR
727
+ IF (NROD .EQ. 0) JSTOP = JSTOP-I2R
728
+ CALL COSGEN (I2R,1,0.5,0.0,TCOS)
729
+ I2RBY2 = I2R/2
730
+ IF (JSTOP .GE. JSTART) GO TO 108
731
+ J = JR
732
+ GO TO 116
733
+ 108 CONTINUE
734
+ C
735
+ C REGULAR REDUCTION.
736
+ C
737
+ DO 115 J=JSTART,JSTOP,JR
738
+ JP1 = J+I2RBY2
739
+ JP2 = J+I2R
740
+ JP3 = JP2+I2RBY2
741
+ JM1 = J-I2RBY2
742
+ JM2 = J-I2R
743
+ JM3 = JM2-I2RBY2
744
+ IF (J .NE. 1) GO TO 109
745
+ JM1 = JP1
746
+ JM2 = JP2
747
+ JM3 = JP3
748
+ 109 CONTINUE
749
+ IF (I2R .NE. 1) GO TO 111
750
+ IF (J .EQ. 1) JM2 = JP2
751
+ DO 110 I=1,MR
752
+ B(I) = 2.*Q(I,J)
753
+ Q(I,J) = Q(I,JM2)+Q(I,JP2)
754
+ 110 CONTINUE
755
+ GO TO 113
756
+ 111 CONTINUE
757
+ DO 112 I=1,MR
758
+ FI = Q(I,J)
759
+ Q(I,J) = Q(I,J)-Q(I,JM1)-Q(I,JP1)+Q(I,JM2)+Q(I,JP2)
760
+ B(I) = FI+Q(I,J)-Q(I,JM3)-Q(I,JP3)
761
+ 112 CONTINUE
762
+ 113 CONTINUE
763
+ CALL TRIX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
764
+ DO 114 I=1,MR
765
+ Q(I,J) = Q(I,J)+B(I)
766
+ 114 CONTINUE
767
+ C
768
+ C END OF REDUCTION FOR REGULAR UNKNOWNS.
769
+ C
770
+ 115 CONTINUE
771
+ C
772
+ C BEGIN SPECIAL REDUCTION FOR LAST UNKNOWN.
773
+ C
774
+ J = JSTOP+JR
775
+ 116 NLAST = J
776
+ JM1 = J-I2RBY2
777
+ JM2 = J-I2R
778
+ JM3 = JM2-I2RBY2
779
+ IF (NROD .EQ. 0) GO TO 128
780
+ C
781
+ C ODD NUMBER OF UNKNOWNS
782
+ C
783
+ IF (I2R .NE. 1) GO TO 118
784
+ DO 117 I=1,MR
785
+ B(I) = FISTAG*Q(I,J)
786
+ Q(I,J) = Q(I,JM2)
787
+ 117 CONTINUE
788
+ GO TO 126
789
+ 118 DO 119 I=1,MR
790
+ B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
791
+ 119 CONTINUE
792
+ IF (NRODPR .NE. 0) GO TO 121
793
+ DO 120 I=1,MR
794
+ II = IP+I
795
+ Q(I,J) = Q(I,JM2)+P(II)
796
+ 120 CONTINUE
797
+ IP = IP-MR
798
+ GO TO 123
799
+ 121 CONTINUE
800
+ DO 122 I=1,MR
801
+ Q(I,J) = Q(I,J)-Q(I,JM1)+Q(I,JM2)
802
+ 122 CONTINUE
803
+ 123 IF (LR .EQ. 0) GO TO 124
804
+ CALL COSGEN (LR,1,0.5,FDEN,TCOS(KR+1))
805
+ GO TO 126
806
+ 124 CONTINUE
807
+ DO 125 I=1,MR
808
+ B(I) = FISTAG*B(I)
809
+ 125 CONTINUE
810
+ 126 CONTINUE
811
+ CALL COSGEN (KR,1,0.5,FDEN,TCOS)
812
+ CALL TRIX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
813
+ DO 127 I=1,MR
814
+ Q(I,J) = Q(I,J)+B(I)
815
+ 127 CONTINUE
816
+ KR = KR+I2R
817
+ GO TO 151
818
+ 128 CONTINUE
819
+ C
820
+ C EVEN NUMBER OF UNKNOWNS
821
+ C
822
+ JP1 = J+I2RBY2
823
+ JP2 = J+I2R
824
+ IF (I2R .NE. 1) GO TO 135
825
+ DO 129 I=1,MR
826
+ B(I) = Q(I,J)
827
+ 129 CONTINUE
828
+ CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
829
+ IP = 0
830
+ IPSTOR = MR
831
+ GO TO (133,130),ISTAG
832
+ 130 DO 131 I=1,MR
833
+ P(I) = B(I)
834
+ B(I) = B(I)+Q(I,N)
835
+ 131 CONTINUE
836
+ TCOS(1) = 1.
837
+ TCOS(2) = 0.
838
+ CALL TRIX (1,1,MR,A,BB,C,B,TCOS,D,W)
839
+ DO 132 I=1,MR
840
+ Q(I,J) = Q(I,JM2)+P(I)+B(I)
841
+ 132 CONTINUE
842
+ GO TO 150
843
+ 133 CONTINUE
844
+ DO 134 I=1,MR
845
+ P(I) = B(I)
846
+ Q(I,J) = Q(I,JM2)+2.*Q(I,JP2)+3.*B(I)
847
+ 134 CONTINUE
848
+ GO TO 150
849
+ 135 CONTINUE
850
+ DO 136 I=1,MR
851
+ B(I) = Q(I,J)+.5*(Q(I,JM2)-Q(I,JM1)-Q(I,JM3))
852
+ 136 CONTINUE
853
+ IF (NRODPR .NE. 0) GO TO 138
854
+ DO 137 I=1,MR
855
+ II = IP+I
856
+ B(I) = B(I)+P(II)
857
+ 137 CONTINUE
858
+ GO TO 140
859
+ 138 CONTINUE
860
+ DO 139 I=1,MR
861
+ B(I) = B(I)+Q(I,JP2)-Q(I,JP1)
862
+ 139 CONTINUE
863
+ 140 CONTINUE
864
+ CALL TRIX (I2R,0,MR,A,BB,C,B,TCOS,D,W)
865
+ IP = IP+MR
866
+ IPSTOR = MAX0(IPSTOR,IP+MR)
867
+ DO 141 I=1,MR
868
+ II = IP+I
869
+ P(II) = B(I)+.5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
870
+ B(I) = P(II)+Q(I,JP2)
871
+ 141 CONTINUE
872
+ IF (LR .EQ. 0) GO TO 142
873
+ CALL COSGEN (LR,1,0.5,FDEN,TCOS(I2R+1))
874
+ CALL MERGE (TCOS,0,I2R,I2R,LR,KR)
875
+ GO TO 144
876
+ 142 DO 143 I=1,I2R
877
+ II = KR+I
878
+ TCOS(II) = TCOS(I)
879
+ 143 CONTINUE
880
+ 144 CALL COSGEN (KR,1,0.5,FDEN,TCOS)
881
+ IF (LR .NE. 0) GO TO 145
882
+ GO TO (146,145),ISTAG
883
+ 145 CONTINUE
884
+ CALL TRIX (KR,KR,MR,A,BB,C,B,TCOS,D,W)
885
+ GO TO 148
886
+ 146 CONTINUE
887
+ DO 147 I=1,MR
888
+ B(I) = FISTAG*B(I)
889
+ 147 CONTINUE
890
+ 148 CONTINUE
891
+ DO 149 I=1,MR
892
+ II = IP+I
893
+ Q(I,J) = Q(I,JM2)+P(II)+B(I)
894
+ 149 CONTINUE
895
+ 150 CONTINUE
896
+ LR = KR
897
+ KR = KR+JR
898
+ 151 CONTINUE
899
+ GO TO (152,153),MIXBND
900
+ 152 NR = (NLAST-1)/JR+1
901
+ IF (NR .LE. 3) GO TO 155
902
+ GO TO 154
903
+ 153 NR = NLAST/JR
904
+ IF (NR .LE. 1) GO TO 192
905
+ 154 I2R = JR
906
+ NRODPR = NROD
907
+ GO TO 104
908
+ 155 CONTINUE
909
+ C
910
+ C BEGIN SOLUTION
911
+ C
912
+ J = 1+JR
913
+ JM1 = J-I2R
914
+ JP1 = J+I2R
915
+ JM2 = NLAST-I2R
916
+ IF (NR .EQ. 2) GO TO 184
917
+ IF (LR .NE. 0) GO TO 170
918
+ IF (N .NE. 3) GO TO 161
919
+ C
920
+ C CASE N = 3.
921
+ C
922
+ GO TO (156,168),ISTAG
923
+ 156 CONTINUE
924
+ DO 157 I=1,MR
925
+ B(I) = Q(I,2)
926
+ 157 CONTINUE
927
+ TCOS(1) = 0.
928
+ CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
929
+ DO 158 I=1,MR
930
+ Q(I,2) = B(I)
931
+ B(I) = 4.*B(I)+Q(I,1)+2.*Q(I,3)
932
+ 158 CONTINUE
933
+ TCOS(1) = -2.
934
+ TCOS(2) = 2.
935
+ I1 = 2
936
+ I2 = 0
937
+ CALL TRIX (I1,I2,MR,A,BB,C,B,TCOS,D,W)
938
+ DO 159 I=1,MR
939
+ Q(I,2) = Q(I,2)+B(I)
940
+ B(I) = Q(I,1)+2.*Q(I,2)
941
+ 159 CONTINUE
942
+ TCOS(1) = 0.
943
+ CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
944
+ DO 160 I=1,MR
945
+ Q(I,1) = B(I)
946
+ 160 CONTINUE
947
+ JR = 1
948
+ I2R = 0
949
+ GO TO 194
950
+ C
951
+ C CASE N = 2**P+1
952
+ C
953
+ 161 CONTINUE
954
+ GO TO (162,170),ISTAG
955
+ 162 CONTINUE
956
+ DO 163 I=1,MR
957
+ B(I) = Q(I,J)+.5*Q(I,1)-Q(I,JM1)+Q(I,NLAST)-Q(I,JM2)
958
+ 163 CONTINUE
959
+ CALL COSGEN (JR,1,0.5,0.0,TCOS)
960
+ CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
961
+ DO 164 I=1,MR
962
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))+B(I)
963
+ B(I) = Q(I,1)+2.*Q(I,NLAST)+4.*Q(I,J)
964
+ 164 CONTINUE
965
+ JR2 = 2*JR
966
+ CALL COSGEN (JR,1,0.0,0.0,TCOS)
967
+ DO 165 I=1,JR
968
+ I1 = JR+I
969
+ I2 = JR+1-I
970
+ TCOS(I1) = -TCOS(I2)
971
+ 165 CONTINUE
972
+ CALL TRIX (JR2,0,MR,A,BB,C,B,TCOS,D,W)
973
+ DO 166 I=1,MR
974
+ Q(I,J) = Q(I,J)+B(I)
975
+ B(I) = Q(I,1)+2.*Q(I,J)
976
+ 166 CONTINUE
977
+ CALL COSGEN (JR,1,0.5,0.0,TCOS)
978
+ CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
979
+ DO 167 I=1,MR
980
+ Q(I,1) = .5*Q(I,1)-Q(I,JM1)+B(I)
981
+ 167 CONTINUE
982
+ GO TO 194
983
+ C
984
+ C CASE OF GENERAL N WITH NR = 3 .
985
+ C
986
+ 168 DO 169 I=1,MR
987
+ B(I) = Q(I,2)
988
+ Q(I,2) = 0.
989
+ B2(I) = Q(I,3)
990
+ B3(I) = Q(I,1)
991
+ 169 CONTINUE
992
+ JR = 1
993
+ I2R = 0
994
+ J = 2
995
+ GO TO 177
996
+ 170 CONTINUE
997
+ DO 171 I=1,MR
998
+ B(I) = .5*Q(I,1)-Q(I,JM1)+Q(I,J)
999
+ 171 CONTINUE
1000
+ IF (NROD .NE. 0) GO TO 173
1001
+ DO 172 I=1,MR
1002
+ II = IP+I
1003
+ B(I) = B(I)+P(II)
1004
+ 172 CONTINUE
1005
+ GO TO 175
1006
+ 173 DO 174 I=1,MR
1007
+ B(I) = B(I)+Q(I,NLAST)-Q(I,JM2)
1008
+ 174 CONTINUE
1009
+ 175 CONTINUE
1010
+ DO 176 I=1,MR
1011
+ T = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
1012
+ Q(I,J) = T
1013
+ B2(I) = Q(I,NLAST)+T
1014
+ B3(I) = Q(I,1)+2.*T
1015
+ 176 CONTINUE
1016
+ 177 CONTINUE
1017
+ K1 = KR+2*JR-1
1018
+ K2 = KR+JR
1019
+ TCOS(K1+1) = -2.
1020
+ K4 = K1+3-ISTAG
1021
+ CALL COSGEN (K2+ISTAG-2,1,0.0,FNUM,TCOS(K4))
1022
+ K4 = K1+K2+1
1023
+ CALL COSGEN (JR-1,1,0.0,1.0,TCOS(K4))
1024
+ CALL MERGE (TCOS,K1,K2,K1+K2,JR-1,0)
1025
+ K3 = K1+K2+LR
1026
+ CALL COSGEN (JR,1,0.5,0.0,TCOS(K3+1))
1027
+ K4 = K3+JR+1
1028
+ CALL COSGEN (KR,1,0.5,FDEN,TCOS(K4))
1029
+ CALL MERGE (TCOS,K3,JR,K3+JR,KR,K1)
1030
+ IF (LR .EQ. 0) GO TO 178
1031
+ CALL COSGEN (LR,1,0.5,FDEN,TCOS(K4))
1032
+ CALL MERGE (TCOS,K3,JR,K3+JR,LR,K3-LR)
1033
+ CALL COSGEN (KR,1,0.5,FDEN,TCOS(K4))
1034
+ 178 K3 = KR
1035
+ K4 = KR
1036
+ CALL TRI3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
1037
+ DO 179 I=1,MR
1038
+ B(I) = B(I)+B2(I)+B3(I)
1039
+ 179 CONTINUE
1040
+ TCOS(1) = 2.
1041
+ CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
1042
+ DO 180 I=1,MR
1043
+ Q(I,J) = Q(I,J)+B(I)
1044
+ B(I) = Q(I,1)+2.*Q(I,J)
1045
+ 180 CONTINUE
1046
+ CALL COSGEN (JR,1,0.5,0.0,TCOS)
1047
+ CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
1048
+ IF (JR .NE. 1) GO TO 182
1049
+ DO 181 I=1,MR
1050
+ Q(I,1) = B(I)
1051
+ 181 CONTINUE
1052
+ GO TO 194
1053
+ 182 CONTINUE
1054
+ DO 183 I=1,MR
1055
+ Q(I,1) = .5*Q(I,1)-Q(I,JM1)+B(I)
1056
+ 183 CONTINUE
1057
+ GO TO 194
1058
+ 184 CONTINUE
1059
+ IF (N .NE. 2) GO TO 188
1060
+ C
1061
+ C CASE N = 2
1062
+ C
1063
+ DO 185 I=1,MR
1064
+ B(I) = Q(I,1)
1065
+ 185 CONTINUE
1066
+ TCOS(1) = 0.
1067
+ CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
1068
+ DO 186 I=1,MR
1069
+ Q(I,1) = B(I)
1070
+ B(I) = 2.*(Q(I,2)+B(I))*FISTAG
1071
+ 186 CONTINUE
1072
+ TCOS(1) = -FISTAG
1073
+ TCOS(2) = 2.
1074
+ CALL TRIX (2,0,MR,A,BB,C,B,TCOS,D,W)
1075
+ DO 187 I=1,MR
1076
+ Q(I,1) = Q(I,1)+B(I)
1077
+ 187 CONTINUE
1078
+ JR = 1
1079
+ I2R = 0
1080
+ GO TO 194
1081
+ 188 CONTINUE
1082
+ C
1083
+ C CASE OF GENERAL N AND NR = 2 .
1084
+ C
1085
+ DO 189 I=1,MR
1086
+ II = IP+I
1087
+ B3(I) = 0.
1088
+ B(I) = Q(I,1)+2.*P(II)
1089
+ Q(I,1) = .5*Q(I,1)-Q(I,JM1)
1090
+ B2(I) = 2.*(Q(I,1)+Q(I,NLAST))
1091
+ 189 CONTINUE
1092
+ K1 = KR+JR-1
1093
+ TCOS(K1+1) = -2.
1094
+ K4 = K1+3-ISTAG
1095
+ CALL COSGEN (KR+ISTAG-2,1,0.0,FNUM,TCOS(K4))
1096
+ K4 = K1+KR+1
1097
+ CALL COSGEN (JR-1,1,0.0,1.0,TCOS(K4))
1098
+ CALL MERGE (TCOS,K1,KR,K1+KR,JR-1,0)
1099
+ CALL COSGEN (KR,1,0.5,FDEN,TCOS(K1+1))
1100
+ K2 = KR
1101
+ K4 = K1+K2+1
1102
+ CALL COSGEN (LR,1,0.5,FDEN,TCOS(K4))
1103
+ K3 = LR
1104
+ K4 = 0
1105
+ CALL TRI3 (MR,A,BB,C,K,B,B2,B3,TCOS,D,W,W2,W3)
1106
+ DO 190 I=1,MR
1107
+ B(I) = B(I)+B2(I)
1108
+ 190 CONTINUE
1109
+ TCOS(1) = 2.
1110
+ CALL TRIX (1,0,MR,A,BB,C,B,TCOS,D,W)
1111
+ DO 191 I=1,MR
1112
+ Q(I,1) = Q(I,1)+B(I)
1113
+ 191 CONTINUE
1114
+ GO TO 194
1115
+ 192 DO 193 I=1,MR
1116
+ B(I) = Q(I,NLAST)
1117
+ 193 CONTINUE
1118
+ GO TO 196
1119
+ 194 CONTINUE
1120
+ C
1121
+ C START BACK SUBSTITUTION.
1122
+ C
1123
+ J = NLAST-JR
1124
+ DO 195 I=1,MR
1125
+ B(I) = Q(I,NLAST)+Q(I,J)
1126
+ 195 CONTINUE
1127
+ 196 JM2 = NLAST-I2R
1128
+ IF (JR .NE. 1) GO TO 198
1129
+ DO 197 I=1,MR
1130
+ Q(I,NLAST) = 0.
1131
+ 197 CONTINUE
1132
+ GO TO 202
1133
+ 198 CONTINUE
1134
+ IF (NROD .NE. 0) GO TO 200
1135
+ DO 199 I=1,MR
1136
+ II = IP+I
1137
+ Q(I,NLAST) = P(II)
1138
+ 199 CONTINUE
1139
+ IP = IP-MR
1140
+ GO TO 202
1141
+ 200 DO 201 I=1,MR
1142
+ Q(I,NLAST) = Q(I,NLAST)-Q(I,JM2)
1143
+ 201 CONTINUE
1144
+ 202 CONTINUE
1145
+ CALL COSGEN (KR,1,0.5,FDEN,TCOS)
1146
+ CALL COSGEN (LR,1,0.5,FDEN,TCOS(KR+1))
1147
+ IF (LR .NE. 0) GO TO 204
1148
+ DO 203 I=1,MR
1149
+ B(I) = FISTAG*B(I)
1150
+ 203 CONTINUE
1151
+ 204 CONTINUE
1152
+ CALL TRIX (KR,LR,MR,A,BB,C,B,TCOS,D,W)
1153
+ DO 205 I=1,MR
1154
+ Q(I,NLAST) = Q(I,NLAST)+B(I)
1155
+ 205 CONTINUE
1156
+ NLASTP = NLAST
1157
+ 206 CONTINUE
1158
+ JSTEP = JR
1159
+ JR = I2R
1160
+ I2R = I2R/2
1161
+ IF (JR .EQ. 0) GO TO 222
1162
+ GO TO (207,208),MIXBND
1163
+ 207 JSTART = 1+JR
1164
+ GO TO 209
1165
+ 208 JSTART = JR
1166
+ 209 CONTINUE
1167
+ KR = KR-JR
1168
+ IF (NLAST+JR .GT. N) GO TO 210
1169
+ KR = KR-JR
1170
+ NLAST = NLAST+JR
1171
+ JSTOP = NLAST-JSTEP
1172
+ GO TO 211
1173
+ 210 CONTINUE
1174
+ JSTOP = NLAST-JR
1175
+ 211 CONTINUE
1176
+ LR = KR-JR
1177
+ CALL COSGEN (JR,1,0.5,0.0,TCOS)
1178
+ DO 221 J=JSTART,JSTOP,JSTEP
1179
+ JM2 = J-JR
1180
+ JP2 = J+JR
1181
+ IF (J .NE. JR) GO TO 213
1182
+ DO 212 I=1,MR
1183
+ B(I) = Q(I,J)+Q(I,JP2)
1184
+ 212 CONTINUE
1185
+ GO TO 215
1186
+ 213 CONTINUE
1187
+ DO 214 I=1,MR
1188
+ B(I) = Q(I,J)+Q(I,JM2)+Q(I,JP2)
1189
+ 214 CONTINUE
1190
+ 215 CONTINUE
1191
+ IF (JR .NE. 1) GO TO 217
1192
+ DO 216 I=1,MR
1193
+ Q(I,J) = 0.
1194
+ 216 CONTINUE
1195
+ GO TO 219
1196
+ 217 CONTINUE
1197
+ JM1 = J-I2R
1198
+ JP1 = J+I2R
1199
+ DO 218 I=1,MR
1200
+ Q(I,J) = .5*(Q(I,J)-Q(I,JM1)-Q(I,JP1))
1201
+ 218 CONTINUE
1202
+ 219 CONTINUE
1203
+ CALL TRIX (JR,0,MR,A,BB,C,B,TCOS,D,W)
1204
+ DO 220 I=1,MR
1205
+ Q(I,J) = Q(I,J)+B(I)
1206
+ 220 CONTINUE
1207
+ 221 CONTINUE
1208
+ NROD = 1
1209
+ IF (NLAST+I2R .LE. N) NROD = 0
1210
+ IF (NLASTP .NE. NLAST) GO TO 194
1211
+ GO TO 206
1212
+ 222 CONTINUE
1213
+ C
1214
+ C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
1215
+ C
1216
+ W(1) = IPSTOR
1217
+ RETURN
1218
+ END
1219
+ SUBROUTINE POISP2 (M,N,A,BB,C,Q,IDIMQ,B,B2,B3,W,W2,W3,D,TCOS,P)
1220
+ C
1221
+ C SUBROUTINE TO SOLVE POISSON EQUATION WITH PERIODIC BOUNDARY
1222
+ C CONDITIONS.
1223
+ C
1224
+ DIMENSION A(*) ,BB(*) ,C(*) ,Q(IDIMQ,1) ,
1225
+ 1 B(*) ,B2(*) ,B3(*) ,W(*) ,
1226
+ 2 W2(*) ,W3(*) ,D(*) ,TCOS(*) ,
1227
+ 3 P(*)
1228
+ MR = M
1229
+ NR = (N+1)/2
1230
+ NRM1 = NR-1
1231
+ IF (2*NR .NE. N) GO TO 107
1232
+ C
1233
+ C EVEN NUMBER OF UNKNOWNS
1234
+ C
1235
+ DO 102 J=1,NRM1
1236
+ NRMJ = NR-J
1237
+ NRPJ = NR+J
1238
+ DO 101 I=1,MR
1239
+ S = Q(I,NRMJ)-Q(I,NRPJ)
1240
+ T = Q(I,NRMJ)+Q(I,NRPJ)
1241
+ Q(I,NRMJ) = S
1242
+ Q(I,NRPJ) = T
1243
+ 101 CONTINUE
1244
+ 102 CONTINUE
1245
+ DO 103 I=1,MR
1246
+ Q(I,NR) = 2.*Q(I,NR)
1247
+ Q(I,N) = 2.*Q(I,N)
1248
+ 103 CONTINUE
1249
+ CALL POISD2 (MR,NRM1,1,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
1250
+ IPSTOR = W(1)
1251
+ CALL POISN2 (MR,NR+1,1,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
1252
+ 1 TCOS,P)
1253
+ IPSTOR = MAX0(IPSTOR,INT(W(1)))
1254
+ DO 105 J=1,NRM1
1255
+ NRMJ = NR-J
1256
+ NRPJ = NR+J
1257
+ DO 104 I=1,MR
1258
+ S = .5*(Q(I,NRPJ)+Q(I,NRMJ))
1259
+ T = .5*(Q(I,NRPJ)-Q(I,NRMJ))
1260
+ Q(I,NRMJ) = S
1261
+ Q(I,NRPJ) = T
1262
+ 104 CONTINUE
1263
+ 105 CONTINUE
1264
+ DO 106 I=1,MR
1265
+ Q(I,NR) = .5*Q(I,NR)
1266
+ Q(I,N) = .5*Q(I,N)
1267
+ 106 CONTINUE
1268
+ GO TO 118
1269
+ 107 CONTINUE
1270
+ C
1271
+ C ODD NUMBER OF UNKNOWNS
1272
+ C
1273
+ DO 109 J=1,NRM1
1274
+ NRPJ = N+1-J
1275
+ DO 108 I=1,MR
1276
+ S = Q(I,J)-Q(I,NRPJ)
1277
+ T = Q(I,J)+Q(I,NRPJ)
1278
+ Q(I,J) = S
1279
+ Q(I,NRPJ) = T
1280
+ 108 CONTINUE
1281
+ 109 CONTINUE
1282
+ DO 110 I=1,MR
1283
+ Q(I,NR) = 2.*Q(I,NR)
1284
+ 110 CONTINUE
1285
+ LH = NRM1/2
1286
+ DO 112 J=1,LH
1287
+ NRMJ = NR-J
1288
+ DO 111 I=1,MR
1289
+ S = Q(I,J)
1290
+ Q(I,J) = Q(I,NRMJ)
1291
+ Q(I,NRMJ) = S
1292
+ 111 CONTINUE
1293
+ 112 CONTINUE
1294
+ CALL POISD2 (MR,NRM1,2,A,BB,C,Q,IDIMQ,B,W,D,TCOS,P)
1295
+ IPSTOR = W(1)
1296
+ CALL POISN2 (MR,NR,2,1,A,BB,C,Q(1,NR),IDIMQ,B,B2,B3,W,W2,W3,D,
1297
+ 1 TCOS,P)
1298
+ IPSTOR = MAX0(IPSTOR,INT(W(1)))
1299
+ DO 114 J=1,NRM1
1300
+ NRPJ = NR+J
1301
+ DO 113 I=1,MR
1302
+ S = .5*(Q(I,NRPJ)+Q(I,J))
1303
+ T = .5*(Q(I,NRPJ)-Q(I,J))
1304
+ Q(I,NRPJ) = T
1305
+ Q(I,J) = S
1306
+ 113 CONTINUE
1307
+ 114 CONTINUE
1308
+ DO 115 I=1,MR
1309
+ Q(I,NR) = .5*Q(I,NR)
1310
+ 115 CONTINUE
1311
+ DO 117 J=1,LH
1312
+ NRMJ = NR-J
1313
+ DO 116 I=1,MR
1314
+ S = Q(I,J)
1315
+ Q(I,J) = Q(I,NRMJ)
1316
+ Q(I,NRMJ) = S
1317
+ 116 CONTINUE
1318
+ 117 CONTINUE
1319
+ 118 CONTINUE
1320
+ C
1321
+ C RETURN STORAGE REQUIREMENTS FOR P VECTORS.
1322
+ C
1323
+ W(1) = IPSTOR
1324
+ RETURN
1325
+ C
1326
+ C REVISION HISTORY---
1327
+ C
1328
+ C SEPTEMBER 1973 VERSION 1
1329
+ C APRIL 1976 VERSION 2
1330
+ C JANUARY 1978 VERSION 3
1331
+ C DECEMBER 1979 VERSION 3.1
1332
+ C FEBRUARY 1985 DOCUMENTATION UPGRADE
1333
+ C NOVEMBER 1988 VERSION 3.2, FORTRAN 77 CHANGES
1334
+ C-----------------------------------------------------------------------
1335
+ END