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,1029 @@
1
+ C
2
+ C file sepeli.f
3
+ C
4
+ SUBROUTINE SEPELI (INTL,IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,BETA,C,
5
+ 1 D,N,NBDCND,BDC,GAMA,BDD,XNU,COFX,COFY,GRHS,
6
+ 2 USOL,IDMN,W,PERTRB,IERROR)
7
+ C
8
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
9
+ C * *
10
+ C * copyright (c) 1999 by UCAR *
11
+ C * *
12
+ C * UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH *
13
+ C * *
14
+ C * all rights reserved *
15
+ C * *
16
+ C * FISHPACK version 4.1 *
17
+ C * *
18
+ C * A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF *
19
+ C * *
20
+ C * SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS *
21
+ C * *
22
+ C * BY *
23
+ C * *
24
+ C * JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET *
25
+ C * *
26
+ C * OF *
27
+ C * *
28
+ C * THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH *
29
+ C * *
30
+ C * BOULDER, COLORADO (80307) U.S.A. *
31
+ C * *
32
+ C * WHICH IS SPONSORED BY *
33
+ C * *
34
+ C * THE NATIONAL SCIENCE FOUNDATION *
35
+ C * *
36
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
37
+ C
38
+ C
39
+ C
40
+ C DIMENSION OF BDA(N+1), BDB(N+1), BDC(M+1), BDD(M+1),
41
+ C ARGUMENTS USOL(IDMN,N+1),GRHS(IDMN,N+1),
42
+ C W (SEE ARGUMENT LIST)
43
+ C
44
+ C LATEST REVISION NOVEMBER 1988
45
+ C
46
+ C PURPOSE SEPELI SOLVES FOR EITHER THE SECOND-ORDER
47
+ C FINITE DIFFERENCE APPROXIMATION OR A
48
+ C FOURTH-ORDER APPROXIMATION TO A SEPARABLE
49
+ C ELLIPTIC EQUATION
50
+ C
51
+ C 2 2
52
+ C AF(X)*D U/DX + BF(X)*DU/DX + CF(X)*U +
53
+ C 2 2
54
+ C DF(Y)*D U/DY + EF(Y)*DU/DY + FF(Y)*U
55
+ C
56
+ C = G(X,Y)
57
+ C
58
+ C ON A RECTANGLE (X GREATER THAN OR EQUAL TO A
59
+ C AND LESS THAN OR EQUAL TO B; Y GREATER THAN
60
+ C OR EQUAL TO C AND LESS THAN OR EQUAL TO D).
61
+ C ANY COMBINATION OF PERIODIC OR MIXED BOUNDARY
62
+ C CONDITIONS IS ALLOWED.
63
+ C
64
+ C THE POSSIBLE BOUNDARY CONDITIONS ARE:
65
+ C IN THE X-DIRECTION:
66
+ C (0) PERIODIC, U(X+B-A,Y)=U(X,Y) FOR ALL
67
+ C Y,X (1) U(A,Y), U(B,Y) ARE SPECIFIED FOR
68
+ C ALL Y
69
+ C (2) U(A,Y), DU(B,Y)/DX+BETA*U(B,Y) ARE
70
+ C SPECIFIED FOR ALL Y
71
+ C (3) DU(A,Y)/DX+ALPHA*U(A,Y),DU(B,Y)/DX+
72
+ C BETA*U(B,Y) ARE SPECIFIED FOR ALL Y
73
+ C (4) DU(A,Y)/DX+ALPHA*U(A,Y),U(B,Y) ARE
74
+ C SPECIFIED FOR ALL Y
75
+ C
76
+ C IN THE Y-DIRECTION:
77
+ C (0) PERIODIC, U(X,Y+D-C)=U(X,Y) FOR ALL X,Y
78
+ C (1) U(X,C),U(X,D) ARE SPECIFIED FOR ALL X
79
+ C (2) U(X,C),DU(X,D)/DY+XNU*U(X,D) ARE
80
+ C SPECIFIED FOR ALL X
81
+ C (3) DU(X,C)/DY+GAMA*U(X,C),DU(X,D)/DY+
82
+ C XNU*U(X,D) ARE SPECIFIED FOR ALL X
83
+ C (4) DU(X,C)/DY+GAMA*U(X,C),U(X,D) ARE
84
+ C SPECIFIED FOR ALL X
85
+ C
86
+ C USAGE CALL SEPELI (INTL,IORDER,A,B,M,MBDCND,BDA,
87
+ C ALPHA,BDB,BETA,C,D,N,NBDCND,BDC,
88
+ C GAMA,BDD,XNU,COFX,COFY,GRHS,USOL,
89
+ C IDMN,W,PERTRB,IERROR)
90
+ C
91
+ C ARGUMENTS
92
+ C ON INPUT INTL
93
+ C = 0 ON INITIAL ENTRY TO SEPELI OR IF ANY
94
+ C OF THE ARGUMENTS C,D, N, NBDCND, COFY
95
+ C ARE CHANGED FROM A PREVIOUS CALL
96
+ C = 1 IF C, D, N, NBDCND, COFY ARE UNCHANGED
97
+ C FROM THE PREVIOUS CALL.
98
+ C
99
+ C IORDER
100
+ C = 2 IF A SECOND-ORDER APPROXIMATION
101
+ C IS SOUGHT
102
+ C = 4 IF A FOURTH-ORDER APPROXIMATION
103
+ C IS SOUGHT
104
+ C
105
+ C A,B
106
+ C THE RANGE OF THE X-INDEPENDENT VARIABLE,
107
+ C I.E., X IS GREATER THAN OR EQUAL TO A
108
+ C AND LESS THAN OR EQUAL TO B. A MUST BE
109
+ C LESS THAN B.
110
+ C
111
+ C M
112
+ C THE NUMBER OF PANELS INTO WHICH THE
113
+ C INTERVAL [A,B] IS SUBDIVIDED. HENCE,
114
+ C THERE WILL BE M+1 GRID POINTS IN THE X-
115
+ C DIRECTION GIVEN BY XI=A+(I-1)*DLX
116
+ C FOR I=1,2,...,M+1 WHERE DLX=(B-A)/M IS
117
+ C THE PANEL WIDTH. M MUST BE LESS THAN
118
+ C IDMN AND GREATER THAN 5.
119
+ C
120
+ C MBDCND
121
+ C INDICATES THE TYPE OF BOUNDARY CONDITION
122
+ C AT X=A AND X=B
123
+ C
124
+ C = 0 IF THE SOLUTION IS PERIODIC IN X, I.E.,
125
+ C U(X+B-A,Y)=U(X,Y) FOR ALL Y,X
126
+ C = 1 IF THE SOLUTION IS SPECIFIED AT X=A
127
+ C AND X=B, I.E., U(A,Y) AND U(B,Y) ARE
128
+ C SPECIFIED FOR ALL Y
129
+ C = 2 IF THE SOLUTION IS SPECIFIED AT X=A AND
130
+ C THE BOUNDARY CONDITION IS MIXED AT X=B,
131
+ C I.E., U(A,Y) AND DU(B,Y)/DX+BETA*U(B,Y)
132
+ C ARE SPECIFIED FOR ALL Y
133
+ C = 3 IF THE BOUNDARY CONDITIONS AT X=A AND
134
+ C X=B ARE MIXED, I.E.,
135
+ C DU(A,Y)/DX+ALPHA*U(A,Y) AND
136
+ C DU(B,Y)/DX+BETA*U(B,Y) ARE SPECIFIED
137
+ C FOR ALL Y
138
+ C = 4 IF THE BOUNDARY CONDITION AT X=A IS
139
+ C MIXED AND THE SOLUTION IS SPECIFIED
140
+ C AT X=B, I.E., DU(A,Y)/DX+ALPHA*U(A,Y)
141
+ C AND U(B,Y) ARE SPECIFIED FOR ALL Y
142
+ C
143
+ C BDA
144
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH N+1
145
+ C THAT SPECIFIES THE VALUES OF
146
+ C DU(A,Y)/DX+ ALPHA*U(A,Y) AT X=A, WHEN
147
+ C MBDCND=3 OR 4.
148
+ C BDA(J) = DU(A,YJ)/DX+ALPHA*U(A,YJ),
149
+ C J=1,2,...,N+1. WHEN MBDCND HAS ANY OTHER
150
+ C OTHER VALUE, BDA IS A DUMMY PARAMETER.
151
+ C
152
+ C ALPHA
153
+ C THE SCALAR MULTIPLYING THE SOLUTION IN
154
+ C CASE OF A MIXED BOUNDARY CONDITION AT X=A
155
+ C (SEE ARGUMENT BDA). IF MBDCND IS NOT
156
+ C EQUAL TO 3 OR 4 THEN ALPHA IS A DUMMY
157
+ C PARAMETER.
158
+ C
159
+ C BDB
160
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH N+1
161
+ C THAT SPECIFIES THE VALUES OF
162
+ C DU(B,Y)/DX+ BETA*U(B,Y) AT X=B.
163
+ C WHEN MBDCND=2 OR 3
164
+ C BDB(J) = DU(B,YJ)/DX+BETA*U(B,YJ),
165
+ C J=1,2,...,N+1. WHEN MBDCND HAS ANY OTHER
166
+ C OTHER VALUE, BDB IS A DUMMY PARAMETER.
167
+ C
168
+ C BETA
169
+ C THE SCALAR MULTIPLYING THE SOLUTION IN
170
+ C CASE OF A MIXED BOUNDARY CONDITION AT
171
+ C X=B (SEE ARGUMENT BDB). IF MBDCND IS
172
+ C NOT EQUAL TO 2 OR 3 THEN BETA IS A DUMMY
173
+ C PARAMETER.
174
+ C
175
+ C C,D
176
+ C THE RANGE OF THE Y-INDEPENDENT VARIABLE,
177
+ C I.E., Y IS GREATER THAN OR EQUAL TO C
178
+ C AND LESS THAN OR EQUAL TO D. C MUST BE
179
+ C LESS THAN D.
180
+ C
181
+ C N
182
+ C THE NUMBER OF PANELS INTO WHICH THE
183
+ C INTERVAL [C,D] IS SUBDIVIDED.
184
+ C HENCE, THERE WILL BE N+1 GRID POINTS
185
+ C IN THE Y-DIRECTION GIVEN BY
186
+ C YJ=C+(J-1)*DLY FOR J=1,2,...,N+1 WHERE
187
+ C DLY=(D-C)/N IS THE PANEL WIDTH.
188
+ C IN ADDITION, N MUST BE GREATER THAN 4.
189
+ C
190
+ C NBDCND
191
+ C INDICATES THE TYPES OF BOUNDARY CONDITIONS
192
+ C AT Y=C AND Y=D
193
+ C
194
+ C = 0 IF THE SOLUTION IS PERIODIC IN Y,
195
+ C I.E., U(X,Y+D-C)=U(X,Y) FOR ALL X,Y
196
+ C = 1 IF THE SOLUTION IS SPECIFIED AT Y=C
197
+ C AND Y = D, I.E., U(X,C) AND U(X,D)
198
+ C ARE SPECIFIED FOR ALL X
199
+ C = 2 IF THE SOLUTION IS SPECIFIED AT Y=C
200
+ C AND THE BOUNDARY CONDITION IS MIXED
201
+ C AT Y=D, I.E., U(X,C) AND
202
+ C DU(X,D)/DY+XNU*U(X,D) ARE SPECIFIED
203
+ C FOR ALL X
204
+ C = 3 IF THE BOUNDARY CONDITIONS ARE MIXED
205
+ C AT Y=C AND Y=D, I.E.,
206
+ C DU(X,D)/DY+GAMA*U(X,C) AND
207
+ C DU(X,D)/DY+XNU*U(X,D) ARE SPECIFIED
208
+ C FOR ALL X
209
+ C = 4 IF THE BOUNDARY CONDITION IS MIXED
210
+ C AT Y=C AND THE SOLUTION IS SPECIFIED
211
+ C AT Y=D, I.E. DU(X,C)/DY+GAMA*U(X,C)
212
+ C AND U(X,D) ARE SPECIFIED FOR ALL X
213
+ C
214
+ C BDC
215
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH M+1
216
+ C THAT SPECIFIES THE VALUE OF
217
+ C DU(X,C)/DY+GAMA*U(X,C) AT Y=C.
218
+ C WHEN NBDCND=3 OR 4 BDC(I) = DU(XI,C)/DY +
219
+ C GAMA*U(XI,C), I=1,2,...,M+1.
220
+ C WHEN NBDCND HAS ANY OTHER VALUE, BDC
221
+ C IS A DUMMY PARAMETER.
222
+ C
223
+ C GAMA
224
+ C THE SCALAR MULTIPLYING THE SOLUTION IN
225
+ C CASE OF A MIXED BOUNDARY CONDITION AT
226
+ C Y=C (SEE ARGUMENT BDC). IF NBDCND IS
227
+ C NOT EQUAL TO 3 OR 4 THEN GAMA IS A DUMMY
228
+ C PARAMETER.
229
+ C
230
+ C BDD
231
+ C A ONE-DIMENSIONAL ARRAY OF LENGTH M+1
232
+ C THAT SPECIFIES THE VALUE OF
233
+ C DU(X,D)/DY + XNU*U(X,D) AT Y=C.
234
+ C WHEN NBDCND=2 OR 3 BDD(I) = DU(XI,D)/DY +
235
+ C XNU*U(XI,D), I=1,2,...,M+1.
236
+ C WHEN NBDCND HAS ANY OTHER VALUE, BDD
237
+ C IS A DUMMY PARAMETER.
238
+ C
239
+ C XNU
240
+ C THE SCALAR MULTIPLYING THE SOLUTION IN
241
+ C CASE OF A MIXED BOUNDARY CONDITION AT
242
+ C Y=D (SEE ARGUMENT BDD). IF NBDCND IS
243
+ C NOT EQUAL TO 2 OR 3 THEN XNU IS A
244
+ C DUMMY PARAMETER.
245
+ C
246
+ C COFX
247
+ C A USER-SUPPLIED SUBPROGRAM WITH
248
+ C PARAMETERS X, AFUN, BFUN, CFUN WHICH
249
+ C RETURNS THE VALUES OF THE X-DEPENDENT
250
+ C COEFFICIENTS AF(X), BF(X), CF(X) IN THE
251
+ C ELLIPTIC EQUATION AT X.
252
+ C
253
+ C COFY
254
+ C A USER-SUPPLIED SUBPROGRAM WITH PARAMETERS
255
+ C Y, DFUN, EFUN, FFUN WHICH RETURNS THE
256
+ C VALUES OF THE Y-DEPENDENT COEFFICIENTS
257
+ C DF(Y), EF(Y), FF(Y) IN THE ELLIPTIC
258
+ C EQUATION AT Y.
259
+ C
260
+ C NOTE: COFX AND COFY MUST BE DECLARED
261
+ C EXTERNAL IN THE CALLING ROUTINE.
262
+ C THE VALUES RETURNED IN AFUN AND DFUN
263
+ C MUST SATISFY AFUN*DFUN GREATER THAN 0
264
+ C FOR A LESS THAN X LESS THAN B, C LESS
265
+ C THAN Y LESS THAN D (SEE IERROR=10).
266
+ C THE COEFFICIENTS PROVIDED MAY LEAD TO A
267
+ C MATRIX EQUATION WHICH IS NOT DIAGONALLY
268
+ C DOMINANT IN WHICH CASE SOLUTION MAY FAIL
269
+ C (SEE IERROR=4).
270
+ C
271
+ C GRHS
272
+ C A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
273
+ C VALUES OF THE RIGHT-HAND SIDE OF THE
274
+ C ELLIPTIC EQUATION, I.E.,
275
+ C GRHS(I,J)=G(XI,YI), FOR I=2,...,M,
276
+ C J=2,...,N. AT THE BOUNDARIES, GRHS IS
277
+ C DEFINED BY
278
+ C
279
+ C MBDCND GRHS(1,J) GRHS(M+1,J)
280
+ C ------ --------- -----------
281
+ C 0 G(A,YJ) G(B,YJ)
282
+ C 1 * *
283
+ C 2 * G(B,YJ) J=1,2,...,N+1
284
+ C 3 G(A,YJ) G(B,YJ)
285
+ C 4 G(A,YJ) *
286
+ C
287
+ C NBDCND GRHS(I,1) GRHS(I,N+1)
288
+ C ------ --------- -----------
289
+ C 0 G(XI,C) G(XI,D)
290
+ C 1 * *
291
+ C 2 * G(XI,D) I=1,2,...,M+1
292
+ C 3 G(XI,C) G(XI,D)
293
+ C 4 G(XI,C) *
294
+ C
295
+ C WHERE * MEANS THESE QUANTITIES ARE NOT USED.
296
+ C GRHS SHOULD BE DIMENSIONED IDMN BY AT LEAST
297
+ C N+1 IN THE CALLING ROUTINE.
298
+ C
299
+ C USOL
300
+ C A TWO-DIMENSIONAL ARRAY THAT SPECIFIES THE
301
+ C VALUES OF THE SOLUTION ALONG THE BOUNDARIES.
302
+ C AT THE BOUNDARIES, USOL IS DEFINED BY
303
+ C
304
+ C MBDCND USOL(1,J) USOL(M+1,J)
305
+ C ------ --------- -----------
306
+ C 0 * *
307
+ C 1 U(A,YJ) U(B,YJ)
308
+ C 2 U(A,YJ) * J=1,2,...,N+1
309
+ C 3 * *
310
+ C 4 * U(B,YJ)
311
+ C
312
+ C NBDCND USOL(I,1) USOL(I,N+1)
313
+ C ------ --------- -----------
314
+ C 0 * *
315
+ C 1 U(XI,C) U(XI,D)
316
+ C 2 U(XI,C) * I=1,2,...,M+1
317
+ C 3 * *
318
+ C 4 * U(XI,D)
319
+ C
320
+ C WHERE * MEANS THE QUANTITIES ARE NOT USED
321
+ C IN THE SOLUTION.
322
+ C
323
+ C IF IORDER=2, THE USER MAY EQUIVALENCE GRHS
324
+ C AND USOL TO SAVE SPACE. NOTE THAT IN THIS
325
+ C CASE THE TABLES SPECIFYING THE BOUNDARIES
326
+ C OF THE GRHS AND USOL ARRAYS DETERMINE THE
327
+ C BOUNDARIES UNIQUELY EXCEPT AT THE CORNERS.
328
+ C IF THE TABLES CALL FOR BOTH G(X,Y) AND
329
+ C U(X,Y) AT A CORNER THEN THE SOLUTION MUST
330
+ C BE CHOSEN. FOR EXAMPLE, IF MBDCND=2 AND
331
+ C NBDCND=4, THEN U(A,C), U(A,D), U(B,D) MUST
332
+ C BE CHOSEN AT THE CORNERS IN ADDITION
333
+ C TO G(B,C).
334
+ C
335
+ C IF IORDER=4, THEN THE TWO ARRAYS, USOL AND
336
+ C GRHS, MUST BE DISTINCT.
337
+ C
338
+ C USOL SHOULD BE DIMENSIONED IDMN BY AT LEAST
339
+ C N+1 IN THE CALLING ROUTINE.
340
+ C
341
+ C IDMN
342
+ C THE ROW (OR FIRST) DIMENSION OF THE ARRAYS
343
+ C GRHS AND USOL AS IT APPEARS IN THE PROGRAM
344
+ C CALLING SEPELI. THIS PARAMETER IS USED
345
+ C TO SPECIFY THE VARIABLE DIMENSION OF GRHS
346
+ C AND USOL. IDMN MUST BE AT LEAST 7 AND
347
+ C GREATER THAN OR EQUAL TO M+1.
348
+ C
349
+ C W
350
+ C A ONE-DIMENSIONAL ARRAY THAT MUST BE
351
+ C PROVIDED BY THE USER FOR WORK SPACE.
352
+ C LET K=INT(LOG2(N+1))+1 AND SET L=2**(K+1).
353
+ C THEN (K-2)*L+K+10*N+12*M+27 WILL SUFFICE
354
+ C AS A LENGTH OF W. THE ACTUAL LENGTH OF W
355
+ C IN THE CALLING ROUTINE MUST BE SET IN W(1)
356
+ C (SEE IERROR=11).
357
+ C
358
+ C ON OUTPUT USOL
359
+ C CONTAINS THE APPROXIMATE SOLUTION TO THE
360
+ C ELLIPTIC EQUATION.
361
+ C USOL(I,J) IS THE APPROXIMATION TO U(XI,YJ)
362
+ C FOR I=1,2...,M+1 AND J=1,2,...,N+1.
363
+ C THE APPROXIMATION HAS ERROR
364
+ C O(DLX**2+DLY**2) IF CALLED WITH IORDER=2
365
+ C AND O(DLX**4+DLY**4) IF CALLED WITH
366
+ C IORDER=4.
367
+ C
368
+ C W
369
+ C CONTAINS INTERMEDIATE VALUES THAT MUST NOT
370
+ C BE DESTROYED IF SEPELI IS CALLED AGAIN WITH
371
+ C INTL=1. IN ADDITION W(1) CONTAINS THE
372
+ C EXACT MINIMAL LENGTH (IN FLOATING POINT)
373
+ C REQUIRED FOR THE WORK SPACE (SEE IERROR=11).
374
+ C
375
+ C PERTRB
376
+ C IF A COMBINATION OF PERIODIC OR DERIVATIVE
377
+ C BOUNDARY CONDITIONS
378
+ C (I.E., ALPHA=BETA=0 IF MBDCND=3;
379
+ C GAMA=XNU=0 IF NBDCND=3) IS SPECIFIED
380
+ C AND IF THE COEFFICIENTS OF U(X,Y) IN THE
381
+ C SEPARABLE ELLIPTIC EQUATION ARE ZERO
382
+ C (I.E., CF(X)=0 FOR X GREATER THAN OR EQUAL
383
+ C TO A AND LESS THAN OR EQUAL TO B;
384
+ C FF(Y)=0 FOR Y GREATER THAN OR EQUAL TO C
385
+ C AND LESS THAN OR EQUAL TO D) THEN A
386
+ C SOLUTION MAY NOT EXIST. PERTRB IS A
387
+ C CONSTANT CALCULATED AND SUBTRACTED FROM
388
+ C THE RIGHT-HAND SIDE OF THE MATRIX EQUATIONS
389
+ C GENERATED BY SEPELI WHICH INSURES THAT A
390
+ C SOLUTION EXISTS. SEPELI THEN COMPUTES THIS
391
+ C SOLUTION WHICH IS A WEIGHTED MINIMAL LEAST
392
+ C SQUARES SOLUTION TO THE ORIGINAL PROBLEM.
393
+ C
394
+ C IERROR
395
+ C AN ERROR FLAG THAT INDICATES INVALID INPUT
396
+ C PARAMETERS OR FAILURE TO FIND A SOLUTION
397
+ C = 0 NO ERROR
398
+ C = 1 IF A GREATER THAN B OR C GREATER THAN D
399
+ C = 2 IF MBDCND LESS THAN 0 OR MBDCND GREATER
400
+ C THAN 4
401
+ C = 3 IF NBDCND LESS THAN 0 OR NBDCND GREATER
402
+ C THAN 4
403
+ C = 4 IF ATTEMPT TO FIND A SOLUTION FAILS.
404
+ C (THE LINEAR SYSTEM GENERATED IS NOT
405
+ C DIAGONALLY DOMINANT.)
406
+ C = 5 IF IDMN IS TOO SMALL
407
+ C (SEE DISCUSSION OF IDMN)
408
+ C = 6 IF M IS TOO SMALL OR TOO LARGE
409
+ C (SEE DISCUSSION OF M)
410
+ C = 7 IF N IS TOO SMALL (SEE DISCUSSION OF N)
411
+ C = 8 IF IORDER IS NOT 2 OR 4
412
+ C = 9 IF INTL IS NOT 0 OR 1
413
+ C = 10 IF AFUN*DFUN LESS THAN OR EQUAL TO 0
414
+ C FOR SOME INTERIOR MESH POINT (XI,YJ)
415
+ C = 11 IF THE WORK SPACE LENGTH INPUT IN W(1)
416
+ C IS LESS THAN THE EXACT MINIMAL WORK
417
+ C SPACE LENGTH REQUIRED OUTPUT IN W(1).
418
+ C
419
+ C NOTE (CONCERNING IERROR=4): FOR THE
420
+ C COEFFICIENTS INPUT THROUGH COFX, COFY,
421
+ C THE DISCRETIZATION MAY LEAD TO A BLOCK
422
+ C TRIDIAGONAL LINEAR SYSTEM WHICH IS NOT
423
+ C DIAGONALLY DOMINANT (FOR EXAMPLE, THIS
424
+ C HAPPENS IF CFUN=0 AND BFUN/(2.*DLX) GREATER
425
+ C THAN AFUN/DLX**2). IN THIS CASE SOLUTION
426
+ C MAY FAIL. THIS CANNOT HAPPEN IN THE LIMIT
427
+ C AS DLX, DLY APPROACH ZERO. HENCE, THE
428
+ C CONDITION MAY BE REMEDIED BY TAKING LARGER
429
+ C VALUES FOR M OR N.
430
+ C
431
+ C SPECIAL CONDITIONS SEE COFX, COFY ARGUMENT DESCRIPTIONS ABOVE.
432
+ C
433
+ C I/O NONE
434
+ C
435
+ C PRECISION SINGLE
436
+ C
437
+ C REQUIRED LIBRARY BLKTRI, COMF, AND SEPAUX
438
+ C FILES FROM FISHPACK
439
+ C
440
+ C LANGUAGE FORTRAN
441
+ C
442
+ C HISTORY DEVELOPED AT NCAR DURING 1975-76 BY
443
+ C JOHN C. ADAMS OF THE SCIENTIFIC COMPUTING
444
+ C DIVISION. RELEASED ON NCAR'S PUBLIC SOFTWARE
445
+ C LIBRARIES IN JANUARY 1980.
446
+ C
447
+ C PORTABILITY FORTRAN 77
448
+ C
449
+ C ALGORITHM SEPELI AUTOMATICALLY DISCRETIZES THE
450
+ C SEPARABLE ELLIPTIC EQUATION WHICH IS THEN
451
+ C SOLVED BY A GENERALIZED CYCLIC REDUCTION
452
+ C ALGORITHM IN THE SUBROUTINE, BLKTRI. THE
453
+ C FOURTH-ORDER SOLUTION IS OBTAINED USING
454
+ C 'DEFERRED CORRECTIONS' WHICH IS DESCRIBED
455
+ C AND REFERENCED IN SECTIONS, REFERENCES AND
456
+ C METHOD.
457
+ C
458
+ C TIMING THE OPERATIONAL COUNT IS PROPORTIONAL TO
459
+ C M*N*LOG2(N).
460
+ C
461
+ C ACCURACY THE FOLLOWING ACCURACY RESULTS WERE OBTAINED
462
+ C ON A CDC 7600. NOTE THAT THE FOURTH-ORDER
463
+ C ACCURACY IS NOT REALIZED UNTIL THE MESH IS
464
+ C SUFFICIENTLY REFINED.
465
+ C
466
+ C SECOND-ORDER FOURTH-ORDER
467
+ C M N ERROR ERROR
468
+ C
469
+ C 6 6 6.8E-1 1.2E0
470
+ C 14 14 1.4E-1 1.8E-1
471
+ C 30 30 3.2E-2 9.7E-3
472
+ C 62 62 7.5E-3 3.0E-4
473
+ C 126 126 1.8E-3 3.5E-6
474
+ C
475
+ C
476
+ C REFERENCES KELLER, H.B., NUMERICAL METHODS FOR TWO-POINT
477
+ C BOUNDARY-VALUE PROBLEMS, BLAISDEL (1968),
478
+ C WALTHAM, MASS.
479
+ C
480
+ C SWARZTRAUBER, P., AND R. SWEET (1975):
481
+ C EFFICIENT FORTRAN SUBPROGRAMS FOR THE
482
+ C SOLUTION OF ELLIPTIC PARTIAL DIFFERENTIAL
483
+ C EQUATIONS. NCAR TECHNICAL NOTE
484
+ C NCAR-TN/IA-109, PP. 135-137.
485
+ C***********************************************************************
486
+ DIMENSION GRHS(IDMN,1) ,USOL(IDMN,1)
487
+ DIMENSION BDA(*) ,BDB(*) ,BDC(*) ,BDD(*) ,
488
+ 1 W(*)
489
+ EXTERNAL COFX ,COFY
490
+ C
491
+ C CHECK INPUT PARAMETERS
492
+ C
493
+ CALL CHKPRM (INTL,IORDER,A,B,M,MBDCND,C,D,N,NBDCND,COFX,COFY,
494
+ 1 IDMN,IERROR)
495
+ IF (IERROR .NE. 0) RETURN
496
+ C
497
+ C COMPUTE MINIMUM WORK SPACE AND CHECK WORK SPACE LENGTH INPUT
498
+ C
499
+ L = N+1
500
+ IF (NBDCND .EQ. 0) L = N
501
+ LOGB2N = INT(ALOG(FLOAT(L)+0.5)/ALOG(2.0))+1
502
+ LL = 2**(LOGB2N+1)
503
+ K = M+1
504
+ L = N+1
505
+ LENGTH = (LOGB2N-2)*LL+LOGB2N+MAX0(2*L,6*K)+5
506
+ IF (NBDCND .EQ. 0) LENGTH = LENGTH+2*L
507
+ IERROR = 11
508
+ LINPUT = INT(W(1)+0.5)
509
+ LOUTPT = LENGTH+6*(K+L)+1
510
+ W(1) = FLOAT(LOUTPT)
511
+ IF (LOUTPT .GT. LINPUT) RETURN
512
+ IERROR = 0
513
+ C
514
+ C SET WORK SPACE INDICES
515
+ C
516
+ I1 = LENGTH+2
517
+ I2 = I1+L
518
+ I3 = I2+L
519
+ I4 = I3+L
520
+ I5 = I4+L
521
+ I6 = I5+L
522
+ I7 = I6+L
523
+ I8 = I7+K
524
+ I9 = I8+K
525
+ I10 = I9+K
526
+ I11 = I10+K
527
+ I12 = I11+K
528
+ I13 = 2
529
+ CALL SPELIP (INTL,IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,BETA,C,D,N,
530
+ 1 NBDCND,BDC,GAMA,BDD,XNU,COFX,COFY,W(I1),W(I2),W(I3),
531
+ 2 W(I4),W(I5),W(I6),W(I7),W(I8),W(I9),W(I10),W(I11),
532
+ 3 W(I12),GRHS,USOL,IDMN,W(I13),PERTRB,IERROR)
533
+ RETURN
534
+ END
535
+ SUBROUTINE SPELIP (INTL,IORDER,A,B,M,MBDCND,BDA,ALPHA,BDB,BETA,C,
536
+ 1 D,N,NBDCND,BDC,GAMA,BDD,XNU,COFX,COFY,AN,BN,
537
+ 2 CN,DN,UN,ZN,AM,BM,CM,DM,UM,ZM,GRHS,USOL,IDMN,
538
+ 3 W,PERTRB,IERROR)
539
+ C
540
+ C SPELIP SETS UP VECTORS AND ARRAYS FOR INPUT TO BLKTRI
541
+ C AND COMPUTES A SECOND ORDER SOLUTION IN USOL. A RETURN JUMP TO
542
+ C SEPELI OCCURRS IF IORDER=2. IF IORDER=4 A FOURTH ORDER
543
+ C SOLUTION IS GENERATED IN USOL.
544
+ C
545
+ DIMENSION BDA(*) ,BDB(*) ,BDC(*) ,BDD(*) ,
546
+ 1 W(*)
547
+ DIMENSION GRHS(IDMN,1) ,USOL(IDMN,1)
548
+ DIMENSION AN(*) ,BN(*) ,CN(*) ,DN(*) ,
549
+ 1 UN(*) ,ZN(*)
550
+ DIMENSION AM(*) ,BM(*) ,CM(*) ,DM(*) ,
551
+ 1 UM(*) ,ZM(*)
552
+ COMMON /SPLP/ KSWX ,KSWY ,K ,L ,
553
+ 1 AIT ,BIT ,CIT ,DIT ,
554
+ 2 MIT ,NIT ,IS ,MS ,
555
+ 3 JS ,NS ,DLX ,DLY ,
556
+ 4 TDLX3 ,TDLY3 ,DLX4 ,DLY4
557
+ LOGICAL SINGLR
558
+ EXTERNAL COFX ,COFY
559
+ C
560
+ C SET PARAMETERS INTERNALLY
561
+ C
562
+ KSWX = MBDCND+1
563
+ KSWY = NBDCND+1
564
+ K = M+1
565
+ L = N+1
566
+ AIT = A
567
+ BIT = B
568
+ CIT = C
569
+ DIT = D
570
+ C
571
+ C SET RIGHT HAND SIDE VALUES FROM GRHS IN USOL ON THE INTERIOR
572
+ C AND NON-SPECIFIED BOUNDARIES.
573
+ C
574
+ DO 20 I=2,M
575
+ DO 10 J=2,N
576
+ USOL(I,J) = GRHS(I,J)
577
+ 10 CONTINUE
578
+ 20 CONTINUE
579
+ IF (KSWX.EQ.2 .OR. KSWX.EQ.3) GO TO 40
580
+ DO 30 J=2,N
581
+ USOL(1,J) = GRHS(1,J)
582
+ 30 CONTINUE
583
+ 40 CONTINUE
584
+ IF (KSWX.EQ.2 .OR. KSWX.EQ.5) GO TO 60
585
+ DO 50 J=2,N
586
+ USOL(K,J) = GRHS(K,J)
587
+ 50 CONTINUE
588
+ 60 CONTINUE
589
+ IF (KSWY.EQ.2 .OR. KSWY.EQ.3) GO TO 80
590
+ DO 70 I=2,M
591
+ USOL(I,1) = GRHS(I,1)
592
+ 70 CONTINUE
593
+ 80 CONTINUE
594
+ IF (KSWY.EQ.2 .OR. KSWY.EQ.5) GO TO 100
595
+ DO 90 I=2,M
596
+ USOL(I,L) = GRHS(I,L)
597
+ 90 CONTINUE
598
+ 100 CONTINUE
599
+ IF (KSWX.NE.2 .AND. KSWX.NE.3 .AND. KSWY.NE.2 .AND. KSWY.NE.3)
600
+ 1 USOL(1,1) = GRHS(1,1)
601
+ IF (KSWX.NE.2 .AND. KSWX.NE.5 .AND. KSWY.NE.2 .AND. KSWY.NE.3)
602
+ 1 USOL(K,1) = GRHS(K,1)
603
+ IF (KSWX.NE.2 .AND. KSWX.NE.3 .AND. KSWY.NE.2 .AND. KSWY.NE.5)
604
+ 1 USOL(1,L) = GRHS(1,L)
605
+ IF (KSWX.NE.2 .AND. KSWX.NE.5 .AND. KSWY.NE.2 .AND. KSWY.NE.5)
606
+ 1 USOL(K,L) = GRHS(K,L)
607
+ I1 = 1
608
+ C
609
+ C SET SWITCHES FOR PERIODIC OR NON-PERIODIC BOUNDARIES
610
+ C
611
+ MP = 1
612
+ NP = 1
613
+ IF (KSWX .EQ. 1) MP = 0
614
+ IF (KSWY .EQ. 1) NP = 0
615
+ C
616
+ C SET DLX,DLY AND SIZE OF BLOCK TRI-DIAGONAL SYSTEM GENERATED
617
+ C IN NINT,MINT
618
+ C
619
+ DLX = (BIT-AIT)/FLOAT(M)
620
+ MIT = K-1
621
+ IF (KSWX .EQ. 2) MIT = K-2
622
+ IF (KSWX .EQ. 4) MIT = K
623
+ DLY = (DIT-CIT)/FLOAT(N)
624
+ NIT = L-1
625
+ IF (KSWY .EQ. 2) NIT = L-2
626
+ IF (KSWY .EQ. 4) NIT = L
627
+ TDLX3 = 2.0*DLX**3
628
+ DLX4 = DLX**4
629
+ TDLY3 = 2.0*DLY**3
630
+ DLY4 = DLY**4
631
+ C
632
+ C SET SUBSCRIPT LIMITS FOR PORTION OF ARRAY TO INPUT TO BLKTRI
633
+ C
634
+ IS = 1
635
+ JS = 1
636
+ IF (KSWX.EQ.2 .OR. KSWX.EQ.3) IS = 2
637
+ IF (KSWY.EQ.2 .OR. KSWY.EQ.3) JS = 2
638
+ NS = NIT+JS-1
639
+ MS = MIT+IS-1
640
+ C
641
+ C SET X - DIRECTION
642
+ C
643
+ DO 110 I=1,MIT
644
+ XI = AIT+FLOAT(IS+I-2)*DLX
645
+ CALL COFX (XI,AI,BI,CI)
646
+ AXI = (AI/DLX-0.5*BI)/DLX
647
+ BXI = -2.*AI/DLX**2+CI
648
+ CXI = (AI/DLX+0.5*BI)/DLX
649
+ AM(I) = AXI
650
+ BM(I) = BXI
651
+ CM(I) = CXI
652
+ 110 CONTINUE
653
+ C
654
+ C SET Y DIRECTION
655
+ C
656
+ DO 120 J=1,NIT
657
+ YJ = CIT+FLOAT(JS+J-2)*DLY
658
+ CALL COFY (YJ,DJ,EJ,FJ)
659
+ DYJ = (DJ/DLY-0.5*EJ)/DLY
660
+ EYJ = (-2.*DJ/DLY**2+FJ)
661
+ FYJ = (DJ/DLY+0.5*EJ)/DLY
662
+ AN(J) = DYJ
663
+ BN(J) = EYJ
664
+ CN(J) = FYJ
665
+ 120 CONTINUE
666
+ C
667
+ C ADJUST EDGES IN X DIRECTION UNLESS PERIODIC
668
+ C
669
+ AX1 = AM(1)
670
+ CXM = CM(MIT)
671
+ GO TO (170,130,150,160,140),KSWX
672
+ C
673
+ C DIRICHLET-DIRICHLET IN X DIRECTION
674
+ C
675
+ 130 AM(1) = 0.0
676
+ CM(MIT) = 0.0
677
+ GO TO 170
678
+ C
679
+ C MIXED-DIRICHLET IN X DIRECTION
680
+ C
681
+ 140 AM(1) = 0.0
682
+ BM(1) = BM(1)+2.*ALPHA*DLX*AX1
683
+ CM(1) = CM(1)+AX1
684
+ CM(MIT) = 0.0
685
+ GO TO 170
686
+ C
687
+ C DIRICHLET-MIXED IN X DIRECTION
688
+ C
689
+ 150 AM(1) = 0.0
690
+ AM(MIT) = AM(MIT)+CXM
691
+ BM(MIT) = BM(MIT)-2.*BETA*DLX*CXM
692
+
693
+ CM(MIT) = 0.0
694
+ GO TO 170
695
+ C
696
+ C MIXED - MIXED IN X DIRECTION
697
+ C
698
+ 160 CONTINUE
699
+ AM(1) = 0.0
700
+ BM(1) = BM(1)+2.*DLX*ALPHA*AX1
701
+ CM(1) = CM(1)+AX1
702
+ AM(MIT) = AM(MIT)+CXM
703
+ BM(MIT) = BM(MIT)-2.*DLX*BETA*CXM
704
+ CM(MIT) = 0.0
705
+ 170 CONTINUE
706
+ C
707
+ C ADJUST IN Y DIRECTION UNLESS PERIODIC
708
+ C
709
+ DY1 = AN(1)
710
+ FYN = CN(NIT)
711
+ GO TO (220,180,200,210,190),KSWY
712
+ C
713
+ C DIRICHLET-DIRICHLET IN Y DIRECTION
714
+ C
715
+ 180 CONTINUE
716
+ AN(1) = 0.0
717
+ CN(NIT) = 0.0
718
+ GO TO 220
719
+ C
720
+ C MIXED-DIRICHLET IN Y DIRECTION
721
+ C
722
+ 190 CONTINUE
723
+ AN(1) = 0.0
724
+ BN(1) = BN(1)+2.*DLY*GAMA*DY1
725
+ CN(1) = CN(1)+DY1
726
+ CN(NIT) = 0.0
727
+ GO TO 220
728
+ C
729
+ C DIRICHLET-MIXED IN Y DIRECTION
730
+ C
731
+ 200 AN(1) = 0.0
732
+ AN(NIT) = AN(NIT)+FYN
733
+ BN(NIT) = BN(NIT)-2.*DLY*XNU*FYN
734
+ CN(NIT) = 0.0
735
+ GO TO 220
736
+ C
737
+ C MIXED - MIXED DIRECTION IN Y DIRECTION
738
+ C
739
+ 210 CONTINUE
740
+ AN(1) = 0.0
741
+ BN(1) = BN(1)+2.*DLY*GAMA*DY1
742
+ CN(1) = CN(1)+DY1
743
+ AN(NIT) = AN(NIT)+FYN
744
+ BN(NIT) = BN(NIT)-2.0*DLY*XNU*FYN
745
+ CN(NIT) = 0.0
746
+ 220 IF (KSWX .EQ. 1) GO TO 270
747
+ C
748
+ C ADJUST USOL ALONG X EDGE
749
+ C
750
+ DO 260 J=JS,NS
751
+ IF (KSWX.NE.2 .AND. KSWX.NE.3) GO TO 230
752
+ USOL(IS,J) = USOL(IS,J)-AX1*USOL(1,J)
753
+ GO TO 240
754
+ 230 USOL(IS,J) = USOL(IS,J)+2.0*DLX*AX1*BDA(J)
755
+ 240 IF (KSWX.NE.2 .AND. KSWX.NE.5) GO TO 250
756
+ USOL(MS,J) = USOL(MS,J)-CXM*USOL(K,J)
757
+ GO TO 260
758
+ 250 USOL(MS,J) = USOL(MS,J)-2.0*DLX*CXM*BDB(J)
759
+ 260 CONTINUE
760
+ 270 IF (KSWY .EQ. 1) GO TO 320
761
+ C
762
+ C ADJUST USOL ALONG Y EDGE
763
+ C
764
+ DO 310 I=IS,MS
765
+ IF (KSWY.NE.2 .AND. KSWY.NE.3) GO TO 280
766
+ USOL(I,JS) = USOL(I,JS)-DY1*USOL(I,1)
767
+ GO TO 290
768
+ 280 USOL(I,JS) = USOL(I,JS)+2.0*DLY*DY1*BDC(I)
769
+ 290 IF (KSWY.NE.2 .AND. KSWY.NE.5) GO TO 300
770
+ USOL(I,NS) = USOL(I,NS)-FYN*USOL(I,L)
771
+ GO TO 310
772
+ 300 USOL(I,NS) = USOL(I,NS)-2.0*DLY*FYN*BDD(I)
773
+ 310 CONTINUE
774
+ 320 CONTINUE
775
+ C
776
+ C SAVE ADJUSTED EDGES IN GRHS IF IORDER=4
777
+ C
778
+ IF (IORDER .NE. 4) GO TO 350
779
+ DO 330 J=JS,NS
780
+ GRHS(IS,J) = USOL(IS,J)
781
+ GRHS(MS,J) = USOL(MS,J)
782
+ 330 CONTINUE
783
+ DO 340 I=IS,MS
784
+ GRHS(I,JS) = USOL(I,JS)
785
+ GRHS(I,NS) = USOL(I,NS)
786
+ 340 CONTINUE
787
+ 350 CONTINUE
788
+ IORD = IORDER
789
+ PERTRB = 0.0
790
+ C
791
+ C CHECK IF OPERATOR IS SINGULAR
792
+ C
793
+ CALL CHKSNG (MBDCND,NBDCND,ALPHA,BETA,GAMA,XNU,COFX,COFY,SINGLR)
794
+ C
795
+ C COMPUTE NON-ZERO EIGENVECTOR IN NULL SPACE OF TRANSPOSE
796
+ C IF SINGULAR
797
+ C
798
+ IF (SINGLR) CALL SEPTRI (MIT,AM,BM,CM,DM,UM,ZM)
799
+ IF (SINGLR) CALL SEPTRI (NIT,AN,BN,CN,DN,UN,ZN)
800
+ C
801
+ C MAKE INITIALIZATION CALL TO BLKTRI
802
+ C
803
+ IF (INTL .EQ. 0)
804
+ 1 CALL BLKTRI (INTL,NP,NIT,AN,BN,CN,MP,MIT,AM,BM,CM,IDMN,
805
+ 2 USOL(IS,JS),IERROR,W)
806
+ IF (IERROR .NE. 0) RETURN
807
+ C
808
+ C ADJUST RIGHT HAND SIDE IF NECESSARY
809
+ C
810
+ 360 CONTINUE
811
+ IF (SINGLR) CALL SEPORT (USOL,IDMN,ZN,ZM,PERTRB)
812
+ C
813
+ C COMPUTE SOLUTION
814
+ C
815
+ CALL BLKTRI (I1,NP,NIT,AN,BN,CN,MP,MIT,AM,BM,CM,IDMN,USOL(IS,JS),
816
+ 1 IERROR,W)
817
+ IF (IERROR .NE. 0) RETURN
818
+ C
819
+ C SET PERIODIC BOUNDARIES IF NECESSARY
820
+ C
821
+ IF (KSWX .NE. 1) GO TO 380
822
+ DO 370 J=1,L
823
+ USOL(K,J) = USOL(1,J)
824
+ 370 CONTINUE
825
+ 380 IF (KSWY .NE. 1) GO TO 400
826
+ DO 390 I=1,K
827
+ USOL(I,L) = USOL(I,1)
828
+ 390 CONTINUE
829
+ 400 CONTINUE
830
+ C
831
+ C MINIMIZE SOLUTION WITH RESPECT TO WEIGHTED LEAST SQUARES
832
+ C NORM IF OPERATOR IS SINGULAR
833
+ C
834
+ IF (SINGLR) CALL SEPMIN (USOL,IDMN,ZN,ZM,PRTRB)
835
+ C
836
+ C RETURN IF DEFERRED CORRECTIONS AND A FOURTH ORDER SOLUTION ARE
837
+ C NOT FLAGGED
838
+ C
839
+ IF (IORD .EQ. 2) RETURN
840
+ IORD = 2
841
+ C
842
+ C COMPUTE NEW RIGHT HAND SIDE FOR FOURTH ORDER SOLUTION
843
+ C
844
+ CALL DEFER (COFX,COFY,IDMN,USOL,GRHS)
845
+ GO TO 360
846
+ END
847
+ SUBROUTINE CHKPRM (INTL,IORDER,A,B,M,MBDCND,C,D,N,NBDCND,COFX,
848
+ 1 COFY,IDMN,IERROR)
849
+ C
850
+ C THIS PROGRAM CHECKS THE INPUT PARAMETERS FOR ERRORS
851
+ C
852
+ EXTERNAL COFX ,COFY
853
+ C
854
+ C CHECK DEFINITION OF SOLUTION REGION
855
+ C
856
+ IERROR = 1
857
+ IF (A.GE.B .OR. C.GE.D) RETURN
858
+ C
859
+ C CHECK BOUNDARY SWITCHES
860
+ C
861
+ IERROR = 2
862
+ IF (MBDCND.LT.0 .OR. MBDCND.GT.4) RETURN
863
+ IERROR = 3
864
+ IF (NBDCND.LT.0 .OR. NBDCND.GT.4) RETURN
865
+ C
866
+ C CHECK FIRST DIMENSION IN CALLING ROUTINE
867
+ C
868
+ IERROR = 5
869
+ IF (IDMN .LT. 7) RETURN
870
+ C
871
+ C CHECK M
872
+ C
873
+ IERROR = 6
874
+ IF (M.GT.(IDMN-1) .OR. M.LT.6) RETURN
875
+ C
876
+ C CHECK N
877
+ C
878
+ IERROR = 7
879
+ IF (N .LT. 5) RETURN
880
+ C
881
+ C CHECK IORDER
882
+ C
883
+ IERROR = 8
884
+ IF (IORDER.NE.2 .AND. IORDER.NE.4) RETURN
885
+ C
886
+ C CHECK INTL
887
+ C
888
+ IERROR = 9
889
+ IF (INTL.NE.0 .AND. INTL.NE.1) RETURN
890
+ C
891
+ C CHECK THAT EQUATION IS ELLIPTIC
892
+ C
893
+ DLX = (B-A)/FLOAT(M)
894
+ DLY = (D-C)/FLOAT(N)
895
+ DO 30 I=2,M
896
+ XI = A+FLOAT(I-1)*DLX
897
+ CALL COFX (XI,AI,BI,CI)
898
+ DO 20 J=2,N
899
+ YJ = C+FLOAT(J-1)*DLY
900
+ CALL COFY (YJ,DJ,EJ,FJ)
901
+ IF (AI*DJ .GT. 0.0) GO TO 10
902
+ IERROR = 10
903
+ RETURN
904
+ 10 CONTINUE
905
+ 20 CONTINUE
906
+ 30 CONTINUE
907
+ C
908
+ C NO ERROR FOUND
909
+ C
910
+ IERROR = 0
911
+ RETURN
912
+ END
913
+ SUBROUTINE CHKSNG (MBDCND,NBDCND,ALPHA,BETA,GAMA,XNU,COFX,COFY,
914
+ 1 SINGLR)
915
+ C
916
+ C THIS SUBROUTINE CHECKS IF THE PDE SEPELI
917
+ C MUST SOLVE IS A SINGULAR OPERATOR
918
+ C
919
+ COMMON /SPLP/ KSWX ,KSWY ,K ,L ,
920
+ 1 AIT ,BIT ,CIT ,DIT ,
921
+ 2 MIT ,NIT ,IS ,MS ,
922
+ 3 JS ,NS ,DLX ,DLY ,
923
+ 4 TDLX3 ,TDLY3 ,DLX4 ,DLY4
924
+ LOGICAL SINGLR
925
+ SINGLR = .FALSE.
926
+ C
927
+ C CHECK IF THE BOUNDARY CONDITIONS ARE
928
+ C ENTIRELY PERIODIC AND/OR MIXED
929
+ C
930
+ IF ((MBDCND.NE.0 .AND. MBDCND.NE.3) .OR.
931
+ 1 (NBDCND.NE.0 .AND. NBDCND.NE.3)) RETURN
932
+ C
933
+ C CHECK THAT MIXED CONDITIONS ARE PURE NEUMAN
934
+ C
935
+ IF (MBDCND .NE. 3) GO TO 10
936
+ IF (ALPHA.NE.0.0 .OR. BETA.NE.0.0) RETURN
937
+ 10 IF (NBDCND .NE. 3) GO TO 20
938
+ IF (GAMA.NE.0.0 .OR. XNU.NE.0.0) RETURN
939
+ 20 CONTINUE
940
+ C
941
+ C CHECK THAT NON-DERIVATIVE COEFFICIENT FUNCTIONS
942
+ C ARE ZERO
943
+ C
944
+ DO 30 I=IS,MS
945
+ XI = AIT+FLOAT(I-1)*DLX
946
+ CALL COFX (XI,AI,BI,CI)
947
+ IF (CI .NE. 0.0) RETURN
948
+ 30 CONTINUE
949
+ DO 40 J=JS,NS
950
+ YJ = CIT+FLOAT(J-1)*DLY
951
+ CALL COFY (YJ,DJ,EJ,FJ)
952
+ IF (FJ .NE. 0.0) RETURN
953
+ 40 CONTINUE
954
+ C
955
+ C THE OPERATOR MUST BE SINGULAR IF THIS POINT IS REACHED
956
+ C
957
+ SINGLR = .TRUE.
958
+ RETURN
959
+ END
960
+ SUBROUTINE DEFER (COFX,COFY,IDMN,USOL,GRHS)
961
+ C
962
+ C THIS SUBROUTINE FIRST APPROXIMATES THE TRUNCATION ERROR GIVEN BY
963
+ C TRUN1(X,Y)=DLX**2*TX+DLY**2*TY WHERE
964
+ C TX=AFUN(X)*UXXXX/12.0+BFUN(X)*UXXX/6.0 ON THE INTERIOR AND
965
+ C AT THE BOUNDARIES IF PERIODIC(HERE UXXX,UXXXX ARE THE THIRD
966
+ C AND FOURTH PARTIAL DERIVATIVES OF U WITH RESPECT TO X).
967
+ C TX IS OF THE FORM AFUN(X)/3.0*(UXXXX/4.0+UXXX/DLX)
968
+ C AT X=A OR X=B IF THE BOUNDARY CONDITION THERE IS MIXED.
969
+ C TX=0.0 ALONG SPECIFIED BOUNDARIES. TY HAS SYMMETRIC FORM
970
+ C IN Y WITH X,AFUN(X),BFUN(X) REPLACED BY Y,DFUN(Y),EFUN(Y).
971
+ C THE SECOND ORDER SOLUTION IN USOL IS USED TO APPROXIMATE
972
+ C (VIA SECOND ORDER FINITE DIFFERENCING) THE TRUNCATION ERROR
973
+ C AND THE RESULT IS ADDED TO THE RIGHT HAND SIDE IN GRHS
974
+ C AND THEN TRANSFERRED TO USOL TO BE USED AS A NEW RIGHT
975
+ C HAND SIDE WHEN CALLING BLKTRI FOR A FOURTH ORDER SOLUTION.
976
+ C
977
+ COMMON /SPLP/ KSWX ,KSWY ,K ,L ,
978
+ 1 AIT ,BIT ,CIT ,DIT ,
979
+ 2 MIT ,NIT ,IS ,MS ,
980
+ 3 JS ,NS ,DLX ,DLY ,
981
+ 4 TDLX3 ,TDLY3 ,DLX4 ,DLY4
982
+ DIMENSION GRHS(IDMN,1) ,USOL(IDMN,1)
983
+ EXTERNAL COFX ,COFY
984
+ C
985
+ C COMPUTE TRUNCATION ERROR APPROXIMATION OVER THE ENTIRE MESH
986
+ C
987
+ DO 40 J=JS,NS
988
+ YJ = CIT+FLOAT(J-1)*DLY
989
+ CALL COFY (YJ,DJ,EJ,FJ)
990
+ DO 30 I=IS,MS
991
+ XI = AIT+FLOAT(I-1)*DLX
992
+ CALL COFX (XI,AI,BI,CI)
993
+ C
994
+ C COMPUTE PARTIAL DERIVATIVE APPROXIMATIONS AT (XI,YJ)
995
+ C
996
+ CALL SEPDX (USOL,IDMN,I,J,UXXX,UXXXX)
997
+ CALL SEPDY (USOL,IDMN,I,J,UYYY,UYYYY)
998
+ TX = AI*UXXXX/12.0+BI*UXXX/6.0
999
+ TY = DJ*UYYYY/12.0+EJ*UYYY/6.0
1000
+ C
1001
+ C RESET FORM OF TRUNCATION IF AT BOUNDARY WHICH IS NON-PERIODIC
1002
+ C
1003
+ IF (KSWX.EQ.1 .OR. (I.GT.1 .AND. I.LT.K)) GO TO 10
1004
+ TX = AI/3.0*(UXXXX/4.0+UXXX/DLX)
1005
+ 10 IF (KSWY.EQ.1 .OR. (J.GT.1 .AND. J.LT.L)) GO TO 20
1006
+ TY = DJ/3.0*(UYYYY/4.0+UYYY/DLY)
1007
+ 20 GRHS(I,J) = GRHS(I,J)+DLX**2*TX+DLY**2*TY
1008
+ 30 CONTINUE
1009
+ 40 CONTINUE
1010
+ C
1011
+ C RESET THE RIGHT HAND SIDE IN USOL
1012
+ C
1013
+ DO 60 I=IS,MS
1014
+ DO 50 J=JS,NS
1015
+ USOL(I,J) = GRHS(I,J)
1016
+ 50 CONTINUE
1017
+ 60 CONTINUE
1018
+ RETURN
1019
+ C
1020
+ C REVISION HISTORY---
1021
+ C
1022
+ C SEPTEMBER 1973 VERSION 1
1023
+ C APRIL 1976 VERSION 2
1024
+ C JANUARY 1978 VERSION 3
1025
+ C DECEMBER 1979 VERSION 3.1
1026
+ C FEBRUARY 1985 DOCUMENTATION UPGRADE
1027
+ C NOVEMBER 1988 VERSION 3.2, FORTRAN 77 CHANGES
1028
+ C-----------------------------------------------------------------------
1029
+ END