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,602 @@
1
+ C
2
+ C file hwsplr.f
3
+ C
4
+ SUBROUTINE HWSPLR (A,B,M,MBDCND,BDA,BDB,C,D,N,NBDCND,BDC,BDD,
5
+ 1 ELMBDA,F,IDIMF,PERTRB,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 BDA(N),BDB(N),BDC(M),BDD(M),F(IDIMF,N+1),
40
+ C ARGUMENTS W(SEE ARGUMENT LIST)
41
+ C
42
+ C LATEST REVISION NOVEMBER 1988
43
+ C
44
+ C PURPOSE SOLVES A FINITE DIFFERENCE APPROXIMATION TO
45
+ C THE HELMHOLTZ EQUATION IN POLAR COORDINATES.
46
+ C THE EQUATION IS
47
+ C
48
+ C (1/R)(D/DR)(R(DU/DR)) +
49
+ C (1/R**2)(D/DTHETA)(DU/DTHETA) +
50
+ C LAMBDA*U = F(R,THETA).
51
+ C
52
+ C USAGE CALL HWSPLR (A,B,M,MBDCND,BDA,BDB,C,D,N,
53
+ C NBDCND,BDC,BDD,ELMBDA,F,IDIMF,
54
+ C PERTRB,IERROR,W)
55
+ C
56
+ C ARGUMENTS
57
+ C ON INPUT A,B
58
+ C THE RANGE OF R, I.E., A .LE. R .LE. B.
59
+ C A MUST BE LESS THAN B AND A MUST BE
60
+ C NON-NEGATIVE.
61
+ C
62
+ C M
63
+ C THE NUMBER OF PANELS INTO WHICH THE
64
+ C INTERVAL (A,B) IS SUBDIVIDED. HENCE,
65
+ C THERE WILL BE M+1 GRID POINTS IN THE
66
+ C R-DIRECTION GIVEN BY R(I) = A+(I-1)DR,
67
+ C FOR I = 1,2,...,M+1,
68
+ C WHERE DR = (B-A)/M IS THE PANEL WIDTH.
69
+ C M MUST BE GREATER THAN 3.
70
+ C
71
+ C MBDCND
72
+ C INDICATES THE TYPE OF BOUNDARY CONDITION
73
+ C AT R = A AND R = B.
74
+ C
75
+ C = 1 IF THE SOLUTION IS SPECIFIED AT
76
+ C R = A AND R = B.
77
+ C = 2 IF THE SOLUTION IS SPECIFIED AT
78
+ C R = A AND THE DERIVATIVE OF
79
+ C THE SOLUTION WITH RESPECT TO R IS
80
+ C SPECIFIED AT R = B.
81
+ C = 3 IF THE DERIVATIVE OF THE SOLUTION
82
+ C WITH RESPECT TO R IS SPECIFIED AT
83
+ C R = A (SEE NOTE BELOW) AND R = B.
84
+ C = 4 IF THE DERIVATIVE OF THE SOLUTION
85
+ C WITH RESPECT TO R IS SPECIFIED AT
86
+ C R = A (SEE NOTE BELOW) AND THE
87
+ C SOLUTION IS SPECIFIED AT R = B.
88
+ C = 5 IF THE SOLUTION IS UNSPECIFIED AT
89
+ C R = A = 0 AND THE SOLUTION IS
90
+ C SPECIFIED AT R = B.
91
+ C = 6 IF THE SOLUTION IS UNSPECIFIED AT
92
+ C R = A = 0 AND THE DERIVATIVE OF THE
93
+ C SOLUTION WITH RESPECT TO R IS SPECIFIED
94
+ C AT R = B.
95
+ C
96
+ C NOTE:
97
+ C IF A = 0, DO NOT USE MBDCND = 3 OR 4, BUT
98
+ C INSTEAD USE MBDCND = 1,2,5, OR 6 .
99
+ C
100
+ C BDA
101
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
102
+ C SPECIFIES THE VALUES OF THE DERIVATIVE OF
103
+ C THE SOLUTION WITH RESPECT TO R AT R = A.
104
+ C
105
+ C WHEN MBDCND = 3 OR 4,
106
+ C BDA(J) = (D/DR)U(A,THETA(J)),
107
+ C J = 1,2,...,N+1 .
108
+ C
109
+ C WHEN MBDCND HAS ANY OTHER VALUE, BDA IS
110
+ C A DUMMY VARIABLE.
111
+ C
112
+ C BDB
113
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
114
+ C SPECIFIES THE VALUES OF THE DERIVATIVE OF
115
+ C THE SOLUTION WITH RESPECT TO R AT R = B.
116
+ C
117
+ C WHEN MBDCND = 2,3, OR 6,
118
+ C BDB(J) = (D/DR)U(B,THETA(J)),
119
+ C J = 1,2,...,N+1 .
120
+ C
121
+ C WHEN MBDCND HAS ANY OTHER VALUE, BDB IS
122
+ C A DUMMY VARIABLE.
123
+ C
124
+ C C,D
125
+ C THE RANGE OF THETA, I.E., C .LE.
126
+ C THETA .LE. D. C MUST BE LESS THAN D.
127
+ C
128
+ C N
129
+ C THE NUMBER OF PANELS INTO WHICH THE
130
+ C INTERVAL (C,D) IS SUBDIVIDED. HENCE,
131
+ C THERE WILL BE N+1 GRID POINTS IN THE
132
+ C THETA-DIRECTION GIVEN BY
133
+ C THETA(J) = C+(J-1)DTHETA FOR
134
+ C J = 1,2,...,N+1, WHERE
135
+ C DTHETA = (D-C)/N IS THE PANEL WIDTH.
136
+ C N MUST BE GREATER THAN 3.
137
+ C
138
+ C NBDCND
139
+ C INDICATES THE TYPE OF BOUNDARY CONDITIONS
140
+ C AT THETA = C AND AT THETA = D.
141
+ C
142
+ C = 0 IF THE SOLUTION IS PERIODIC IN THETA,
143
+ C I.E., U(I,J) = U(I,N+J).
144
+ C = 1 IF THE SOLUTION IS SPECIFIED AT
145
+ C THETA = C AND THETA = D
146
+ C (SEE NOTE BELOW).
147
+ C = 2 IF THE SOLUTION IS SPECIFIED AT
148
+ C THETA = C AND THE DERIVATIVE OF THE
149
+ C SOLUTION WITH RESPECT TO THETA IS
150
+ C SPECIFIED AT THETA = D
151
+ C (SEE NOTE BELOW).
152
+ C = 4 IF THE DERIVATIVE OF THE SOLUTION
153
+ C WITH RESPECT TO THETA IS SPECIFIED
154
+ C AT THETA = C AND THE SOLUTION IS
155
+ C SPECIFIED AT THETA = D
156
+ C (SEE NOTE BELOW).
157
+ C
158
+ C NOTE:
159
+ C WHEN NBDCND = 1,2, OR 4, DO NOT USE
160
+ C MBDCND = 5 OR 6
161
+ C (THE FORMER INDICATES THAT THE SOLUTION
162
+ C IS SPECIFIED AT R = 0, THE LATTER INDICATES
163
+ C THE SOLUTION IS UNSPECIFIED AT R = 0).
164
+ C USE INSTEAD MBDCND = 1 OR 2 .
165
+ C
166
+ C BDC
167
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
168
+ C SPECIFIES THE VALUES OF THE DERIVATIVE
169
+ C OF THE SOLUTION WITH RESPECT TO THETA AT
170
+ C THETA = C. WHEN NBDCND = 3 OR 4,
171
+ C
172
+ C BDC(I) = (D/DTHETA)U(R(I),C),
173
+ C I = 1,2,...,M+1 .
174
+ C
175
+ C WHEN NBDCND HAS ANY OTHER VALUE, BDC IS
176
+ C A DUMMY VARIABLE.
177
+ C
178
+ C BDD
179
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
180
+ C SPECIFIES THE VALUES OF THE DERIVATIVE
181
+ C OF THE SOLUTION WITH RESPECT TO THETA AT
182
+ C THETA = D. WHEN NBDCND = 2 OR 3,
183
+ C
184
+ C BDD(I) = (D/DTHETA)U(R(I),D),
185
+ C I = 1,2,...,M+1 .
186
+ C
187
+ C WHEN NBDCND HAS ANY OTHER VALUE, BDD IS
188
+ C A DUMMY VARIABLE.
189
+ C
190
+ C ELMBDA
191
+ C THE CONSTANT LAMBDA IN THE HELMHOLTZ
192
+ C EQUATION. IF LAMBDA .LT. 0, A SOLUTION
193
+ C MAY NOT EXIST. HOWEVER, HWSPLR WILL
194
+ C ATTEMPT TO FIND A SOLUTION.
195
+ C
196
+ C F
197
+ C A TWO-DIMENSIONAL ARRAY, OF DIMENSION AT
198
+ C LEAST (M+1)*(N+1), SPECIFYING VALUES
199
+ C OF THE RIGHT SIDE OF THE HELMHOLTZ
200
+ C EQUATION AND BOUNDARY DATA (IF ANY).
201
+ C
202
+ C ON THE INTERIOR, F IS DEFINED AS FOLLOWS:
203
+ C FOR I = 2,3,...,M AND J = 2,3,...,N
204
+ C F(I,J) = F(R(I),THETA(J)).
205
+ C
206
+ C ON THE BOUNDARIES F IS DEFINED AS FOLLOWS:
207
+ C FOR J = 1,2,...,N+1 AND I = 1,2,...,M+1
208
+ C
209
+ C MBDCND F(1,J) F(M+1,J)
210
+ C ------ ------------- -------------
211
+ C
212
+ C 1 U(A,THETA(J)) U(B,THETA(J))
213
+ C 2 U(A,THETA(J)) F(B,THETA(J))
214
+ C 3 F(A,THETA(J)) F(B,THETA(J))
215
+ C 4 F(A,THETA(J)) U(B,THETA(J))
216
+ C 5 F(0,0) U(B,THETA(J))
217
+ C 6 F(0,0) F(B,THETA(J))
218
+ C
219
+ C NBDCND F(I,1) F(I,N+1)
220
+ C ------ --------- ---------
221
+ C
222
+ C 0 F(R(I),C) F(R(I),C)
223
+ C 1 U(R(I),C) U(R(I),D)
224
+ C 2 U(R(I),C) F(R(I),D)
225
+ C 3 F(R(I),C) F(R(I),D)
226
+ C 4 F(R(I),C) U(R(I),D)
227
+ C
228
+ C NOTE:
229
+ C IF THE TABLE CALLS FOR BOTH THE SOLUTION
230
+ C U AND THE RIGHT SIDE F AT A CORNER THEN
231
+ C THEN THE SOLUTION MUST BE SPECIFIED.
232
+ C
233
+ C IDIMF
234
+ C THE ROW (OR FIRST) DIMENSION OF THE ARRAY
235
+ C F AS IT APPEARS IN THE PROGRAM CALLING
236
+ C HWSPLR. THIS PARAMETER IS USED TO SPECIFY
237
+ C THE VARIABLE DIMENSION OF F. IDIMF MUST
238
+ C BE AT LEAST M+1.
239
+ C
240
+ C W
241
+ C A ONE-DIMENSIONAL ARRAY THAT MUST BE
242
+ C PROVIDED BY THE USER FOR WORK SPACE.
243
+ C W MAY REQUIRE UP TO 4*(N+1) +
244
+ C (13 + INT(LOG2(N+1)))*(M+1) LOCATIONS.
245
+ C THE ACTUAL NUMBER OF LOCATIONS USED IS
246
+ C COMPUTED BY HWSPLR AND IS RETURNED IN
247
+ C LOCATION W(I).
248
+ C
249
+ C
250
+ C ON OUTPUT F
251
+ C CONTAINS THE SOLUTION U(I,J) OF THE FINITE
252
+ C DIFFERENCE APPROXIMATION FOR THE GRID POINT
253
+ C (R(I),THETA(J)),
254
+ C I = 1,2,...,M+1, J = 1,2,...,N+1 .
255
+ C
256
+ C PERTRB
257
+ C IF A COMBINATION OF PERIODIC, DERIVATIVE,
258
+ C OR UNSPECIFIED BOUNDARY CONDITIONS IS
259
+ C SPECIFIED FOR A POISSON EQUATION
260
+ C (LAMBDA = 0), A SOLUTION MAY NOT EXIST.
261
+ C PERTRB IS A CONSTANT, CALCULATED AND
262
+ C SUBTRACTED FROM F, WHICH ENSURES THAT A
263
+ C SOLUTION EXISTS. HWSPLR THEN COMPUTES
264
+ C THIS SOLUTION, WHICH IS A LEAST SQUARES
265
+ C SOLUTION TO THE ORIGINAL APPROXIMATION.
266
+ C THIS SOLUTION PLUS ANY CONSTANT IS ALSO
267
+ C A SOLUTION. HENCE, THE SOLUTION IS NOT
268
+ C UNIQUE. PERTRB SHOULD BE SMALL COMPARED
269
+ C TO THE RIGHT SIDE. OTHERWISE, A SOLUTION
270
+ C IS OBTAINED TO AN ESSENTIALLY DIFFERENT
271
+ C PROBLEM. THIS COMPARISON SHOULD ALWAYS
272
+ C BE MADE TO INSURE THAT A MEANINGFUL
273
+ C SOLUTION HAS BEEN OBTAINED.
274
+ C
275
+ C IERROR
276
+ C AN ERROR FLAG THAT INDICATES INVALID INPUT
277
+ C PARAMETERS. EXCEPT FOR NUMBERS 0 AND 11,
278
+ C A SOLUTION IS NOT ATTEMPTED.
279
+ C
280
+ C = 0 NO ERROR.
281
+ C = 1 A .LT. 0 .
282
+ C = 2 A .GE. B.
283
+ C = 3 MBDCND .LT. 1 OR MBDCND .GT. 6 .
284
+ C = 4 C .GE. D.
285
+ C = 5 N .LE. 3
286
+ C = 6 NBDCND .LT. 0 OR .GT. 4 .
287
+ C = 7 A = 0, MBDCND = 3 OR 4 .
288
+ C = 8 A .GT. 0, MBDCND .GE. 5 .
289
+ C = 9 MBDCND .GE. 5, NBDCND .NE. 0
290
+ C AND NBDCND .NE. 3 .
291
+ C = 10 IDIMF .LT. M+1 .
292
+ C = 11 LAMBDA .GT. 0 .
293
+ C = 12 M .LE. 3
294
+ C
295
+ C SINCE THIS IS THE ONLY MEANS OF INDICATING
296
+ C A POSSIBLY INCORRECT CALL TO HWSPLR, THE
297
+ C USER SHOULD TEST IERROR AFTER THE CALL.
298
+ C
299
+ C W
300
+ C W(1) CONTAINS THE REQUIRED LENGTH OF W.
301
+ C
302
+ C SPECIAL CONDITIONS NONE
303
+ C
304
+ C I/O NONE
305
+ C
306
+ C PRECISION SINGLE
307
+ C
308
+ C REQUIRED LIBRARY GENBUN, GNBNAUX, AND COMF
309
+ C FILES FROM FISHPACK
310
+ C
311
+ C LANGUAGE FORTRAN
312
+ C
313
+ C HISTORY WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
314
+ C 1970'S. RELEASED ON NCAR'S PUBLIC SOFTWARE
315
+ C LIBRARIES IN JANUARY 1980.
316
+ C
317
+ C PORTABILITY FORTRAN 77
318
+ C
319
+ C ALGORITHM THE ROUTINE DEFINES THE FINITE DIFFERENCE
320
+ C EQUATIONS, INCORPORATES BOUNDARY DATA, AND
321
+ C ADJUSTS THE RIGHT SIDE OF SINGULAR SYSTEMS
322
+ C AND THEN CALLS GENBUN TO SOLVE THE SYSTEM.
323
+ C
324
+ C TIMING FOR LARGE M AND N, THE OPERATION COUNT
325
+ C IS ROUGHLY PROPORTIONAL TO
326
+ C M*N*(LOG2(N)
327
+ C BUT ALSO DEPENDS ON INPUT PARAMETERS NBDCND
328
+ C AND MBDCND.
329
+ C
330
+ C ACCURACY THE SOLUTION PROCESS EMPLOYED RESULTS IN A LOSS
331
+ C OF NO MORE THAN THREE SIGNIFICANT DIGITS FOR N
332
+ C AND M AS LARGE AS 64. MORE DETAILS ABOUT
333
+ C ACCURACY CAN BE FOUND IN THE DOCUMENTATION FOR
334
+ C SUBROUTINE GENBUN WHICH IS THE ROUTINE THAT
335
+ C SOLVES THE FINITE DIFFERENCE EQUATIONS.
336
+ C
337
+ C REFERENCES SWARZTRAUBER,P. AND R. SWEET, "EFFICIENT
338
+ C FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
339
+ C ELLIPTIC EQUATIONS"
340
+ C NCAR TN/IA-109, JULY, 1975, 138 PP.
341
+ C***********************************************************************
342
+ DIMENSION F(IDIMF,*)
343
+ DIMENSION BDA(*) ,BDB(*) ,BDC(*) ,BDD(*) ,
344
+ 1 W(*)
345
+ C
346
+ C CHECK FOR INVALID PARAMETERS.
347
+ C
348
+ IERROR = 0
349
+ IF (A .LT. 0.) IERROR = 1
350
+ IF (A .GE. B) IERROR = 2
351
+ IF (MBDCND.LE.0 .OR. MBDCND.GE.7) IERROR = 3
352
+ IF (C .GE. D) IERROR = 4
353
+ IF (N .LE. 3) IERROR = 5
354
+ IF (NBDCND.LE.-1 .OR. NBDCND.GE.5) IERROR = 6
355
+ IF (A.EQ.0. .AND. (MBDCND.EQ.3 .OR. MBDCND.EQ.4)) IERROR = 7
356
+ IF (A.GT.0. .AND. MBDCND.GE.5) IERROR = 8
357
+ IF (MBDCND.GE.5 .AND. NBDCND.NE.0 .AND. NBDCND.NE.3) IERROR = 9
358
+ IF (IDIMF .LT. M+1) IERROR = 10
359
+ IF (M .LE. 3) IERROR = 12
360
+ IF (IERROR .NE. 0) RETURN
361
+ MP1 = M+1
362
+ DELTAR = (B-A)/FLOAT(M)
363
+ DLRBY2 = DELTAR/2.
364
+ DLRSQ = DELTAR**2
365
+ NP1 = N+1
366
+ DELTHT = (D-C)/FLOAT(N)
367
+ DLTHSQ = DELTHT**2
368
+ NP = NBDCND+1
369
+ C
370
+ C DEFINE RANGE OF INDICES I AND J FOR UNKNOWNS U(I,J).
371
+ C
372
+ MSTART = 2
373
+ MSTOP = MP1
374
+ GO TO (101,105,102,103,104,105),MBDCND
375
+ 101 MSTOP = M
376
+ GO TO 105
377
+ 102 MSTART = 1
378
+ GO TO 105
379
+ 103 MSTART = 1
380
+ 104 MSTOP = M
381
+ 105 MUNK = MSTOP-MSTART+1
382
+ NSTART = 1
383
+ NSTOP = N
384
+ GO TO (109,106,107,108,109),NP
385
+ 106 NSTART = 2
386
+ GO TO 109
387
+ 107 NSTART = 2
388
+ 108 NSTOP = NP1
389
+ 109 NUNK = NSTOP-NSTART+1
390
+ C
391
+ C DEFINE A,B,C COEFFICIENTS IN W-ARRAY.
392
+ C
393
+ ID2 = MUNK
394
+ ID3 = ID2+MUNK
395
+ ID4 = ID3+MUNK
396
+ ID5 = ID4+MUNK
397
+ ID6 = ID5+MUNK
398
+ A1 = 2./DLRSQ
399
+ IJ = 0
400
+ IF (MBDCND.EQ.3 .OR. MBDCND.EQ.4) IJ = 1
401
+ DO 110 I=1,MUNK
402
+ R = A+FLOAT(I-IJ)*DELTAR
403
+ J = ID5+I
404
+ W(J) = R
405
+ J = ID6+I
406
+ W(J) = 1./R**2
407
+ W(I) = (R-DLRBY2)/(R*DLRSQ)
408
+ J = ID3+I
409
+ W(J) = (R+DLRBY2)/(R*DLRSQ)
410
+ J = ID2+I
411
+ W(J) = -A1+ELMBDA
412
+ 110 CONTINUE
413
+ GO TO (114,111,112,113,114,111),MBDCND
414
+ 111 W(ID2) = A1
415
+ GO TO 114
416
+ 112 W(ID2) = A1
417
+ 113 W(ID3+1) = A1
418
+ 114 CONTINUE
419
+ C
420
+ C ENTER BOUNDARY DATA FOR R-BOUNDARIES.
421
+ C
422
+ GO TO (115,115,117,117,119,119),MBDCND
423
+ 115 A1 = W(1)
424
+ DO 116 J=NSTART,NSTOP
425
+ F(2,J) = F(2,J)-A1*F(1,J)
426
+ 116 CONTINUE
427
+ GO TO 119
428
+ 117 A1 = 2.*DELTAR*W(1)
429
+ DO 118 J=NSTART,NSTOP
430
+ F(1,J) = F(1,J)+A1*BDA(J)
431
+ 118 CONTINUE
432
+ 119 GO TO (120,122,122,120,120,122),MBDCND
433
+ 120 A1 = W(ID4)
434
+ DO 121 J=NSTART,NSTOP
435
+ F(M,J) = F(M,J)-A1*F(MP1,J)
436
+ 121 CONTINUE
437
+ GO TO 124
438
+ 122 A1 = 2.*DELTAR*W(ID4)
439
+ DO 123 J=NSTART,NSTOP
440
+ F(MP1,J) = F(MP1,J)-A1*BDB(J)
441
+ 123 CONTINUE
442
+ C
443
+ C ENTER BOUNDARY DATA FOR THETA-BOUNDARIES.
444
+ C
445
+ 124 A1 = 1./DLTHSQ
446
+ L = ID5-MSTART+1
447
+ LP = ID6-MSTART+1
448
+ GO TO (134,125,125,127,127),NP
449
+ 125 DO 126 I=MSTART,MSTOP
450
+ J = I+LP
451
+ F(I,2) = F(I,2)-A1*W(J)*F(I,1)
452
+ 126 CONTINUE
453
+ GO TO 129
454
+ 127 A1 = 2./DELTHT
455
+ DO 128 I=MSTART,MSTOP
456
+ J = I+LP
457
+ F(I,1) = F(I,1)+A1*W(J)*BDC(I)
458
+ 128 CONTINUE
459
+ 129 A1 = 1./DLTHSQ
460
+ GO TO (134,130,132,132,130),NP
461
+ 130 DO 131 I=MSTART,MSTOP
462
+ J = I+LP
463
+ F(I,N) = F(I,N)-A1*W(J)*F(I,NP1)
464
+ 131 CONTINUE
465
+ GO TO 134
466
+ 132 A1 = 2./DELTHT
467
+ DO 133 I=MSTART,MSTOP
468
+ J = I+LP
469
+ F(I,NP1) = F(I,NP1)-A1*W(J)*BDD(I)
470
+ 133 CONTINUE
471
+ 134 CONTINUE
472
+ C
473
+ C ADJUST RIGHT SIDE OF EQUATION FOR UNKNOWN AT POLE WHEN HAVE
474
+ C DERIVATIVE SPECIFIED BOUNDARY CONDITIONS.
475
+ C
476
+ IF (MBDCND.GE.5 .AND. NBDCND.EQ.3)
477
+ 1 F(1,1) = F(1,1)-(BDD(2)-BDC(2))*4./(FLOAT(N)*DELTHT*DLRSQ)
478
+ C
479
+ C ADJUST RIGHT SIDE OF SINGULAR PROBLEMS TO INSURE EXISTENCE OF A
480
+ C SOLUTION.
481
+ C
482
+ PERTRB = 0.
483
+ IF (ELMBDA) 144,136,135
484
+ 135 IERROR = 11
485
+ GO TO 144
486
+ 136 IF (NBDCND.NE.0 .AND. NBDCND.NE.3) GO TO 144
487
+ S2 = 0.
488
+ GO TO (144,144,137,144,144,138),MBDCND
489
+ 137 W(ID5+1) = .5*(W(ID5+2)-DLRBY2)
490
+ S2 = .25*DELTAR
491
+ 138 A2 = 2.
492
+ IF (NBDCND .EQ. 0) A2 = 1.
493
+ J = ID5+MUNK
494
+ W(J) = .5*(W(J-1)+DLRBY2)
495
+ S = 0.
496
+ DO 140 I=MSTART,MSTOP
497
+ S1 = 0.
498
+ IJ = NSTART+1
499
+ K = NSTOP-1
500
+ DO 139 J=IJ,K
501
+ S1 = S1+F(I,J)
502
+ 139 CONTINUE
503
+ J = I+L
504
+ S = S+(A2*S1+F(I,NSTART)+F(I,NSTOP))*W(J)
505
+ 140 CONTINUE
506
+ S2 = FLOAT(M)*A+DELTAR*(FLOAT((M-1)*(M+1))*.5+.25)+S2
507
+ S1 = (2.+A2*FLOAT(NUNK-2))*S2
508
+ IF (MBDCND .EQ. 3) GO TO 141
509
+ S2 = FLOAT(N)*A2*DELTAR/8.
510
+ S = S+F(1,1)*S2
511
+ S1 = S1+S2
512
+ 141 CONTINUE
513
+ PERTRB = S/S1
514
+ DO 143 I=MSTART,MSTOP
515
+ DO 142 J=NSTART,NSTOP
516
+ F(I,J) = F(I,J)-PERTRB
517
+ 142 CONTINUE
518
+ 143 CONTINUE
519
+ 144 CONTINUE
520
+ C
521
+ C MULTIPLY I-TH EQUATION THROUGH BY (R(I)*DELTHT)**2.
522
+ C
523
+ DO 146 I=MSTART,MSTOP
524
+ K = I-MSTART+1
525
+ J = I+LP
526
+ A1 = DLTHSQ/W(J)
527
+ W(K) = A1*W(K)
528
+ J = ID2+K
529
+ W(J) = A1*W(J)
530
+ J = ID3+K
531
+ W(J) = A1*W(J)
532
+ DO 145 J=NSTART,NSTOP
533
+ F(I,J) = A1*F(I,J)
534
+ 145 CONTINUE
535
+ 146 CONTINUE
536
+ W(1) = 0.
537
+ W(ID4) = 0.
538
+ C
539
+ C CALL GENBUN TO SOLVE THE SYSTEM OF EQUATIONS.
540
+ C
541
+ CALL GENBUN (NBDCND,NUNK,1,MUNK,W(1),W(ID2+1),W(ID3+1),IDIMF,
542
+ 1 F(MSTART,NSTART),IERR1,W(ID4+1))
543
+ IWSTOR = W(ID4+1)+3.*FLOAT(MUNK)
544
+ GO TO (157,157,157,157,148,147),MBDCND
545
+ C
546
+ C ADJUST THE SOLUTION AS NECESSARY FOR THE PROBLEMS WHERE A = 0.
547
+ C
548
+ 147 IF (ELMBDA .NE. 0.) GO TO 148
549
+ YPOLE = 0.
550
+ GO TO 155
551
+ 148 CONTINUE
552
+ J = ID5+MUNK
553
+ W(J) = W(ID2)/W(ID3)
554
+ DO 149 IP=3,MUNK
555
+ I = MUNK-IP+2
556
+ J = ID5+I
557
+ LP = ID2+I
558
+ K = ID3+I
559
+ W(J) = W(I)/(W(LP)-W(K)*W(J+1))
560
+ 149 CONTINUE
561
+ W(ID5+1) = -.5*DLTHSQ/(W(ID2+1)-W(ID3+1)*W(ID5+2))
562
+ DO 150 I=2,MUNK
563
+ J = ID5+I
564
+ W(J) = -W(J)*W(J-1)
565
+ 150 CONTINUE
566
+ S = 0.
567
+ DO 151 J=NSTART,NSTOP
568
+ S = S+F(2,J)
569
+ 151 CONTINUE
570
+ A2 = NUNK
571
+ IF (NBDCND .EQ. 0) GO TO 152
572
+ S = S-.5*(F(2,NSTART)+F(2,NSTOP))
573
+ A2 = A2-1.
574
+ 152 YPOLE = (.25*DLRSQ*F(1,1)-S/A2)/(W(ID5+1)-1.+ELMBDA*DLRSQ*.25)
575
+ DO 154 I=MSTART,MSTOP
576
+ K = L+I
577
+ DO 153 J=NSTART,NSTOP
578
+ F(I,J) = F(I,J)+YPOLE*W(K)
579
+ 153 CONTINUE
580
+ 154 CONTINUE
581
+ 155 DO 156 J=1,NP1
582
+ F(1,J) = YPOLE
583
+ 156 CONTINUE
584
+ 157 CONTINUE
585
+ IF (NBDCND .NE. 0) GO TO 159
586
+ DO 158 I=MSTART,MSTOP
587
+ F(I,NP1) = F(I,1)
588
+ 158 CONTINUE
589
+ 159 CONTINUE
590
+ W(1) = IWSTOR
591
+ RETURN
592
+ C
593
+ C REVISION HISTORY---
594
+ C
595
+ C SEPTEMBER 1973 VERSION 1
596
+ C APRIL 1976 VERSION 2
597
+ C JANUARY 1978 VERSION 3
598
+ C DECEMBER 1979 VERSION 3.1
599
+ C FEBRUARY 1985 DOCUMENTATION UPGRADE
600
+ C NOVEMBER 1988 VERSION 3.2, FORTRAN 77 CHANGES
601
+ C-----------------------------------------------------------------------
602
+ END