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,780 @@
1
+ C
2
+ C file hwsssp.f
3
+ C
4
+ SUBROUTINE HWSSSP (TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,N,NBDCND,BDPS,
5
+ 1 BDPF,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 BDTS(N+1), BDTF(N+1), BDPS(M+1), BDPF(M+1),
40
+ C ARGUMENTS F(IDIMF,N+1), 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 SPHERICAL
46
+ C COORDINATES AND ON THE SURFACE OF THE UNIT
47
+ C SPHERE (RADIUS OF 1). THE EQUATION IS
48
+ C
49
+ C (1/SIN(THETA))(D/DTHETA)(SIN(THETA)
50
+ C (DU/DTHETA)) + (1/SIN(THETA)**2)(D/DPHI)
51
+ C (DU/DPHI) + LAMBDA*U = F(THETA,PHI)
52
+ C
53
+ C WHERE THETA IS COLATITUDE AND PHI IS
54
+ C LONGITUDE.
55
+ C
56
+ C USAGE CALL HWSSSP (TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,
57
+ C N,NBDCND,BDPS,BDPF,ELMBDA,F,
58
+ C IDIMF,PERTRB,IERROR,W)
59
+ C
60
+ C ARGUMENTS
61
+ C ON INPUT TS,TF
62
+ C
63
+ C THE RANGE OF THETA (COLATITUDE), I.E.,
64
+ C TS .LE. THETA .LE. TF. TS MUST BE LESS
65
+ C THAN TF. TS AND TF ARE IN RADIANS.
66
+ C A TS OF ZERO CORRESPONDS TO THE NORTH
67
+ C POLE AND A TF OF PI CORRESPONDS TO
68
+ C THE SOUTH POLE.
69
+ C
70
+ C * * * IMPORTANT * * *
71
+ C
72
+ C IF TF IS EQUAL TO PI THEN IT MUST BE
73
+ C COMPUTED USING THE STATEMENT
74
+ C TF = PIMACH(DUM). THIS INSURES THAT TF
75
+ C IN THE USER'S PROGRAM IS EQUAL TO PI IN
76
+ C THIS PROGRAM WHICH PERMITS SEVERAL TESTS
77
+ C OF THE INPUT PARAMETERS THAT OTHERWISE
78
+ C WOULD NOT BE POSSIBLE.
79
+ C
80
+ C
81
+ C M
82
+ C THE NUMBER OF PANELS INTO WHICH THE
83
+ C INTERVAL (TS,TF) IS SUBDIVIDED.
84
+ C HENCE, THERE WILL BE M+1 GRID POINTS IN THE
85
+ C THETA-DIRECTION GIVEN BY
86
+ C THETA(I) = (I-1)DTHETA+TS FOR
87
+ C I = 1,2,...,M+1, WHERE
88
+ C DTHETA = (TF-TS)/M IS THE PANEL WIDTH.
89
+ C M MUST BE GREATER THAN 5
90
+ C
91
+ C MBDCND
92
+ C INDICATES THE TYPE OF BOUNDARY CONDITION
93
+ C AT THETA = TS AND THETA = TF.
94
+ C
95
+ C = 1 IF THE SOLUTION IS SPECIFIED AT
96
+ C THETA = TS AND THETA = TF.
97
+ C = 2 IF THE SOLUTION IS SPECIFIED AT
98
+ C THETA = TS AND THE DERIVATIVE OF
99
+ C THE SOLUTION WITH RESPECT TO THETA IS
100
+ C SPECIFIED AT THETA = TF
101
+ C (SEE NOTE 2 BELOW).
102
+ C = 3 IF THE DERIVATIVE OF THE SOLUTION
103
+ C WITH RESPECT TO THETA IS SPECIFIED
104
+ C SPECIFIED AT THETA = TS AND
105
+ C THETA = TF (SEE NOTES 1,2 BELOW).
106
+ C = 4 IF THE DERIVATIVE OF THE SOLUTION
107
+ C WITH RESPECT TO THETA IS SPECIFIED
108
+ C AT THETA = TS (SEE NOTE 1 BELOW)
109
+ C AND THE SOLUTION IS SPECIFIED AT
110
+ C THETA = TF.
111
+ C = 5 IF THE SOLUTION IS UNSPECIFIED AT
112
+ C THETA = TS = 0 AND THE SOLUTION
113
+ C IS SPECIFIED AT THETA = TF.
114
+ C = 6 IF THE SOLUTION IS UNSPECIFIED AT
115
+ C THETA = TS = 0 AND THE DERIVATIVE
116
+ C OF THE SOLUTION WITH RESPECT TO THETA
117
+ C IS SPECIFIED AT THETA = TF
118
+ C (SEE NOTE 2 BELOW).
119
+ C = 7 IF THE SOLUTION IS SPECIFIED AT
120
+ C THETA = TS AND THE SOLUTION IS
121
+ C IS UNSPECIFIED AT THETA = TF = PI.
122
+ C = 8 IF THE DERIVATIVE OF THE SOLUTION
123
+ C WITH RESPECT TO THETA IS SPECIFIED
124
+ C AT THETA = TS (SEE NOTE 1 BELOW) AND
125
+ C THE SOLUTION IS UNSPECIFIED AT
126
+ C THETA = TF = PI.
127
+ C = 9 IF THE SOLUTION IS UNSPECIFIED AT
128
+ C THETA = TS = 0 AND THETA = TF = PI.
129
+ C
130
+ C NOTES:
131
+ C IF TS = 0, DO NOT USE MBDCND = 3,4, OR 8,
132
+ C BUT INSTEAD USE MBDCND = 5,6, OR 9 .
133
+ C
134
+ C IF TF = PI, DO NOT USE MBDCND = 2,3, OR 6,
135
+ C BUT INSTEAD USE MBDCND = 7,8, OR 9 .
136
+ C
137
+ C BDTS
138
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH N+1 THAT
139
+ C SPECIFIES THE VALUES OF THE DERIVATIVE OF
140
+ C THE SOLUTION WITH RESPECT TO THETA AT
141
+ C THETA = TS. WHEN MBDCND = 3,4, OR 8,
142
+ C
143
+ C BDTS(J) = (D/DTHETA)U(TS,PHI(J)),
144
+ C J = 1,2,...,N+1 .
145
+ C
146
+ C WHEN MBDCND HAS ANY OTHER VALUE, BDTS IS
147
+ C A DUMMY VARIABLE.
148
+ C
149
+ C BDTF
150
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH N+1
151
+ C THAT SPECIFIES THE VALUES OF THE DERIVATIVE
152
+ C OF THE SOLUTION WITH RESPECT TO THETA AT
153
+ C THETA = TF. WHEN MBDCND = 2,3, OR 6,
154
+ C
155
+ C BDTF(J) = (D/DTHETA)U(TF,PHI(J)),
156
+ C J = 1,2,...,N+1 .
157
+ C
158
+ C WHEN MBDCND HAS ANY OTHER VALUE, BDTF IS
159
+ C A DUMMY VARIABLE.
160
+ C
161
+ C PS,PF
162
+ C THE RANGE OF PHI (LONGITUDE), I.E.,
163
+ C PS .LE. PHI .LE. PF. PS MUST BE LESS
164
+ C THAN PF. PS AND PF ARE IN RADIANS.
165
+ C IF PS = 0 AND PF = 2*PI, PERIODIC
166
+ C BOUNDARY CONDITIONS ARE USUALLY PRESCRIBED.
167
+ C
168
+ C * * * IMPORTANT * * *
169
+ C
170
+ C IF PF IS EQUAL TO 2*PI THEN IT MUST BE
171
+ C COMPUTED USING THE STATEMENT
172
+ C PF = 2.*PIMACH(DUM). THIS INSURES THAT
173
+ C PF IN THE USERS PROGRAM IS EQUAL TO
174
+ C 2*PI IN THIS PROGRAM WHICH PERMITS TESTS
175
+ C OF THE INPUT PARAMETERS THAT OTHERWISE
176
+ C WOULD NOT BE POSSIBLE.
177
+ C
178
+ C N
179
+ C THE NUMBER OF PANELS INTO WHICH THE
180
+ C INTERVAL (PS,PF) IS SUBDIVIDED.
181
+ C HENCE, THERE WILL BE N+1 GRID POINTS
182
+ C IN THE PHI-DIRECTION GIVEN BY
183
+ C PHI(J) = (J-1)DPHI+PS FOR
184
+ C J = 1,2,...,N+1, WHERE
185
+ C DPHI = (PF-PS)/N IS THE PANEL WIDTH.
186
+ C N MUST BE GREATER THAN 4
187
+ C
188
+ C NBDCND
189
+ C INDICATES THE TYPE OF BOUNDARY CONDITION
190
+ C AT PHI = PS AND PHI = PF.
191
+ C
192
+ C = 0 IF THE SOLUTION IS PERIODIC IN PHI,
193
+ C I.U., U(I,J) = U(I,N+J).
194
+ C = 1 IF THE SOLUTION IS SPECIFIED AT
195
+ C PHI = PS AND PHI = PF
196
+ C (SEE NOTE BELOW).
197
+ C = 2 IF THE SOLUTION IS SPECIFIED AT
198
+ C PHI = PS (SEE NOTE BELOW)
199
+ C AND THE DERIVATIVE OF THE SOLUTION
200
+ C WITH RESPECT TO PHI IS SPECIFIED
201
+ C AT PHI = PF.
202
+ C = 3 IF THE DERIVATIVE OF THE SOLUTION
203
+ C WITH RESPECT TO PHI IS SPECIFIED
204
+ C AT PHI = PS AND PHI = PF.
205
+ C = 4 IF THE DERIVATIVE OF THE SOLUTION
206
+ C WITH RESPECT TO PHI IS SPECIFIED
207
+ C AT PS AND THE SOLUTION IS SPECIFIED
208
+ C AT PHI = PF
209
+ C
210
+ C NOTE:
211
+ C NBDCND = 1,2, OR 4 CANNOT BE USED WITH
212
+ C MBDCND = 5,6,7,8, OR 9. THE FORMER INDICATES
213
+ C THAT THE SOLUTION IS SPECIFIED AT A POLE, THE
214
+ C LATTER INDICATES THAT THE SOLUTION IS NOT
215
+ C SPECIFIED. USE INSTEAD MBDCND = 1 OR 2.
216
+ C
217
+ C BDPS
218
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
219
+ C SPECIFIES THE VALUES OF THE DERIVATIVE
220
+ C OF THE SOLUTION WITH RESPECT TO PHI AT
221
+ C PHI = PS. WHEN NBDCND = 3 OR 4,
222
+ C
223
+ C BDPS(I) = (D/DPHI)U(THETA(I),PS),
224
+ C I = 1,2,...,M+1 .
225
+ C
226
+ C WHEN NBDCND HAS ANY OTHER VALUE, BDPS IS
227
+ C A DUMMY VARIABLE.
228
+ C
229
+ C BDPF
230
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH M+1 THAT
231
+ C SPECIFIES THE VALUES OF THE DERIVATIVE
232
+ C OF THE SOLUTION WITH RESPECT TO PHI AT
233
+ C PHI = PF. WHEN NBDCND = 2 OR 3,
234
+ C
235
+ C BDPF(I) = (D/DPHI)U(THETA(I),PF),
236
+ C I = 1,2,...,M+1 .
237
+ C
238
+ C WHEN NBDCND HAS ANY OTHER VALUE, BDPF IS
239
+ C A DUMMY VARIABLE.
240
+ C
241
+ C ELMBDA
242
+ C THE CONSTANT LAMBDA IN THE HELMHOLTZ
243
+ C EQUATION. IF LAMBDA .GT. 0, A SOLUTION
244
+ C MAY NOT EXIST. HOWEVER, HWSSSP WILL
245
+ C ATTEMPT TO FIND A SOLUTION.
246
+ C
247
+ C F
248
+ C A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
249
+ C VALUE OF THE RIGHT SIDE OF THE HELMHOLTZ
250
+ C EQUATION AND BOUNDARY VALUES (IF ANY).
251
+ C F MUST BE DIMENSIONED AT LEAST (M+1)*(N+1).
252
+ C
253
+ C ON THE INTERIOR, F IS DEFINED AS FOLLOWS:
254
+ C FOR I = 2,3,...,M AND J = 2,3,...,N
255
+ C F(I,J) = F(THETA(I),PHI(J)).
256
+ C
257
+ C ON THE BOUNDARIES F IS DEFINED AS FOLLOWS:
258
+ C FOR J = 1,2,...,N+1 AND I = 1,2,...,M+1
259
+ C
260
+ C MBDCND F(1,J) F(M+1,J)
261
+ C ------ ------------ ------------
262
+ C
263
+ C 1 U(TS,PHI(J)) U(TF,PHI(J))
264
+ C 2 U(TS,PHI(J)) F(TF,PHI(J))
265
+ C 3 F(TS,PHI(J)) F(TF,PHI(J))
266
+ C 4 F(TS,PHI(J)) U(TF,PHI(J))
267
+ C 5 F(0,PS) U(TF,PHI(J))
268
+ C 6 F(0,PS) F(TF,PHI(J))
269
+ C 7 U(TS,PHI(J)) F(PI,PS)
270
+ C 8 F(TS,PHI(J)) F(PI,PS)
271
+ C 9 F(0,PS) F(PI,PS)
272
+ C
273
+ C NBDCND F(I,1) F(I,N+1)
274
+ C ------ -------------- --------------
275
+ C
276
+ C 0 F(THETA(I),PS) F(THETA(I),PS)
277
+ C 1 U(THETA(I),PS) U(THETA(I),PF)
278
+ C 2 U(THETA(I),PS) F(THETA(I),PF)
279
+ C 3 F(THETA(I),PS) F(THETA(I),PF)
280
+ C 4 F(THETA(I),PS) U(THETA(I),PF)
281
+ C
282
+ C NOTE:
283
+ C IF THE TABLE CALLS FOR BOTH THE SOLUTION U
284
+ C AND THE RIGHT SIDE F AT A CORNER THEN THE
285
+ C SOLUTION MUST BE SPECIFIED.
286
+ C
287
+ C IDIMF
288
+ C THE ROW (OR FIRST) DIMENSION OF THE ARRAY
289
+ C F AS IT APPEARS IN THE PROGRAM CALLING
290
+ C HWSSSP. THIS PARAMETER IS USED TO SPECIFY
291
+ C THE VARIABLE DIMENSION OF F. IDIMF MUST BE
292
+ C AT LEAST M+1 .
293
+ C
294
+ C W
295
+ C A ONE-DIMENSIONAL ARRAY THAT MUST BE
296
+ C PROVIDED BY THE USER FOR WORK SPACE.
297
+ C W MAY REQUIRE UP TO
298
+ C 4*(N+1)+(16+INT(LOG2(N+1)))(M+1) LOCATIONS
299
+ C THE ACTUAL NUMBER OF LOCATIONS USED IS
300
+ C COMPUTED BY HWSSSP AND IS OUTPUT IN
301
+ C LOCATION W(1). INT( ) DENOTES THE
302
+ C FORTRAN INTEGER FUNCTION.
303
+ C
304
+ C
305
+ C ON OUTPUT F
306
+ C CONTAINS THE SOLUTION U(I,J) OF THE FINITE
307
+ C DIFFERENCE APPROXIMATION FOR THE GRID POINT
308
+ C (THETA(I),PHI(J)), I = 1,2,...,M+1 AND
309
+ C J = 1,2,...,N+1 .
310
+ C
311
+ C PERTRB
312
+ C IF ONE SPECIFIES A COMBINATION OF PERIODIC,
313
+ C DERIVATIVE OR UNSPECIFIED BOUNDARY
314
+ C CONDITIONS FOR A POISSON EQUATION
315
+ C (LAMBDA = 0), A SOLUTION MAY NOT EXIST.
316
+ C PERTRB IS A CONSTANT, CALCULATED AND
317
+ C SUBTRACTED FROM F, WHICH ENSURES THAT A
318
+ C SOLUTION EXISTS. HWSSSP THEN COMPUTES
319
+ C THIS SOLUTION, WHICH IS A LEAST SQUARES
320
+ C SOLUTION TO THE ORIGINAL APPROXIMATION.
321
+ C THIS SOLUTION IS NOT UNIQUE AND IS
322
+ C UNNORMALIZED. THE VALUE OF PERTRB SHOULD
323
+ C BE SMALL COMPARED TO THE RIGHT SIDE F.
324
+ C OTHERWISE , A SOLUTION IS OBTAINED TO AN
325
+ C ESSENTIALLY DIFFERENT PROBLEM. THIS
326
+ C COMPARISON SHOULD ALWAYS BE MADE TO INSURE
327
+ C THAT A MEANINGFUL SOLUTION HAS BEEN
328
+ C OBTAINED
329
+ C
330
+ C IERROR
331
+ C AN ERROR FLAG THAT INDICATES INVALID INPUT
332
+ C PARAMETERS. EXCEPT FOR NUMBERS 0 AND 8,
333
+ C A SOLUTION IS NOT ATTEMPTED.
334
+ C
335
+ C = 0 NO ERROR
336
+ C = 1 TS.LT.0 OR TF.GT.PI
337
+ C = 2 TS.GE.TF
338
+ C = 3 MBDCND.LT.1 OR MBDCND.GT.9
339
+ C = 4 PS.LT.0 OR PS.GT.PI+PI
340
+ C = 5 PS.GE.PF
341
+ C = 6 N.LT.5
342
+ C = 7 M.LT.5
343
+ C = 8 NBDCND.LT.0 OR NBDCND.GT.4
344
+ C = 9 ELMBDA.GT.0
345
+ C = 10 IDIMF.LT.M+1
346
+ C = 11 NBDCND EQUALS 1,2 OR 4 AND MBDCND.GE.5
347
+ C = 12 TS.EQ.0 AND MBDCND EQUALS 3,4 OR 8
348
+ C = 13 TF.EQ.PI AND MBDCND EQUALS 2,3 OR 6
349
+ C = 14 MBDCND EQUALS 5,6 OR 9 AND TS.NE.0
350
+ C = 15 MBDCND.GE.7 AND TF.NE.PI
351
+ C
352
+ C SINCE THIS IS THE ONLY MEANS OF INDICATING
353
+ C A POSSIBLY INCORRECT CALL TO HWSSSP, THE
354
+ C USER SHOULD TEST IERROR AFTER A CALL.
355
+ C
356
+ C W
357
+ C CONTAINS INTERMEDIATE VALUES THAT MUST NOT
358
+ C BE DESTROYED IF HWSSSP WILL BE CALLED AGAIN
359
+ C WITH INTL = 1. W(1) CONTAINS THE REQUIRED
360
+ C LENGTH OF W .
361
+ C
362
+ C SPECIAL CONDITIONS NONE
363
+ C
364
+ C I/O NONE
365
+ C
366
+ C PRECISION SINGLE
367
+ C
368
+ C REQUIRED LIBRARY GENBUN, GNBNAUX, AND COMF
369
+ C FILES FROM FISHPACK
370
+ C
371
+ C LANGUAGE FORTRAN
372
+ C
373
+ C HISTORY WRITTEN BY ROLAND SWEET AT NCAR IN THE LATE
374
+ C 1970'S. RELEASED ON NCAR'S PUBLIC SOFTWARE
375
+ C LIBRARIES IN JANUARY 1980.
376
+ C
377
+ C PORTABILITY FORTRAN 77
378
+ C
379
+ C ALGORITHM THE ROUTINE DEFINES THE FINITE DIFFERENCE
380
+ C EQUATIONS, INCORPORATES BOUNDARY DATA, AND
381
+ C ADJUSTS THE RIGHT SIDE OF SINGULAR SYSTEMS
382
+ C AND THEN CALLS GENBUN TO SOLVE THE SYSTEM.
383
+ C
384
+ C TIMING FOR LARGE M AND N, THE OPERATION COUNT
385
+ C IS ROUGHLY PROPORTIONAL TO
386
+ C M*N*(LOG2(N)
387
+ C BUT ALSO DEPENDS ON INPUT PARAMETERS NBDCND
388
+ C AND MBDCND.
389
+ C
390
+ C ACCURACY THE SOLUTION PROCESS EMPLOYED RESULTS IN A LOSS
391
+ C OF NO MORE THAN THREE SIGNIFICANT DIGITS FOR N
392
+ C AND M AS LARGE AS 64. MORE DETAILS ABOUT
393
+ C ACCURACY CAN BE FOUND IN THE DOCUMENTATION FOR
394
+ C SUBROUTINE GENBUN WHICH IS THE ROUTINE THAT
395
+ C SOLVES THE FINITE DIFFERENCE EQUATIONS.
396
+ C
397
+ C REFERENCES P. N. SWARZTRAUBER, "THE DIRECT SOLUTION OF
398
+ C THE DISCRETE POISSON EQUATION ON THE SURFACE OF
399
+ C A SPHERE", S.I.A.M. J. NUMER. ANAL.,15(1974),
400
+ C PP 212-215.
401
+ C
402
+ C SWARZTRAUBER,P. AND R. SWEET, "EFFICIENT
403
+ C FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
404
+ C ELLIPTIC EQUATIONS", NCAR TN/IA-109, JULY,
405
+ C 1975, 138 PP.
406
+ C***********************************************************************
407
+ DIMENSION F(IDIMF,1) ,BDTS(*) ,BDTF(*) ,BDPS(*) ,
408
+ 1 BDPF(*) ,W(*)
409
+ C
410
+ NBR = NBDCND+1
411
+ PI = PIMACH(DUM)
412
+ TPI = 2.*PI
413
+ IERROR = 0
414
+ IF (TS.LT.0. .OR. TF.GT.PI) IERROR = 1
415
+ IF (TS .GE. TF) IERROR = 2
416
+ IF (MBDCND.LT.1 .OR. MBDCND.GT.9) IERROR = 3
417
+ IF (PS.LT.0. .OR. PF.GT.TPI) IERROR = 4
418
+ IF (PS .GE. PF) IERROR = 5
419
+ IF (N .LT. 5) IERROR = 6
420
+ IF (M .LT. 5) IERROR = 7
421
+ IF (NBDCND.LT.0 .OR. NBDCND.GT.4) IERROR = 8
422
+ IF (ELMBDA .GT. 0.) IERROR = 9
423
+ IF (IDIMF .LT. M+1) IERROR = 10
424
+ IF ((NBDCND.EQ.1 .OR. NBDCND.EQ.2 .OR. NBDCND.EQ.4) .AND.
425
+ 1 MBDCND.GE.5) IERROR = 11
426
+ IF (TS.EQ.0. .AND.
427
+ 1 (MBDCND.EQ.3 .OR. MBDCND.EQ.4 .OR. MBDCND.EQ.8)) IERROR = 12
428
+ IF (TF.EQ.PI .AND.
429
+ 1 (MBDCND.EQ.2 .OR. MBDCND.EQ.3 .OR. MBDCND.EQ.6)) IERROR = 13
430
+ IF ((MBDCND.EQ.5 .OR. MBDCND.EQ.6 .OR. MBDCND.EQ.9) .AND.
431
+ 1 TS.NE.0.) IERROR = 14
432
+ IF (MBDCND.GE.7 .AND. TF.NE.PI) IERROR = 15
433
+ IF (IERROR.NE.0 .AND. IERROR.NE.9) RETURN
434
+ CALL HWSSS1 (TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,N,NBDCND,BDPS,BDPF,
435
+ 1 ELMBDA,F,IDIMF,PERTRB,W,W(M+2),W(2*M+3),W(3*M+4),
436
+ 2 W(4*M+5),W(5*M+6),W(6*M+7))
437
+ W(1) = W(6*M+7)+FLOAT(6*(M+1))
438
+ RETURN
439
+ END
440
+ SUBROUTINE HWSSS1 (TS,TF,M,MBDCND,BDTS,BDTF,PS,PF,N,NBDCND,BDPS,
441
+ 1 BDPF,ELMBDA,F,IDIMF,PERTRB,AM,BM,CM,SN,SS,
442
+ 2 SINT,D)
443
+ DIMENSION F(IDIMF,*) ,BDTS(*) ,BDTF(*) ,BDPS(*) ,
444
+ 1 BDPF(*) ,AM(*) ,BM(*) ,CM(*) ,
445
+ 2 SS(*) ,SN(*) ,D(*) ,SINT(*)
446
+ C
447
+ PI = PIMACH(DUM)
448
+ TPI = PI+PI
449
+ HPI = PI/2.
450
+ MP1 = M+1
451
+ NP1 = N+1
452
+ FN = N
453
+ FM = M
454
+ DTH = (TF-TS)/FM
455
+ HDTH = DTH/2.
456
+ TDT = DTH+DTH
457
+ DPHI = (PF-PS)/FN
458
+ TDP = DPHI+DPHI
459
+ DPHI2 = DPHI*DPHI
460
+ EDP2 = ELMBDA*DPHI2
461
+ DTH2 = DTH*DTH
462
+ CP = 4./(FN*DTH2)
463
+ WP = FN*SIN(HDTH)/4.
464
+ DO 102 I=1,MP1
465
+ FIM1 = I-1
466
+ THETA = FIM1*DTH+TS
467
+ SINT(I) = SIN(THETA)
468
+ IF (SINT(I)) 101,102,101
469
+ 101 T1 = 1./(DTH2*SINT(I))
470
+ AM(I) = T1*SIN(THETA-HDTH)
471
+ CM(I) = T1*SIN(THETA+HDTH)
472
+ BM(I) = -AM(I)-CM(I)+ELMBDA
473
+ 102 CONTINUE
474
+ INP = 0
475
+ ISP = 0
476
+ C
477
+ C BOUNDARY CONDITION AT THETA=TS
478
+ C
479
+ MBR = MBDCND+1
480
+ GO TO (103,104,104,105,105,106,106,104,105,106),MBR
481
+ 103 ITS = 1
482
+ GO TO 107
483
+ 104 AT = AM(2)
484
+ ITS = 2
485
+ GO TO 107
486
+ 105 AT = AM(1)
487
+ ITS = 1
488
+ CM(1) = AM(1)+CM(1)
489
+ GO TO 107
490
+ 106 AT = AM(2)
491
+ INP = 1
492
+ ITS = 2
493
+ C
494
+ C BOUNDARY CONDITION THETA=TF
495
+ C
496
+ 107 GO TO (108,109,110,110,109,109,110,111,111,111),MBR
497
+ 108 ITF = M
498
+ GO TO 112
499
+ 109 CT = CM(M)
500
+ ITF = M
501
+ GO TO 112
502
+ 110 CT = CM(M+1)
503
+ AM(M+1) = AM(M+1)+CM(M+1)
504
+ ITF = M+1
505
+ GO TO 112
506
+ 111 ITF = M
507
+ ISP = 1
508
+ CT = CM(M)
509
+ C
510
+ C COMPUTE HOMOGENEOUS SOLUTION WITH SOLUTION AT POLE EQUAL TO ONE
511
+ C
512
+ 112 ITSP = ITS+1
513
+ ITFM = ITF-1
514
+ WTS = SINT(ITS+1)*AM(ITS+1)/CM(ITS)
515
+ WTF = SINT(ITF-1)*CM(ITF-1)/AM(ITF)
516
+ MUNK = ITF-ITS+1
517
+ IF (ISP) 116,116,113
518
+ 113 D(ITS) = CM(ITS)/BM(ITS)
519
+ DO 114 I=ITSP,M
520
+ D(I) = CM(I)/(BM(I)-AM(I)*D(I-1))
521
+ 114 CONTINUE
522
+ SS(M) = -D(M)
523
+ IID = M-ITS
524
+ DO 115 II=1,IID
525
+ I = M-II
526
+ SS(I) = -D(I)*SS(I+1)
527
+ 115 CONTINUE
528
+ SS(M+1) = 1.
529
+ 116 IF (INP) 120,120,117
530
+ 117 SN(1) = 1.
531
+ D(ITF) = AM(ITF)/BM(ITF)
532
+ IID = ITF-2
533
+ DO 118 II=1,IID
534
+ I = ITF-II
535
+ D(I) = AM(I)/(BM(I)-CM(I)*D(I+1))
536
+ 118 CONTINUE
537
+ SN(2) = -D(2)
538
+ DO 119 I=3,ITF
539
+ SN(I) = -D(I)*SN(I-1)
540
+ 119 CONTINUE
541
+ C
542
+ C BOUNDARY CONDITIONS AT PHI=PS
543
+ C
544
+ 120 NBR = NBDCND+1
545
+ WPS = 1.
546
+ WPF = 1.
547
+ GO TO (121,122,122,123,123),NBR
548
+ 121 JPS = 1
549
+ GO TO 124
550
+ 122 JPS = 2
551
+ GO TO 124
552
+ 123 JPS = 1
553
+ WPS = .5
554
+ C
555
+ C BOUNDARY CONDITION AT PHI=PF
556
+ C
557
+ 124 GO TO (125,126,127,127,126),NBR
558
+ 125 JPF = N
559
+ GO TO 128
560
+ 126 JPF = N
561
+ GO TO 128
562
+ 127 WPF = .5
563
+ JPF = N+1
564
+ 128 JPSP = JPS+1
565
+ JPFM = JPF-1
566
+ NUNK = JPF-JPS+1
567
+ FJJ = JPFM-JPSP+1
568
+ C
569
+ C SCALE COEFFICIENTS FOR SUBROUTINE GENBUN
570
+ C
571
+ DO 129 I=ITS,ITF
572
+ CF = DPHI2*SINT(I)*SINT(I)
573
+ AM(I) = CF*AM(I)
574
+ BM(I) = CF*BM(I)
575
+ CM(I) = CF*CM(I)
576
+ 129 CONTINUE
577
+ AM(ITS) = 0.
578
+ CM(ITF) = 0.
579
+ ISING = 0
580
+ GO TO (130,138,138,130,138,138,130,138,130,130),MBR
581
+ 130 GO TO (131,138,138,131,138),NBR
582
+ 131 IF (ELMBDA) 138,132,132
583
+ 132 ISING = 1
584
+ SUM = WTS*WPS+WTS*WPF+WTF*WPS+WTF*WPF
585
+ IF (INP) 134,134,133
586
+ 133 SUM = SUM+WP
587
+ 134 IF (ISP) 136,136,135
588
+ 135 SUM = SUM+WP
589
+ 136 SUM1 = 0.
590
+ DO 137 I=ITSP,ITFM
591
+ SUM1 = SUM1+SINT(I)
592
+ 137 CONTINUE
593
+ SUM = SUM+FJJ*(SUM1+WTS+WTF)
594
+ SUM = SUM+(WPS+WPF)*SUM1
595
+ HNE = SUM
596
+ 138 GO TO (146,142,142,144,144,139,139,142,144,139),MBR
597
+ 139 IF (NBDCND-3) 146,140,146
598
+ 140 YHLD = F(1,JPS)-4./(FN*DPHI*DTH2)*(BDPF(2)-BDPS(2))
599
+ DO 141 J=1,NP1
600
+ F(1,J) = YHLD
601
+ 141 CONTINUE
602
+ GO TO 146
603
+ 142 DO 143 J=JPS,JPF
604
+ F(2,J) = F(2,J)-AT*F(1,J)
605
+ 143 CONTINUE
606
+ GO TO 146
607
+ 144 DO 145 J=JPS,JPF
608
+ F(1,J) = F(1,J)+TDT*BDTS(J)*AT
609
+ 145 CONTINUE
610
+ 146 GO TO (154,150,152,152,150,150,152,147,147,147),MBR
611
+ 147 IF (NBDCND-3) 154,148,154
612
+ 148 YHLD = F(M+1,JPS)-4./(FN*DPHI*DTH2)*(BDPF(M)-BDPS(M))
613
+ DO 149 J=1,NP1
614
+ F(M+1,J) = YHLD
615
+ 149 CONTINUE
616
+ GO TO 154
617
+ 150 DO 151 J=JPS,JPF
618
+ F(M,J) = F(M,J)-CT*F(M+1,J)
619
+ 151 CONTINUE
620
+ GO TO 154
621
+ 152 DO 153 J=JPS,JPF
622
+ F(M+1,J) = F(M+1,J)-TDT*BDTF(J)*CT
623
+ 153 CONTINUE
624
+ 154 GO TO (159,155,155,157,157),NBR
625
+ 155 DO 156 I=ITS,ITF
626
+ F(I,2) = F(I,2)-F(I,1)/(DPHI2*SINT(I)*SINT(I))
627
+ 156 CONTINUE
628
+ GO TO 159
629
+ 157 DO 158 I=ITS,ITF
630
+ F(I,1) = F(I,1)+TDP*BDPS(I)/(DPHI2*SINT(I)*SINT(I))
631
+ 158 CONTINUE
632
+ 159 GO TO (164,160,162,162,160),NBR
633
+ 160 DO 161 I=ITS,ITF
634
+ F(I,N) = F(I,N)-F(I,N+1)/(DPHI2*SINT(I)*SINT(I))
635
+ 161 CONTINUE
636
+ GO TO 164
637
+ 162 DO 163 I=ITS,ITF
638
+ F(I,N+1) = F(I,N+1)-TDP*BDPF(I)/(DPHI2*SINT(I)*SINT(I))
639
+ 163 CONTINUE
640
+ 164 CONTINUE
641
+ PERTRB = 0.
642
+ IF (ISING) 165,176,165
643
+ 165 SUM = WTS*WPS*F(ITS,JPS)+WTS*WPF*F(ITS,JPF)+WTF*WPS*F(ITF,JPS)+
644
+ 1 WTF*WPF*F(ITF,JPF)
645
+ IF (INP) 167,167,166
646
+ 166 SUM = SUM+WP*F(1,JPS)
647
+ 167 IF (ISP) 169,169,168
648
+ 168 SUM = SUM+WP*F(M+1,JPS)
649
+ 169 DO 171 I=ITSP,ITFM
650
+ SUM1 = 0.
651
+ DO 170 J=JPSP,JPFM
652
+ SUM1 = SUM1+F(I,J)
653
+ 170 CONTINUE
654
+ SUM = SUM+SINT(I)*SUM1
655
+ 171 CONTINUE
656
+ SUM1 = 0.
657
+ SUM2 = 0.
658
+ DO 172 J=JPSP,JPFM
659
+ SUM1 = SUM1+F(ITS,J)
660
+ SUM2 = SUM2+F(ITF,J)
661
+ 172 CONTINUE
662
+ SUM = SUM+WTS*SUM1+WTF*SUM2
663
+ SUM1 = 0.
664
+ SUM2 = 0.
665
+ DO 173 I=ITSP,ITFM
666
+ SUM1 = SUM1+SINT(I)*F(I,JPS)
667
+ SUM2 = SUM2+SINT(I)*F(I,JPF)
668
+ 173 CONTINUE
669
+ SUM = SUM+WPS*SUM1+WPF*SUM2
670
+ PERTRB = SUM/HNE
671
+ DO 175 J=1,NP1
672
+ DO 174 I=1,MP1
673
+ F(I,J) = F(I,J)-PERTRB
674
+ 174 CONTINUE
675
+ 175 CONTINUE
676
+ C
677
+ C SCALE RIGHT SIDE FOR SUBROUTINE GENBUN
678
+ C
679
+ 176 DO 178 I=ITS,ITF
680
+ CF = DPHI2*SINT(I)*SINT(I)
681
+ DO 177 J=JPS,JPF
682
+ F(I,J) = CF*F(I,J)
683
+ 177 CONTINUE
684
+ 178 CONTINUE
685
+ CALL GENBUN (NBDCND,NUNK,1,MUNK,AM(ITS),BM(ITS),CM(ITS),IDIMF,
686
+ 1 F(ITS,JPS),IERROR,D)
687
+ IF (ISING) 186,186,179
688
+ 179 IF (INP) 183,183,180
689
+ 180 IF (ISP) 181,181,186
690
+ 181 DO 182 J=1,NP1
691
+ F(1,J) = 0.
692
+ 182 CONTINUE
693
+ GO TO 209
694
+ 183 IF (ISP) 186,186,184
695
+ 184 DO 185 J=1,NP1
696
+ F(M+1,J) = 0.
697
+ 185 CONTINUE
698
+ GO TO 209
699
+ 186 IF (INP) 193,193,187
700
+ 187 SUM = WPS*F(ITS,JPS)+WPF*F(ITS,JPF)
701
+ DO 188 J=JPSP,JPFM
702
+ SUM = SUM+F(ITS,J)
703
+ 188 CONTINUE
704
+ DFN = CP*SUM
705
+ DNN = CP*((WPS+WPF+FJJ)*(SN(2)-1.))+ELMBDA
706
+ DSN = CP*(WPS+WPF+FJJ)*SN(M)
707
+ IF (ISP) 189,189,194
708
+ 189 CNP = (F(1,1)-DFN)/DNN
709
+ DO 191 I=ITS,ITF
710
+ HLD = CNP*SN(I)
711
+ DO 190 J=JPS,JPF
712
+ F(I,J) = F(I,J)+HLD
713
+ 190 CONTINUE
714
+ 191 CONTINUE
715
+ DO 192 J=1,NP1
716
+ F(1,J) = CNP
717
+ 192 CONTINUE
718
+ GO TO 209
719
+ 193 IF (ISP) 209,209,194
720
+ 194 SUM = WPS*F(ITF,JPS)+WPF*F(ITF,JPF)
721
+ DO 195 J=JPSP,JPFM
722
+ SUM = SUM+F(ITF,J)
723
+ 195 CONTINUE
724
+ DFS = CP*SUM
725
+ DSS = CP*((WPS+WPF+FJJ)*(SS(M)-1.))+ELMBDA
726
+ DNS = CP*(WPS+WPF+FJJ)*SS(2)
727
+ IF (INP) 196,196,200
728
+ 196 CSP = (F(M+1,1)-DFS)/DSS
729
+ DO 198 I=ITS,ITF
730
+ HLD = CSP*SS(I)
731
+ DO 197 J=JPS,JPF
732
+ F(I,J) = F(I,J)+HLD
733
+ 197 CONTINUE
734
+ 198 CONTINUE
735
+ DO 199 J=1,NP1
736
+ F(M+1,J) = CSP
737
+ 199 CONTINUE
738
+ GO TO 209
739
+ 200 RTN = F(1,1)-DFN
740
+ RTS = F(M+1,1)-DFS
741
+ IF (ISING) 202,202,201
742
+ 201 CSP = 0.
743
+ CNP = RTN/DNN
744
+ GO TO 205
745
+ 202 IF (ABS(DNN)-ABS(DSN)) 204,204,203
746
+ 203 DEN = DSS-DNS*DSN/DNN
747
+ RTS = RTS-RTN*DSN/DNN
748
+ CSP = RTS/DEN
749
+ CNP = (RTN-CSP*DNS)/DNN
750
+ GO TO 205
751
+ 204 DEN = DNS-DSS*DNN/DSN
752
+ RTN = RTN-RTS*DNN/DSN
753
+ CSP = RTN/DEN
754
+ CNP = (RTS-DSS*CSP)/DSN
755
+ 205 DO 207 I=ITS,ITF
756
+ HLD = CNP*SN(I)+CSP*SS(I)
757
+ DO 206 J=JPS,JPF
758
+ F(I,J) = F(I,J)+HLD
759
+ 206 CONTINUE
760
+ 207 CONTINUE
761
+ DO 208 J=1,NP1
762
+ F(1,J) = CNP
763
+ F(M+1,J) = CSP
764
+ 208 CONTINUE
765
+ 209 IF (NBDCND) 212,210,212
766
+ 210 DO 211 I=1,MP1
767
+ F(I,JPF+1) = F(I,JPS)
768
+ 211 CONTINUE
769
+ 212 RETURN
770
+ C
771
+ C REVISION HISTORY---
772
+ C
773
+ C SEPTEMBER 1973 VERSION 1
774
+ C APRIL 1976 VERSION 2
775
+ C JANUARY 1978 VERSION 3
776
+ C DECEMBER 1979 VERSION 3.1
777
+ C FEBRUARY 1985 DOCUMENTATION UPGRADE
778
+ C NOVEMBER 1988 VERSION 3.2, FORTRAN 77 CHANGES
779
+ C-----------------------------------------------------------------------
780
+ END