PyFishPack 0.1.0__cp39-cp39-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 (82) hide show
  1. PyFishPack/__init__.py +105 -0
  2. PyFishPack/__pycache__/__init__.cpython-39.pyc +0 -0
  3. PyFishPack/__pycache__/apps.cpython-39.pyc +0 -0
  4. PyFishPack/_dummy.c +23 -0
  5. PyFishPack/_dummy.cp39-win_amd64.pyd +0 -0
  6. PyFishPack/apps.py +3640 -0
  7. PyFishPack/fishpack.cp39-win_amd64.dll.a +0 -0
  8. PyFishPack/fishpack.cp39-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 +82 -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/.load-order-pyfishpack-0.1.0 +4 -0
  79. pyfishpack.libs/libgcc_s_seh-1-25d59ccffa1a9009644065b069829e07.dll +0 -0
  80. pyfishpack.libs/libgfortran-5-08f2195cfa0d823e13371c5c3186a82a.dll +0 -0
  81. pyfishpack.libs/libquadmath-0-c5abb9113f1ee64b87a889958e4b7418.dll +0 -0
  82. pyfishpack.libs/libwinpthread-1-83908d14abfafb8b3bfa38cf51ecee56.dll +0 -0
@@ -0,0 +1,1404 @@
1
+ C
2
+ C file blktri.f
3
+ C
4
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
5
+ C * *
6
+ C * copyright (c) 1999 by UCAR *
7
+ C * *
8
+ C * UNIVERSITY CORPORATION for ATMOSPHERIC RESEARCH *
9
+ C * *
10
+ C * all rights reserved *
11
+ C * *
12
+ C * FISHPACK version 4.1 *
13
+ C * *
14
+ C * A PACKAGE OF FORTRAN SUBPROGRAMS FOR THE SOLUTION OF *
15
+ C * *
16
+ C * SEPARABLE ELLIPTIC PARTIAL DIFFERENTIAL EQUATIONS *
17
+ C * *
18
+ C * BY *
19
+ C * *
20
+ C * JOHN ADAMS, PAUL SWARZTRAUBER AND ROLAND SWEET *
21
+ C * *
22
+ C * OF *
23
+ C * *
24
+ C * THE NATIONAL CENTER FOR ATMOSPHERIC RESEARCH *
25
+ C * *
26
+ C * BOULDER, COLORADO (80307) U.S.A. *
27
+ C * *
28
+ C * WHICH IS SPONSORED BY *
29
+ C * *
30
+ C * THE NATIONAL SCIENCE FOUNDATION *
31
+ C * *
32
+ C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
33
+ C
34
+ C
35
+ SUBROUTINE BLKTRI (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,CM,IDIMY,Y,
36
+ + IERROR,W)
37
+ C
38
+ C
39
+ C DIMENSION OF AN(N),BN(N),CN(N),AM(M),BM(M),CM(M),Y(IDIMY,N),
40
+ C ARGUMENTS W(SEE ARGUMENT LIST)
41
+ C
42
+ C LATEST REVISION NOVEMBER 1988
43
+ C
44
+ C USAGE CALL BLKTRI (IFLG,NP,N,AN,BN,CN,MP,M,AM,BM,
45
+ C CM,IDIMY,Y,IERROR,W)
46
+ C
47
+ C PURPOSE BLKTRI SOLVES A SYSTEM OF LINEAR EQUATIONS
48
+ C OF THE FORM
49
+ C
50
+ C AN(J)*X(I,J-1) + AM(I)*X(I-1,J) +
51
+ C (BN(J)+BM(I))*X(I,J) + CN(J)*X(I,J+1) +
52
+ C CM(I)*X(I+1,J) = Y(I,J)
53
+ C
54
+ C FOR I = 1,2,...,M AND J = 1,2,...,N.
55
+ C
56
+ C I+1 AND I-1 ARE EVALUATED MODULO M AND
57
+ C J+1 AND J-1 MODULO N, I.E.,
58
+ C
59
+ C X(I,0) = X(I,N), X(I,N+1) = X(I,1),
60
+ C X(0,J) = X(M,J), X(M+1,J) = X(1,J).
61
+ C
62
+ C THESE EQUATIONS USUALLY RESULT FROM THE
63
+ C DISCRETIZATION OF SEPARABLE ELLIPTIC
64
+ C EQUATIONS. BOUNDARY CONDITIONS MAY BE
65
+ C DIRICHLET, NEUMANN, OR PERIODIC.
66
+ C
67
+ C ARGUMENTS
68
+ C
69
+ C ON INPUT IFLG
70
+ C
71
+ C = 0 INITIALIZATION ONLY.
72
+ C CERTAIN QUANTITIES THAT DEPEND ON NP,
73
+ C N, AN, BN, AND CN ARE COMPUTED AND
74
+ C STORED IN THE WORK ARRAY W.
75
+ C
76
+ C = 1 THE QUANTITIES THAT WERE COMPUTED
77
+ C IN THE INITIALIZATION ARE USED
78
+ C TO OBTAIN THE SOLUTION X(I,J).
79
+ C
80
+ C NOTE:
81
+ C A CALL WITH IFLG=0 TAKES
82
+ C APPROXIMATELY ONE HALF THE TIME
83
+ C AS A CALL WITH IFLG = 1.
84
+ C HOWEVER, THE INITIALIZATION DOES
85
+ C NOT HAVE TO BE REPEATED UNLESS NP,
86
+ C N, AN, BN, OR CN CHANGE.
87
+ C
88
+ C NP
89
+ C = 0 IF AN(1) AND CN(N) ARE NOT ZERO,
90
+ C WHICH CORRESPONDS TO PERIODIC
91
+ C BOUNARY CONDITIONS.
92
+ C
93
+ C = 1 IF AN(1) AND CN(N) ARE ZERO.
94
+ C
95
+ C N
96
+ C THE NUMBER OF UNKNOWNS IN THE J-DIRECTION.
97
+ C N MUST BE GREATER THAN 4.
98
+ C THE OPERATION COUNT IS PROPORTIONAL TO
99
+ C MNLOG2(N), HENCE N SHOULD BE SELECTED
100
+ C LESS THAN OR EQUAL TO M.
101
+ C
102
+ C AN,BN,CN
103
+ C ONE-DIMENSIONAL ARRAYS OF LENGTH N
104
+ C THAT SPECIFY THE COEFFICIENTS IN THE
105
+ C LINEAR EQUATIONS GIVEN ABOVE.
106
+ C
107
+ C MP
108
+ C = 0 IF AM(1) AND CM(M) ARE NOT ZERO,
109
+ C WHICH CORRESPONDS TO PERIODIC
110
+ C BOUNDARY CONDITIONS.
111
+ C
112
+ C = 1 IF AM(1) = CM(M) = 0 .
113
+ C
114
+ C M
115
+ C THE NUMBER OF UNKNOWNS IN THE I-DIRECTION.
116
+ C M MUST BE GREATER THAN 4.
117
+ C
118
+ C AM,BM,CM
119
+ C ONE-DIMENSIONAL ARRAYS OF LENGTH M THAT
120
+ C SPECIFY THE COEFFICIENTS IN THE LINEAR
121
+ C EQUATIONS GIVEN ABOVE.
122
+ C
123
+ C IDIMY
124
+ C THE ROW (OR FIRST) DIMENSION OF THE
125
+ C TWO-DIMENSIONAL ARRAY Y AS IT APPEARS
126
+ C IN THE PROGRAM CALLING BLKTRI.
127
+ C THIS PARAMETER IS USED TO SPECIFY THE
128
+ C VARIABLE DIMENSION OF Y.
129
+ C IDIMY MUST BE AT LEAST M.
130
+ C
131
+ C Y
132
+ C A TWO-DIMENSIONAL ARRAY THAT SPECIFIES
133
+ C THE VALUES OF THE RIGHT SIDE OF THE LINEAR
134
+ C SYSTEM OF EQUATIONS GIVEN ABOVE.
135
+ C Y MUST BE DIMENSIONED AT LEAST M*N.
136
+ C
137
+ C W
138
+ C A ONE-DIMENSIONAL ARRAY THAT MUST BE
139
+ C PROVIDED BY THE USER FOR WORK SPACE.
140
+ C IF NP=1 DEFINE K=INT(LOG2(N))+1 AND
141
+ C SET L=2**(K+1) THEN W MUST HAVE DIMENSION
142
+ C (K-2)*L+K+5+MAX(2N,6M)
143
+ C
144
+ C IF NP=0 DEFINE K=INT(LOG2(N-1))+1 AND
145
+ C SET L=2**(K+1) THEN W MUST HAVE DIMENSION
146
+ C (K-2)*L+K+5+2N+MAX(2N,6M)
147
+ C
148
+ C **IMPORTANT**
149
+ C FOR PURPOSES OF CHECKING, THE REQUIRED
150
+ C DIMENSION OF W IS COMPUTED BY BLKTRI AND
151
+ C STORED IN W(1) IN FLOATING POINT FORMAT.
152
+ C
153
+ C ARGUMENTS
154
+ C
155
+ C ON OUTPUT Y
156
+ C CONTAINS THE SOLUTION X.
157
+ C
158
+ C IERROR
159
+ C AN ERROR FLAG THAT INDICATES INVALID
160
+ C INPUT PARAMETERS. EXCEPT FOR NUMBER ZER0,
161
+ C A SOLUTION IS NOT ATTEMPTED.
162
+ C
163
+ C = 0 NO ERROR.
164
+ C = 1 M IS LESS THAN 5
165
+ C = 2 N IS LESS THAN 5
166
+ C = 3 IDIMY IS LESS THAN M.
167
+ C = 4 BLKTRI FAILED WHILE COMPUTING RESULTS
168
+ C THAT DEPEND ON THE COEFFICIENT ARRAYS
169
+ C AN, BN, CN. CHECK THESE ARRAYS.
170
+ C = 5 AN(J)*CN(J-1) IS LESS THAN 0 FOR SOME J.
171
+ C
172
+ C POSSIBLE REASONS FOR THIS CONDITION ARE
173
+ C 1. THE ARRAYS AN AND CN ARE NOT CORRECT
174
+ C 2. TOO LARGE A GRID SPACING WAS USED
175
+ C IN THE DISCRETIZATION OF THE ELLIPTIC
176
+ C EQUATION.
177
+ C 3. THE LINEAR EQUATIONS RESULTED FROM A
178
+ C PARTIAL DIFFERENTIAL EQUATION WHICH
179
+ C WAS NOT ELLIPTIC.
180
+ C
181
+ C W
182
+ C CONTAINS INTERMEDIATE VALUES THAT MUST
183
+ C NOT BE DESTROYED IF BLKTRI WILL BE CALLED
184
+ C AGAIN WITH IFLG=1. W(1) CONTAINS THE
185
+ C NUMBER OF LOCATIONS REQUIRED BY W IN
186
+ C FLOATING POINT FORMAT.
187
+ C
188
+ C
189
+ C SPECIAL CONDITIONS THE ALGORITHM MAY FAIL IF ABS(BM(I)+BN(J))
190
+ C IS LESS THAN ABS(AM(I))+ABS(AN(J))+
191
+ C ABS(CM(I))+ABS(CN(J))
192
+ C FOR SOME I AND J. THE ALGORITHM WILL ALSO
193
+ C FAIL IF AN(J)*CN(J-1) IS LESS THAN ZERO FOR
194
+ C SOME J.
195
+ C SEE THE DESCRIPTION OF THE OUTPUT PARAMETER
196
+ C IERROR.
197
+ C
198
+ C I/O NONE
199
+ C
200
+ C PRECISION SINGLE
201
+ C
202
+ C REQUIRED LIBRARY COMF FROM FISHPACK
203
+ C FILES
204
+ C
205
+ C LANGUAGE FORTRAN
206
+ C
207
+ C HISTORY WRITTEN BY PAUL SWARZTRAUBER AT NCAR IN THE
208
+ C EARLY 1970'S. REWRITTEN AND RELEASED IN
209
+ C JANUARY, 1980.
210
+ C
211
+ C ALGORITHM GENERALIZED CYCLIC REDUCTION
212
+ C
213
+ C PORTABILITY FORTRAN 77. APPROXIMATE MACHINE ACCURACY
214
+ C IS COMPUTED IN FUNCTION EPMACH.
215
+ C
216
+ C REFERENCES SWARZTRAUBER,P. AND R. SWEET, 'EFFICIENT
217
+ C FORTRAN SUBPROGRAMS FOR THE SOLUTION OF
218
+ C ELLIPTIC EQUATIONS'
219
+ C NCAR TN/IA-109, JULY, 1975, 138 PP.
220
+ C
221
+ C SWARZTRAUBER P. N.,A DIRECT METHOD FOR
222
+ C THE DISCRETE SOLUTION OF SEPARABLE
223
+ C ELLIPTIC EQUATIONS, S.I.A.M.
224
+ C J. NUMER. ANAL.,11(1974) PP. 1136-1150.
225
+ C***********************************************************************
226
+ DIMENSION AN(*) ,BN(*) ,CN(*) ,AM(*) ,
227
+ 1 BM(*) ,CM(*) ,Y(IDIMY,1) ,W(*)
228
+ EXTERNAL PROD ,PRODP ,CPROD ,CPRODP
229
+ COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
230
+ 1 NM ,NCMPLX ,IK
231
+ C
232
+ C TEST M AND N FOR THE PROPER FORM
233
+ C
234
+ NM = N
235
+ IERROR = 0
236
+ IF (M-5) 101,102,102
237
+ 101 IERROR = 1
238
+ GO TO 119
239
+ 102 IF (NM-3) 103,104,104
240
+ 103 IERROR = 2
241
+ GO TO 119
242
+ 104 IF (IDIMY-M) 105,106,106
243
+ 105 IERROR = 3
244
+ GO TO 119
245
+ 106 NH = N
246
+ NPP = NP
247
+ IF (NPP) 107,108,107
248
+ 107 NH = NH+1
249
+ 108 IK = 2
250
+ K = 1
251
+ 109 IK = IK+IK
252
+ K = K+1
253
+ IF (NH-IK) 110,110,109
254
+ 110 NL = IK
255
+ IK = IK+IK
256
+ NL = NL-1
257
+ IWAH = (K-2)*IK+K+6
258
+ IF (NPP) 111,112,111
259
+ C
260
+ C DIVIDE W INTO WORKING SUB ARRAYS
261
+ C
262
+ 111 IW1 = IWAH
263
+ IWBH = IW1+NM
264
+ W(1) = FLOAT(IW1-1+MAX0(2*NM,6*M))
265
+ GO TO 113
266
+ 112 IWBH = IWAH+NM+NM
267
+ IW1 = IWBH
268
+ W(1) = FLOAT(IW1-1+MAX0(2*NM,6*M))
269
+ NM = NM-1
270
+ C
271
+ C SUBROUTINE COMP B COMPUTES THE ROOTS OF THE B POLYNOMIALS
272
+ C
273
+ 113 IF (IERROR) 119,114,119
274
+ 114 IW2 = IW1+M
275
+ IW3 = IW2+M
276
+ IWD = IW3+M
277
+ IWW = IWD+M
278
+ IWU = IWW+M
279
+ IF (IFLG) 116,115,116
280
+ 115 CALL COMPB (NL,IERROR,AN,BN,CN,W(2),W(IWAH),W(IWBH))
281
+ GO TO 119
282
+ 116 IF (MP) 117,118,117
283
+ C
284
+ C SUBROUTINE BLKTR1 SOLVES THE LINEAR SYSTEM
285
+ C
286
+ 117 CALL BLKTR1 (NL,AN,BN,CN,M,AM,BM,CM,IDIMY,Y,W(2),W(IW1),W(IW2),
287
+ 1 W(IW3),W(IWD),W(IWW),W(IWU),PROD,CPROD)
288
+ GO TO 119
289
+ 118 CALL BLKTR1 (NL,AN,BN,CN,M,AM,BM,CM,IDIMY,Y,W(2),W(IW1),W(IW2),
290
+ 1 W(IW3),W(IWD),W(IWW),W(IWU),PRODP,CPRODP)
291
+ 119 CONTINUE
292
+ RETURN
293
+ END
294
+ SUBROUTINE BLKTR1 (N,AN,BN,CN,M,AM,BM,CM,IDIMY,Y,B,W1,W2,W3,WD,
295
+ 1 WW,WU,PRDCT,CPRDCT)
296
+ C
297
+ C BLKTR1 SOLVES THE LINEAR SYSTEM
298
+ C
299
+ C B CONTAINS THE ROOTS OF ALL THE B POLYNOMIALS
300
+ C W1,W2,W3,WD,WW,WU ARE ALL WORKING ARRAYS
301
+ C PRDCT IS EITHER PRODP OR PROD DEPENDING ON WHETHER THE BOUNDARY
302
+ C CONDITIONS IN THE M DIRECTION ARE PERIODIC OR NOT
303
+ C CPRDCT IS EITHER CPRODP OR CPROD WHICH ARE THE COMPLEX VERSIONS
304
+ C OF PRODP AND PROD. THESE ARE CALLED IN THE EVENT THAT SOME
305
+ C OF THE ROOTS OF THE B SUB P POLYNOMIAL ARE COMPLEX
306
+ C
307
+ C
308
+ DIMENSION AN(*) ,BN(*) ,CN(*) ,AM(*) ,
309
+ 1 BM(*) ,CM(*) ,B(*) ,W1(*) ,
310
+ 2 W2(*) ,W3(*) ,WD(*) ,WW(*) ,
311
+ 3 WU(*) ,Y(IDIMY,1)
312
+ COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
313
+ 1 NM ,NCMPLX ,IK
314
+ C
315
+ C BEGIN REDUCTION PHASE
316
+ C
317
+ KDO = K-1
318
+ DO 109 L=1,KDO
319
+ IR = L-1
320
+ I2 = 2**IR
321
+ I1 = I2/2
322
+ I3 = I2+I1
323
+ I4 = I2+I2
324
+ IRM1 = IR-1
325
+ CALL INDXB (I2,IR,IM2,NM2)
326
+ CALL INDXB (I1,IRM1,IM3,NM3)
327
+ CALL INDXB (I3,IRM1,IM1,NM1)
328
+ CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,Y(1,I2),W3,
329
+ 1 M,AM,BM,CM,WD,WW,WU)
330
+ IF = 2**K
331
+ DO 108 I=I4,IF,I4
332
+ IF (I-NM) 101,101,108
333
+ 101 IPI1 = I+I1
334
+ IPI2 = I+I2
335
+ IPI3 = I+I3
336
+ CALL INDXC (I,IR,IDXC,NC)
337
+ IF (I-IF) 102,108,108
338
+ 102 CALL INDXA (I,IR,IDXA,NA)
339
+ CALL INDXB (I-I1,IRM1,IM1,NM1)
340
+ CALL INDXB (IPI2,IR,IP2,NP2)
341
+ CALL INDXB (IPI1,IRM1,IP1,NP1)
342
+ CALL INDXB (IPI3,IRM1,IP3,NP3)
343
+ CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W3,W1,M,AM,
344
+ 1 BM,CM,WD,WW,WU)
345
+ IF (IPI2-NM) 105,105,103
346
+ 103 DO 104 J=1,M
347
+ W3(J) = 0.
348
+ W2(J) = 0.
349
+ 104 CONTINUE
350
+ GO TO 106
351
+ 105 CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,
352
+ 1 Y(1,IPI2),W3,M,AM,BM,CM,WD,WW,WU)
353
+ CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W3,W2,M,AM,
354
+ 1 BM,CM,WD,WW,WU)
355
+ 106 DO 107 J=1,M
356
+ Y(J,I) = W1(J)+W2(J)+Y(J,I)
357
+ 107 CONTINUE
358
+ 108 CONTINUE
359
+ 109 CONTINUE
360
+ IF (NPP) 132,110,132
361
+ C
362
+ C THE PERIODIC CASE IS TREATED USING THE CAPACITANCE MATRIX METHOD
363
+ C
364
+ 110 IF = 2**K
365
+ I = IF/2
366
+ I1 = I/2
367
+ CALL INDXB (I-I1,K-2,IM1,NM1)
368
+ CALL INDXB (I+I1,K-2,IP1,NP1)
369
+ CALL INDXB (I,K-1,IZ,NZ)
370
+ CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,Y(1,I),W1,M,AM,
371
+ 1 BM,CM,WD,WW,WU)
372
+ IZR = I
373
+ DO 111 J=1,M
374
+ W2(J) = W1(J)
375
+ 111 CONTINUE
376
+ DO 113 LL=2,K
377
+ L = K-LL+1
378
+ IR = L-1
379
+ I2 = 2**IR
380
+ I1 = I2/2
381
+ I = I2
382
+ CALL INDXC (I,IR,IDXC,NC)
383
+ CALL INDXB (I,IR,IZ,NZ)
384
+ CALL INDXB (I-I1,IR-1,IM1,NM1)
385
+ CALL INDXB (I+I1,IR-1,IP1,NP1)
386
+ CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W1,W1,M,AM,BM,
387
+ 1 CM,WD,WW,WU)
388
+ DO 112 J=1,M
389
+ W1(J) = Y(J,I)+W1(J)
390
+ 112 CONTINUE
391
+ CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,W1,M,AM,
392
+ 1 BM,CM,WD,WW,WU)
393
+ 113 CONTINUE
394
+ DO 118 LL=2,K
395
+ L = K-LL+1
396
+ IR = L-1
397
+ I2 = 2**IR
398
+ I1 = I2/2
399
+ I4 = I2+I2
400
+ IFD = IF-I2
401
+ DO 117 I=I2,IFD,I4
402
+ IF (I-I2-IZR) 117,114,117
403
+ 114 IF (I-NM) 115,115,118
404
+ 115 CALL INDXA (I,IR,IDXA,NA)
405
+ CALL INDXB (I,IR,IZ,NZ)
406
+ CALL INDXB (I-I1,IR-1,IM1,NM1)
407
+ CALL INDXB (I+I1,IR-1,IP1,NP1)
408
+ CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W2,W2,M,AM,
409
+ 1 BM,CM,WD,WW,WU)
410
+ DO 116 J=1,M
411
+ W2(J) = Y(J,I)+W2(J)
412
+ 116 CONTINUE
413
+ CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W2,W2,M,
414
+ 1 AM,BM,CM,WD,WW,WU)
415
+ IZR = I
416
+ IF (I-NM) 117,119,117
417
+ 117 CONTINUE
418
+ 118 CONTINUE
419
+ 119 DO 120 J=1,M
420
+ Y(J,NM+1) = Y(J,NM+1)-CN(NM+1)*W1(J)-AN(NM+1)*W2(J)
421
+ 120 CONTINUE
422
+ CALL INDXB (IF/2,K-1,IM1,NM1)
423
+ CALL INDXB (IF,K-1,IP,NP)
424
+ IF (NCMPLX) 121,122,121
425
+ 121 CALL CPRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
426
+ 1 Y(1,NM+1),M,AM,BM,CM,W1,W3,WW)
427
+ GO TO 123
428
+ 122 CALL PRDCT (NM+1,B(IP),NM1,B(IM1),0,DUM,0,DUM,Y(1,NM+1),
429
+ 1 Y(1,NM+1),M,AM,BM,CM,WD,WW,WU)
430
+ 123 DO 124 J=1,M
431
+ W1(J) = AN(1)*Y(J,NM+1)
432
+ W2(J) = CN(NM)*Y(J,NM+1)
433
+ Y(J,1) = Y(J,1)-W1(J)
434
+ Y(J,NM) = Y(J,NM)-W2(J)
435
+ 124 CONTINUE
436
+ DO 126 L=1,KDO
437
+ IR = L-1
438
+ I2 = 2**IR
439
+ I4 = I2+I2
440
+ I1 = I2/2
441
+ I = I4
442
+ CALL INDXA (I,IR,IDXA,NA)
443
+ CALL INDXB (I-I2,IR,IM2,NM2)
444
+ CALL INDXB (I-I2-I1,IR-1,IM3,NM3)
445
+ CALL INDXB (I-I1,IR-1,IM1,NM1)
446
+ CALL PRDCT (NM2,B(IM2),NM3,B(IM3),NM1,B(IM1),0,DUM,W1,W1,M,AM,
447
+ 1 BM,CM,WD,WW,WU)
448
+ CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),W1,W1,M,AM,BM,
449
+ 1 CM,WD,WW,WU)
450
+ DO 125 J=1,M
451
+ Y(J,I) = Y(J,I)-W1(J)
452
+ 125 CONTINUE
453
+ 126 CONTINUE
454
+ C
455
+ IZR = NM
456
+ DO 131 L=1,KDO
457
+ IR = L-1
458
+ I2 = 2**IR
459
+ I1 = I2/2
460
+ I3 = I2+I1
461
+ I4 = I2+I2
462
+ IRM1 = IR-1
463
+ DO 130 I=I4,IF,I4
464
+ IPI1 = I+I1
465
+ IPI2 = I+I2
466
+ IPI3 = I+I3
467
+ IF (IPI2-IZR) 127,128,127
468
+ 127 IF (I-IZR) 130,131,130
469
+ 128 CALL INDXC (I,IR,IDXC,NC)
470
+ CALL INDXB (IPI2,IR,IP2,NP2)
471
+ CALL INDXB (IPI1,IRM1,IP1,NP1)
472
+ CALL INDXB (IPI3,IRM1,IP3,NP3)
473
+ CALL PRDCT (NP2,B(IP2),NP1,B(IP1),NP3,B(IP3),0,DUM,W2,W2,M,
474
+ 1 AM,BM,CM,WD,WW,WU)
475
+ CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),W2,W2,M,AM,
476
+ 1 BM,CM,WD,WW,WU)
477
+ DO 129 J=1,M
478
+ Y(J,I) = Y(J,I)-W2(J)
479
+ 129 CONTINUE
480
+ IZR = I
481
+ GO TO 131
482
+ 130 CONTINUE
483
+ 131 CONTINUE
484
+ C
485
+ C BEGIN BACK SUBSTITUTION PHASE
486
+ C
487
+ 132 DO 144 LL=1,K
488
+ L = K-LL+1
489
+ IR = L-1
490
+ IRM1 = IR-1
491
+ I2 = 2**IR
492
+ I1 = I2/2
493
+ I4 = I2+I2
494
+ IFD = IF-I2
495
+ DO 143 I=I2,IFD,I4
496
+ IF (I-NM) 133,133,143
497
+ 133 IMI1 = I-I1
498
+ IMI2 = I-I2
499
+ IPI1 = I+I1
500
+ IPI2 = I+I2
501
+ CALL INDXA (I,IR,IDXA,NA)
502
+ CALL INDXC (I,IR,IDXC,NC)
503
+ CALL INDXB (I,IR,IZ,NZ)
504
+ CALL INDXB (IMI1,IRM1,IM1,NM1)
505
+ CALL INDXB (IPI1,IRM1,IP1,NP1)
506
+ IF (I-I2) 134,134,136
507
+ 134 DO 135 J=1,M
508
+ W1(J) = 0.
509
+ 135 CONTINUE
510
+ GO TO 137
511
+ 136 CALL PRDCT (NM1,B(IM1),0,DUM,0,DUM,NA,AN(IDXA),Y(1,IMI2),
512
+ 1 W1,M,AM,BM,CM,WD,WW,WU)
513
+ 137 IF (IPI2-NM) 140,140,138
514
+ 138 DO 139 J=1,M
515
+ W2(J) = 0.
516
+ 139 CONTINUE
517
+ GO TO 141
518
+ 140 CALL PRDCT (NP1,B(IP1),0,DUM,0,DUM,NC,CN(IDXC),Y(1,IPI2),
519
+ 1 W2,M,AM,BM,CM,WD,WW,WU)
520
+ 141 DO 142 J=1,M
521
+ W1(J) = Y(J,I)+W1(J)+W2(J)
522
+ 142 CONTINUE
523
+ CALL PRDCT (NZ,B(IZ),NM1,B(IM1),NP1,B(IP1),0,DUM,W1,Y(1,I),
524
+ 1 M,AM,BM,CM,WD,WW,WU)
525
+ 143 CONTINUE
526
+ 144 CONTINUE
527
+ RETURN
528
+ END
529
+ FUNCTION BSRH (XLL,XRR,IZ,C,A,BH,F,SGN)
530
+ DIMENSION A(*) ,C(*) ,BH(*)
531
+ COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
532
+ 1 NM ,NCMPLX ,IK
533
+ XL = XLL
534
+ XR = XRR
535
+ DX = .5*ABS(XR-XL)
536
+ 101 X = .5*(XL+XR)
537
+ IF (SGN*F(X,IZ,C,A,BH)) 103,105,102
538
+ 102 XR = X
539
+ GO TO 104
540
+ 103 XL = X
541
+ 104 DX = .5*DX
542
+ IF (DX-CNV) 105,105,101
543
+ 105 BSRH = .5*(XL+XR)
544
+ RETURN
545
+ END
546
+ SUBROUTINE COMPB (N,IERROR,AN,BN,CN,B,AH,BH)
547
+ C
548
+ C COMPB COMPUTES THE ROOTS OF THE B POLYNOMIALS USING SUBROUTINE
549
+ C TEVLS WHICH IS A MODIFICATION THE EISPACK PROGRAM TQLRAT.
550
+ C IERROR IS SET TO 4 IF EITHER TEVLS FAILS OR IF A(J+1)*C(J) IS
551
+ C LESS THAN ZERO FOR SOME J. AH,BH ARE TEMPORARY WORK ARRAYS.
552
+ C
553
+ DIMENSION AN(*) ,BN(*) ,CN(*) ,B(*) ,
554
+ 1 AH(*) ,BH(*)
555
+ COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
556
+ 1 NM ,NCMPLX ,IK
557
+ EPS = EPMACH(DUM)
558
+ BNORM = ABS(BN(1))
559
+ DO 102 J=2,NM
560
+ BNORM = AMAX1(BNORM,ABS(BN(J)))
561
+ ARG = AN(J)*CN(J-1)
562
+ IF (ARG) 119,101,101
563
+ 101 B(J) = SIGN(SQRT(ARG),AN(J))
564
+ 102 CONTINUE
565
+ CNV = EPS*BNORM
566
+ IF = 2**K
567
+ KDO = K-1
568
+ DO 108 L=1,KDO
569
+ IR = L-1
570
+ I2 = 2**IR
571
+ I4 = I2+I2
572
+ IPL = I4-1
573
+ IFD = IF-I4
574
+ DO 107 I=I4,IFD,I4
575
+ CALL INDXB (I,L,IB,NB)
576
+ IF (NB) 108,108,103
577
+ 103 JS = I-IPL
578
+ JF = JS+NB-1
579
+ LS = 0
580
+ DO 104 J=JS,JF
581
+ LS = LS+1
582
+ BH(LS) = BN(J)
583
+ AH(LS) = B(J)
584
+ 104 CONTINUE
585
+ CALL TEVLS (NB,BH,AH,IERROR)
586
+ IF (IERROR) 118,105,118
587
+ 105 LH = IB-1
588
+ DO 106 J=1,NB
589
+ LH = LH+1
590
+ B(LH) = -BH(J)
591
+ 106 CONTINUE
592
+ 107 CONTINUE
593
+ 108 CONTINUE
594
+ DO 109 J=1,NM
595
+ B(J) = -BN(J)
596
+ 109 CONTINUE
597
+ IF (NPP) 117,110,117
598
+ 110 NMP = NM+1
599
+ NB = NM+NMP
600
+ DO 112 J=1,NB
601
+ L1 = MOD(J-1,NMP)+1
602
+ L2 = MOD(J+NM-1,NMP)+1
603
+ ARG = AN(L1)*CN(L2)
604
+ IF (ARG) 119,111,111
605
+ 111 BH(J) = SIGN(SQRT(ARG),-AN(L1))
606
+ AH(J) = -BN(L1)
607
+ 112 CONTINUE
608
+ CALL TEVLS (NB,AH,BH,IERROR)
609
+ IF (IERROR) 118,113,118
610
+ 113 CALL INDXB (IF,K-1,J2,LH)
611
+ CALL INDXB (IF/2,K-1,J1,LH)
612
+ J2 = J2+1
613
+ LH = J2
614
+ N2M2 = J2+NM+NM-2
615
+ 114 D1 = ABS(B(J1)-B(J2-1))
616
+ D2 = ABS(B(J1)-B(J2))
617
+ D3 = ABS(B(J1)-B(J2+1))
618
+ IF ((D2 .LT. D1) .AND. (D2 .LT. D3)) GO TO 115
619
+ B(LH) = B(J2)
620
+ J2 = J2+1
621
+ LH = LH+1
622
+ IF (J2-N2M2) 114,114,116
623
+ 115 J2 = J2+1
624
+ J1 = J1+1
625
+ IF (J2-N2M2) 114,114,116
626
+ 116 B(LH) = B(N2M2+1)
627
+ CALL INDXB (IF,K-1,J1,J2)
628
+ J2 = J1+NMP+NMP
629
+ CALL PPADD (NM+1,IERROR,AN,CN,B(J1),B(J1),B(J2))
630
+ 117 RETURN
631
+ 118 IERROR = 4
632
+ RETURN
633
+ 119 IERROR = 5
634
+ RETURN
635
+ END
636
+ SUBROUTINE CPROD (ND,BD,NM1,BM1,NM2,BM2,NA,AA,X,YY,M,A,B,C,D,W,Y)
637
+ C
638
+ C PROD APPLIES A SEQUENCE OF MATRIX OPERATIONS TO THE VECTOR X AND
639
+ C STORES THE RESULT IN YY (COMPLEX CASE)
640
+ C AA ARRAY CONTAINING SCALAR MULTIPLIERS OF THE VECTOR X
641
+ C ND,NM1,NM2 ARE THE LENGTHS OF THE ARRAYS BD,BM1,BM2 RESPECTIVELY
642
+ C BD,BM1,BM2 ARE ARRAYS CONTAINING ROOTS OF CERTIAN B POLYNOMIALS
643
+ C NA IS THE LENGTH OF THE ARRAY AA
644
+ C X,YY THE MATRIX OPERATIONS ARE APPLIED TO X AND THE RESULT IS YY
645
+ C A,B,C ARE ARRAYS WHICH CONTAIN THE TRIDIAGONAL MATRIX
646
+ C M IS THE ORDER OF THE MATRIX
647
+ C D,W,Y ARE WORKING ARRAYS
648
+ C ISGN DETERMINES WHETHER OR NOT A CHANGE IN SIGN IS MADE
649
+ C
650
+ COMPLEX Y ,D ,W ,BD ,
651
+ 1 CRT ,DEN ,Y1 ,Y2
652
+ DIMENSION A(*) ,B(*) ,C(*) ,X(*) ,
653
+ 1 Y(*) ,D(*) ,W(*) ,BD(*) ,
654
+ 2 BM1(*) ,BM2(*) ,AA(*) ,YY(*)
655
+ DO 101 J=1,M
656
+ Y(J) = CMPLX(X(J),0.)
657
+ 101 CONTINUE
658
+ MM = M-1
659
+ ID = ND
660
+ M1 = NM1
661
+ M2 = NM2
662
+ IA = NA
663
+ 102 IFLG = 0
664
+ IF (ID) 109,109,103
665
+ 103 CRT = BD(ID)
666
+ ID = ID-1
667
+ C
668
+ C BEGIN SOLUTION TO SYSTEM
669
+ C
670
+ D(M) = A(M)/(B(M)-CRT)
671
+ W(M) = Y(M)/(B(M)-CRT)
672
+ DO 104 J=2,MM
673
+ K = M-J
674
+ DEN = B(K+1)-CRT-C(K+1)*D(K+2)
675
+ D(K+1) = A(K+1)/DEN
676
+ W(K+1) = (Y(K+1)-C(K+1)*W(K+2))/DEN
677
+ 104 CONTINUE
678
+ DEN = B(1)-CRT-C(1)*D(2)
679
+ IF (CABS(DEN)) 105,106,105
680
+ 105 Y(1) = (Y(1)-C(1)*W(2))/DEN
681
+ GO TO 107
682
+ 106 Y(1) = (1.,0.)
683
+ 107 DO 108 J=2,M
684
+ Y(J) = W(J)-D(J)*Y(J-1)
685
+ 108 CONTINUE
686
+ 109 IF (M1) 110,110,112
687
+ 110 IF (M2) 121,121,111
688
+ 111 RT = BM2(M2)
689
+ M2 = M2-1
690
+ GO TO 117
691
+ 112 IF (M2) 113,113,114
692
+ 113 RT = BM1(M1)
693
+ M1 = M1-1
694
+ GO TO 117
695
+ 114 IF (ABS(BM1(M1))-ABS(BM2(M2))) 116,116,115
696
+ 115 RT = BM1(M1)
697
+ M1 = M1-1
698
+ GO TO 117
699
+ 116 RT = BM2(M2)
700
+ M2 = M2-1
701
+ 117 Y1 = (B(1)-RT)*Y(1)+C(1)*Y(2)
702
+ IF (MM-2) 120,118,118
703
+ C
704
+ C MATRIX MULTIPLICATION
705
+ C
706
+ 118 DO 119 J=2,MM
707
+ Y2 = A(J)*Y(J-1)+(B(J)-RT)*Y(J)+C(J)*Y(J+1)
708
+ Y(J-1) = Y1
709
+ Y1 = Y2
710
+ 119 CONTINUE
711
+ 120 Y(M) = A(M)*Y(M-1)+(B(M)-RT)*Y(M)
712
+ Y(M-1) = Y1
713
+ IFLG = 1
714
+ GO TO 102
715
+ 121 IF (IA) 124,124,122
716
+ 122 RT = AA(IA)
717
+ IA = IA-1
718
+ IFLG = 1
719
+ C
720
+ C SCALAR MULTIPLICATION
721
+ C
722
+ DO 123 J=1,M
723
+ Y(J) = RT*Y(J)
724
+ 123 CONTINUE
725
+ 124 IF (IFLG) 125,125,102
726
+ 125 DO 126 J=1,M
727
+ YY(J) = REAL(Y(J))
728
+ 126 CONTINUE
729
+ RETURN
730
+ END
731
+ SUBROUTINE CPRODP (ND,BD,NM1,BM1,NM2,BM2,NA,AA,X,YY,M,A,B,C,D,U,Y)
732
+ C
733
+ C PRODP APPLIES A SEQUENCE OF MATRIX OPERATIONS TO THE VECTOR X AND
734
+ C STORES THE RESULT IN YY PERIODIC BOUNDARY CONDITIONS
735
+ C AND COMPLEX CASE
736
+ C
737
+ C BD,BM1,BM2 ARE ARRAYS CONTAINING ROOTS OF CERTIAN B POLYNOMIALS
738
+ C ND,NM1,NM2 ARE THE LENGTHS OF THE ARRAYS BD,BM1,BM2 RESPECTIVELY
739
+ C AA ARRAY CONTAINING SCALAR MULTIPLIERS OF THE VECTOR X
740
+ C NA IS THE LENGTH OF THE ARRAY AA
741
+ C X,YY THE MATRIX OPERATIONS ARE APPLIED TO X AND THE RESULT IS YY
742
+ C A,B,C ARE ARRAYS WHICH CONTAIN THE TRIDIAGONAL MATRIX
743
+ C M IS THE ORDER OF THE MATRIX
744
+ C D,U,Y ARE WORKING ARRAYS
745
+ C ISGN DETERMINES WHETHER OR NOT A CHANGE IN SIGN IS MADE
746
+ C
747
+ COMPLEX Y ,D ,U ,V ,
748
+ 1 DEN ,BH ,YM ,AM ,
749
+ 2 Y1 ,Y2 ,YH ,BD ,
750
+ 3 CRT
751
+ DIMENSION A(*) ,B(*) ,C(*) ,X(*) ,
752
+ 1 Y(*) ,D(*) ,U(*) ,BD(*) ,
753
+ 2 BM1(*) ,BM2(*) ,AA(*) ,YY(*)
754
+ DO 101 J=1,M
755
+ Y(J) = CMPLX(X(J),0.)
756
+ 101 CONTINUE
757
+ MM = M-1
758
+ MM2 = M-2
759
+ ID = ND
760
+ M1 = NM1
761
+ M2 = NM2
762
+ IA = NA
763
+ 102 IFLG = 0
764
+ IF (ID) 111,111,103
765
+ 103 CRT = BD(ID)
766
+ ID = ID-1
767
+ IFLG = 1
768
+ C
769
+ C BEGIN SOLUTION TO SYSTEM
770
+ C
771
+ BH = B(M)-CRT
772
+ YM = Y(M)
773
+ DEN = B(1)-CRT
774
+ D(1) = C(1)/DEN
775
+ U(1) = A(1)/DEN
776
+ Y(1) = Y(1)/DEN
777
+ V = CMPLX(C(M),0.)
778
+ IF (MM2-2) 106,104,104
779
+ 104 DO 105 J=2,MM2
780
+ DEN = B(J)-CRT-A(J)*D(J-1)
781
+ D(J) = C(J)/DEN
782
+ U(J) = -A(J)*U(J-1)/DEN
783
+ Y(J) = (Y(J)-A(J)*Y(J-1))/DEN
784
+ BH = BH-V*U(J-1)
785
+ YM = YM-V*Y(J-1)
786
+ V = -V*D(J-1)
787
+ 105 CONTINUE
788
+ 106 DEN = B(M-1)-CRT-A(M-1)*D(M-2)
789
+ D(M-1) = (C(M-1)-A(M-1)*U(M-2))/DEN
790
+ Y(M-1) = (Y(M-1)-A(M-1)*Y(M-2))/DEN
791
+ AM = A(M)-V*D(M-2)
792
+ BH = BH-V*U(M-2)
793
+ YM = YM-V*Y(M-2)
794
+ DEN = BH-AM*D(M-1)
795
+ IF (CABS(DEN)) 107,108,107
796
+ 107 Y(M) = (YM-AM*Y(M-1))/DEN
797
+ GO TO 109
798
+ 108 Y(M) = (1.,0.)
799
+ 109 Y(M-1) = Y(M-1)-D(M-1)*Y(M)
800
+ DO 110 J=2,MM
801
+ K = M-J
802
+ Y(K) = Y(K)-D(K)*Y(K+1)-U(K)*Y(M)
803
+ 110 CONTINUE
804
+ 111 IF (M1) 112,112,114
805
+ 112 IF (M2) 123,123,113
806
+ 113 RT = BM2(M2)
807
+ M2 = M2-1
808
+ GO TO 119
809
+ 114 IF (M2) 115,115,116
810
+ 115 RT = BM1(M1)
811
+ M1 = M1-1
812
+ GO TO 119
813
+ 116 IF (ABS(BM1(M1))-ABS(BM2(M2))) 118,118,117
814
+ 117 RT = BM1(M1)
815
+ M1 = M1-1
816
+ GO TO 119
817
+ 118 RT = BM2(M2)
818
+ M2 = M2-1
819
+ C
820
+ C MATRIX MULTIPLICATION
821
+ C
822
+ 119 YH = Y(1)
823
+ Y1 = (B(1)-RT)*Y(1)+C(1)*Y(2)+A(1)*Y(M)
824
+ IF (MM-2) 122,120,120
825
+ 120 DO 121 J=2,MM
826
+ Y2 = A(J)*Y(J-1)+(B(J)-RT)*Y(J)+C(J)*Y(J+1)
827
+ Y(J-1) = Y1
828
+ Y1 = Y2
829
+ 121 CONTINUE
830
+ 122 Y(M) = A(M)*Y(M-1)+(B(M)-RT)*Y(M)+C(M)*YH
831
+ Y(M-1) = Y1
832
+ IFLG = 1
833
+ GO TO 102
834
+ 123 IF (IA) 126,126,124
835
+ 124 RT = AA(IA)
836
+ IA = IA-1
837
+ IFLG = 1
838
+ C
839
+ C SCALAR MULTIPLICATION
840
+ C
841
+ DO 125 J=1,M
842
+ Y(J) = RT*Y(J)
843
+ 125 CONTINUE
844
+ 126 IF (IFLG) 127,127,102
845
+ 127 DO 128 J=1,M
846
+ YY(J) = REAL(Y(J))
847
+ 128 CONTINUE
848
+ RETURN
849
+ END
850
+ SUBROUTINE INDXA (I,IR,IDXA,NA)
851
+ COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
852
+ 1 NM ,NCMPLX ,IK
853
+ NA = 2**IR
854
+ IDXA = I-NA+1
855
+ IF (I-NM) 102,102,101
856
+ 101 NA = 0
857
+ 102 RETURN
858
+ END
859
+ SUBROUTINE INDXB (I,IR,IDX,IDP)
860
+ C
861
+ C B(IDX) IS THE LOCATION OF THE FIRST ROOT OF THE B(I,IR) POLYNOMIAL
862
+ C
863
+ COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
864
+ 1 NM ,NCMPLX ,IK
865
+ IDP = 0
866
+ IF (IR) 107,101,103
867
+ 101 IF (I-NM) 102,102,107
868
+ 102 IDX = I
869
+ IDP = 1
870
+ RETURN
871
+ 103 IZH = 2**IR
872
+ ID = I-IZH-IZH
873
+ IDX = ID+ID+(IR-1)*IK+IR+(IK-I)/IZH+4
874
+ IPL = IZH-1
875
+ IDP = IZH+IZH-1
876
+ IF (I-IPL-NM) 105,105,104
877
+ 104 IDP = 0
878
+ RETURN
879
+ 105 IF (I+IPL-NM) 107,107,106
880
+ 106 IDP = NM+IPL-I+1
881
+ 107 RETURN
882
+ END
883
+ SUBROUTINE INDXC (I,IR,IDXC,NC)
884
+ COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
885
+ 1 NM ,NCMPLX ,IK
886
+ NC = 2**IR
887
+ IDXC = I
888
+ IF (IDXC+NC-1-NM) 102,102,101
889
+ 101 NC = 0
890
+ 102 RETURN
891
+ END
892
+ SUBROUTINE PPADD (N,IERROR,A,C,CBP,BP,BH)
893
+ C
894
+ C PPADD COMPUTES THE EIGENVALUES OF THE PERIODIC TRIDIAGONAL MATRIX
895
+ C WITH COEFFICIENTS AN,BN,CN
896
+ C
897
+ C N IS THE ORDER OF THE BH AND BP POLYNOMIALS
898
+ C ON OUTPUT BP CONTIANS THE EIGENVALUES
899
+ C CBP IS THE SAME AS BP EXCEPT TYPE COMPLEX
900
+ C BH IS USED TO TEMPORARILY STORE THE ROOTS OF THE B HAT POLYNOMIAL
901
+ C WHICH ENTERS THROUGH BP
902
+ C
903
+ COMPLEX CF ,CX ,FSG ,HSG ,
904
+ 1 DD ,F ,FP ,FPP ,
905
+ 2 CDIS ,R1 ,R2 ,R3 ,
906
+ 3 CBP
907
+ DIMENSION A(*) ,C(*) ,BP(*) ,BH(*) ,
908
+ 1 CBP(*)
909
+ COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
910
+ 1 NM ,NCMPLX ,IK
911
+ EXTERNAL PSGF ,PPSPF ,PPSGF
912
+ SCNV = SQRT(CNV)
913
+ IZ = N
914
+ IZM = IZ-1
915
+ IZM2 = IZ-2
916
+ IF (BP(N)-BP(1)) 101,142,103
917
+ 101 DO 102 J=1,N
918
+ NT = N-J
919
+ BH(J) = BP(NT+1)
920
+ 102 CONTINUE
921
+ GO TO 105
922
+ 103 DO 104 J=1,N
923
+ BH(J) = BP(J)
924
+ 104 CONTINUE
925
+ 105 NCMPLX = 0
926
+ MODIZ = MOD(IZ,2)
927
+ IS = 1
928
+ IF (MODIZ) 106,107,106
929
+ 106 IF (A(1)) 110,142,107
930
+ 107 XL = BH(1)
931
+ DB = BH(3)-BH(1)
932
+ 108 XL = XL-DB
933
+ IF (PSGF(XL,IZ,C,A,BH)) 108,108,109
934
+ 109 SGN = -1.
935
+ CBP(1) = CMPLX(BSRH(XL,BH(1),IZ,C,A,BH,PSGF,SGN),0.)
936
+ IS = 2
937
+ 110 IF = IZ-1
938
+ IF (MODIZ) 111,112,111
939
+ 111 IF (A(1)) 112,142,115
940
+ 112 XR = BH(IZ)
941
+ DB = BH(IZ)-BH(IZ-2)
942
+ 113 XR = XR+DB
943
+ IF (PSGF(XR,IZ,C,A,BH)) 113,114,114
944
+ 114 SGN = 1.
945
+ CBP(IZ) = CMPLX(BSRH(BH(IZ),XR,IZ,C,A,BH,PSGF,SGN),0.)
946
+ IF = IZ-2
947
+ 115 DO 136 IG=IS,IF,2
948
+ XL = BH(IG)
949
+ XR = BH(IG+1)
950
+ SGN = -1.
951
+ XM = BSRH(XL,XR,IZ,C,A,BH,PPSPF,SGN)
952
+ PSG = PSGF(XM,IZ,C,A,BH)
953
+ IF (ABS(PSG)-EPS) 118,118,116
954
+ 116 IF (PSG*PPSGF(XM,IZ,C,A,BH)) 117,118,119
955
+ C
956
+ C CASE OF A REAL ZERO
957
+ C
958
+ 117 SGN = 1.
959
+ CBP(IG) = CMPLX(BSRH(BH(IG),XM,IZ,C,A,BH,PSGF,SGN),0.)
960
+ SGN = -1.
961
+ CBP(IG+1) = CMPLX(BSRH(XM,BH(IG+1),IZ,C,A,BH,PSGF,SGN),0.)
962
+ GO TO 136
963
+ C
964
+ C CASE OF A MULTIPLE ZERO
965
+ C
966
+ 118 CBP(IG) = CMPLX(XM,0.)
967
+ CBP(IG+1) = CMPLX(XM,0.)
968
+ GO TO 136
969
+ C
970
+ C CASE OF A COMPLEX ZERO
971
+ C
972
+ 119 IT = 0
973
+ ICV = 0
974
+ CX = CMPLX(XM,0.)
975
+ 120 FSG = (1.,0.)
976
+ HSG = (1.,0.)
977
+ FP = (0.,0.)
978
+ FPP = (0.,0.)
979
+ DO 121 J=1,IZ
980
+ DD = 1./(CX-BH(J))
981
+ FSG = FSG*A(J)*DD
982
+ HSG = HSG*C(J)*DD
983
+ FP = FP+DD
984
+ FPP = FPP-DD*DD
985
+ 121 CONTINUE
986
+ IF (MODIZ) 123,122,123
987
+ 122 F = (1.,0.)-FSG-HSG
988
+ GO TO 124
989
+ 123 F = (1.,0.)+FSG+HSG
990
+ 124 I3 = 0
991
+ IF (CABS(FP)) 126,126,125
992
+ 125 I3 = 1
993
+ R3 = -F/FP
994
+ 126 I2 = 0
995
+ IF (CABS(FPP)) 132,132,127
996
+ 127 I2 = 1
997
+ CDIS = CSQRT(FP**2-2.*F*FPP)
998
+ R1 = CDIS-FP
999
+ R2 = -FP-CDIS
1000
+ IF (CABS(R1)-CABS(R2)) 129,129,128
1001
+ 128 R1 = R1/FPP
1002
+ GO TO 130
1003
+ 129 R1 = R2/FPP
1004
+ 130 R2 = 2.*F/FPP/R1
1005
+ IF (CABS(R2) .LT. CABS(R1)) R1 = R2
1006
+ IF (I3) 133,133,131
1007
+ 131 IF (CABS(R3) .LT. CABS(R1)) R1 = R3
1008
+ GO TO 133
1009
+ 132 R1 = R3
1010
+ 133 CX = CX+R1
1011
+ IT = IT+1
1012
+ IF (IT .GT. 50) GO TO 142
1013
+ IF (CABS(R1) .GT. SCNV) GO TO 120
1014
+ IF (ICV) 134,134,135
1015
+ 134 ICV = 1
1016
+ GO TO 120
1017
+ 135 CBP(IG) = CX
1018
+ CBP(IG+1) = CONJG(CX)
1019
+ 136 CONTINUE
1020
+ IF (CABS(CBP(N))-CABS(CBP(1))) 137,142,139
1021
+ 137 NHALF = N/2
1022
+ DO 138 J=1,NHALF
1023
+ NT = N-J
1024
+ CX = CBP(J)
1025
+ CBP(J) = CBP(NT+1)
1026
+ CBP(NT+1) = CX
1027
+ 138 CONTINUE
1028
+ 139 NCMPLX = 1
1029
+ DO 140 J=2,IZ
1030
+ IF (AIMAG(CBP(J))) 143,140,143
1031
+ 140 CONTINUE
1032
+ NCMPLX = 0
1033
+ DO 141 J=2,IZ
1034
+ BP(J) = REAL(CBP(J))
1035
+ 141 CONTINUE
1036
+ GO TO 143
1037
+ 142 IERROR = 4
1038
+ 143 CONTINUE
1039
+ RETURN
1040
+ END
1041
+ SUBROUTINE PROD (ND,BD,NM1,BM1,NM2,BM2,NA,AA,X,Y,M,A,B,C,D,W,U)
1042
+ C
1043
+ C PROD APPLIES A SEQUENCE OF MATRIX OPERATIONS TO THE VECTOR X AND
1044
+ C STORES THE RESULT IN Y
1045
+ C BD,BM1,BM2 ARE ARRAYS CONTAINING ROOTS OF CERTIAN B POLYNOMIALS
1046
+ C ND,NM1,NM2 ARE THE LENGTHS OF THE ARRAYS BD,BM1,BM2 RESPECTIVELY
1047
+ C AA ARRAY CONTAINING SCALAR MULTIPLIERS OF THE VECTOR X
1048
+ C NA IS THE LENGTH OF THE ARRAY AA
1049
+ C X,Y THE MATRIX OPERATIONS ARE APPLIED TO X AND THE RESULT IS Y
1050
+ C A,B,C ARE ARRAYS WHICH CONTAIN THE TRIDIAGONAL MATRIX
1051
+ C M IS THE ORDER OF THE MATRIX
1052
+ C D,W,U ARE WORKING ARRAYS
1053
+ C IS DETERMINES WHETHER OR NOT A CHANGE IN SIGN IS MADE
1054
+ C
1055
+ DIMENSION A(*) ,B(*) ,C(*) ,X(*) ,
1056
+ 1 Y(*) ,D(*) ,W(*) ,BD(*) ,
1057
+ 2 BM1(*) ,BM2(*) ,AA(*) ,U(*)
1058
+ DO 101 J=1,M
1059
+ W(J) = X(J)
1060
+ Y(J) = W(J)
1061
+ 101 CONTINUE
1062
+ MM = M-1
1063
+ ID = ND
1064
+ IBR = 0
1065
+ M1 = NM1
1066
+ M2 = NM2
1067
+ IA = NA
1068
+ 102 IF (IA) 105,105,103
1069
+ 103 RT = AA(IA)
1070
+ IF (ND .EQ. 0) RT = -RT
1071
+ IA = IA-1
1072
+ C
1073
+ C SCALAR MULTIPLICATION
1074
+ C
1075
+ DO 104 J=1,M
1076
+ Y(J) = RT*W(J)
1077
+ 104 CONTINUE
1078
+ 105 IF (ID) 125,125,106
1079
+ 106 RT = BD(ID)
1080
+ ID = ID-1
1081
+ IF (ID .EQ. 0) IBR = 1
1082
+ C
1083
+ C BEGIN SOLUTION TO SYSTEM
1084
+ C
1085
+ D(M) = A(M)/(B(M)-RT)
1086
+ W(M) = Y(M)/(B(M)-RT)
1087
+ DO 107 J=2,MM
1088
+ K = M-J
1089
+ DEN = B(K+1)-RT-C(K+1)*D(K+2)
1090
+ D(K+1) = A(K+1)/DEN
1091
+ W(K+1) = (Y(K+1)-C(K+1)*W(K+2))/DEN
1092
+ 107 CONTINUE
1093
+ DEN = B(1)-RT-C(1)*D(2)
1094
+ W(1) = 1.
1095
+ IF (DEN) 108,109,108
1096
+ 108 W(1) = (Y(1)-C(1)*W(2))/DEN
1097
+ 109 DO 110 J=2,M
1098
+ W(J) = W(J)-D(J)*W(J-1)
1099
+ 110 CONTINUE
1100
+ IF (NA) 113,113,102
1101
+ 111 DO 112 J=1,M
1102
+ Y(J) = W(J)
1103
+ 112 CONTINUE
1104
+ IBR = 1
1105
+ GO TO 102
1106
+ 113 IF (M1) 114,114,115
1107
+ 114 IF (M2) 111,111,120
1108
+ 115 IF (M2) 117,117,116
1109
+ 116 IF (ABS(BM1(M1))-ABS(BM2(M2))) 120,120,117
1110
+ 117 IF (IBR) 118,118,119
1111
+ 118 IF (ABS(BM1(M1)-BD(ID))-ABS(BM1(M1)-RT)) 111,119,119
1112
+ 119 RT = RT-BM1(M1)
1113
+ M1 = M1-1
1114
+ GO TO 123
1115
+ 120 IF (IBR) 121,121,122
1116
+ 121 IF (ABS(BM2(M2)-BD(ID))-ABS(BM2(M2)-RT)) 111,122,122
1117
+ 122 RT = RT-BM2(M2)
1118
+ M2 = M2-1
1119
+ 123 DO 124 J=1,M
1120
+ Y(J) = Y(J)+RT*W(J)
1121
+ 124 CONTINUE
1122
+ GO TO 102
1123
+ 125 RETURN
1124
+ END
1125
+ SUBROUTINE PRODP (ND,BD,NM1,BM1,NM2,BM2,NA,AA,X,Y,M,A,B,C,D,U,W)
1126
+ C
1127
+ C PRODP APPLIES A SEQUENCE OF MATRIX OPERATIONS TO THE VECTOR X AND
1128
+ C STORES THE RESULT IN Y PERIODIC BOUNDARY CONDITIONS
1129
+ C
1130
+ C BD,BM1,BM2 ARE ARRAYS CONTAINING ROOTS OF CERTIAN B POLYNOMIALS
1131
+ C ND,NM1,NM2 ARE THE LENGTHS OF THE ARRAYS BD,BM1,BM2 RESPECTIVELY
1132
+ C AA ARRAY CONTAINING SCALAR MULTIPLIERS OF THE VECTOR X
1133
+ C NA IS THE LENGTH OF THE ARRAY AA
1134
+ C X,Y THE MATRIX OPERATIONS ARE APPLIED TO X AND THE RESULT IS Y
1135
+ C A,B,C ARE ARRAYS WHICH CONTAIN THE TRIDIAGONAL MATRIX
1136
+ C M IS THE ORDER OF THE MATRIX
1137
+ C D,U,W ARE WORKING ARRAYS
1138
+ C IS DETERMINES WHETHER OR NOT A CHANGE IN SIGN IS MADE
1139
+ C
1140
+ DIMENSION A(*) ,B(*) ,C(*) ,X(*) ,
1141
+ 1 Y(*) ,D(*) ,U(*) ,BD(*) ,
1142
+ 2 BM1(*) ,BM2(*) ,AA(*) ,W(*)
1143
+ DO 101 J=1,M
1144
+ Y(J) = X(J)
1145
+ W(J) = Y(J)
1146
+ 101 CONTINUE
1147
+ MM = M-1
1148
+ MM2 = M-2
1149
+ ID = ND
1150
+ IBR = 0
1151
+ M1 = NM1
1152
+ M2 = NM2
1153
+ IA = NA
1154
+ 102 IF (IA) 105,105,103
1155
+ 103 RT = AA(IA)
1156
+ IF (ND .EQ. 0) RT = -RT
1157
+ IA = IA-1
1158
+ DO 104 J=1,M
1159
+ Y(J) = RT*W(J)
1160
+ 104 CONTINUE
1161
+ 105 IF (ID) 128,128,106
1162
+ 106 RT = BD(ID)
1163
+ ID = ID-1
1164
+ IF (ID .EQ. 0) IBR = 1
1165
+ C
1166
+ C BEGIN SOLUTION TO SYSTEM
1167
+ C
1168
+ BH = B(M)-RT
1169
+ YM = Y(M)
1170
+ DEN = B(1)-RT
1171
+ D(1) = C(1)/DEN
1172
+ U(1) = A(1)/DEN
1173
+ W(1) = Y(1)/DEN
1174
+ V = C(M)
1175
+ IF (MM2-2) 109,107,107
1176
+ 107 DO 108 J=2,MM2
1177
+ DEN = B(J)-RT-A(J)*D(J-1)
1178
+ D(J) = C(J)/DEN
1179
+ U(J) = -A(J)*U(J-1)/DEN
1180
+ W(J) = (Y(J)-A(J)*W(J-1))/DEN
1181
+ BH = BH-V*U(J-1)
1182
+ YM = YM-V*W(J-1)
1183
+ V = -V*D(J-1)
1184
+ 108 CONTINUE
1185
+ 109 DEN = B(M-1)-RT-A(M-1)*D(M-2)
1186
+ D(M-1) = (C(M-1)-A(M-1)*U(M-2))/DEN
1187
+ W(M-1) = (Y(M-1)-A(M-1)*W(M-2))/DEN
1188
+ AM = A(M)-V*D(M-2)
1189
+ BH = BH-V*U(M-2)
1190
+ YM = YM-V*W(M-2)
1191
+ DEN = BH-AM*D(M-1)
1192
+ IF (DEN) 110,111,110
1193
+ 110 W(M) = (YM-AM*W(M-1))/DEN
1194
+ GO TO 112
1195
+ 111 W(M) = 1.
1196
+ 112 W(M-1) = W(M-1)-D(M-1)*W(M)
1197
+ DO 113 J=2,MM
1198
+ K = M-J
1199
+ W(K) = W(K)-D(K)*W(K+1)-U(K)*W(M)
1200
+ 113 CONTINUE
1201
+ IF (NA) 116,116,102
1202
+ 114 DO 115 J=1,M
1203
+ Y(J) = W(J)
1204
+ 115 CONTINUE
1205
+ IBR = 1
1206
+ GO TO 102
1207
+ 116 IF (M1) 117,117,118
1208
+ 117 IF (M2) 114,114,123
1209
+ 118 IF (M2) 120,120,119
1210
+ 119 IF (ABS(BM1(M1))-ABS(BM2(M2))) 123,123,120
1211
+ 120 IF (IBR) 121,121,122
1212
+ 121 IF (ABS(BM1(M1)-BD(ID))-ABS(BM1(M1)-RT)) 114,122,122
1213
+ 122 RT = RT-BM1(M1)
1214
+ M1 = M1-1
1215
+ GO TO 126
1216
+ 123 IF (IBR) 124,124,125
1217
+ 124 IF (ABS(BM2(M2)-BD(ID))-ABS(BM2(M2)-RT)) 114,125,125
1218
+ 125 RT = RT-BM2(M2)
1219
+ M2 = M2-1
1220
+ 126 DO 127 J=1,M
1221
+ Y(J) = Y(J)+RT*W(J)
1222
+ 127 CONTINUE
1223
+ GO TO 102
1224
+ 128 RETURN
1225
+ END
1226
+ SUBROUTINE TEVLS (N,D,E2,IERR)
1227
+ C
1228
+ INTEGER I ,J ,L ,M ,
1229
+ 1 N ,II ,L1 ,MML ,
1230
+ 2 IERR
1231
+ REAL D(N) ,E2(N)
1232
+ REAL B ,C ,F ,G ,
1233
+ 1 H ,P ,R ,S ,
1234
+ 2 MACHEP
1235
+ C
1236
+ C REAL SQRT,ABS,SIGN
1237
+ C
1238
+ COMMON /CBLKT/ NPP ,K ,MACHEP ,CNV ,
1239
+ 1 NM ,NCMPLX ,IK
1240
+ C
1241
+ C THIS SUBROUTINE IS A MODIFICATION OF THE EISPACK SUBROUTINE TQLRAT
1242
+ C ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH.
1243
+ C
1244
+ C THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC
1245
+ C TRIDIAGONAL MATRIX BY THE RATIONAL QL METHOD.
1246
+ C
1247
+ C ON INPUT-
1248
+ C
1249
+ C N IS THE ORDER OF THE MATRIX,
1250
+ C
1251
+ C D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX,
1252
+ C
1253
+ C E2 CONTAINS THE SUBDIAGONAL ELEMENTS OF THE
1254
+ C INPUT MATRIX IN ITS LAST N-1 POSITIONS. E2(1) IS ARBITRARY.
1255
+ C
1256
+ C ON OUTPUT-
1257
+ C
1258
+ C D CONTAINS THE EIGENVALUES IN ASCENDING ORDER. IF AN
1259
+ C ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND
1260
+ C ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE
1261
+ C THE SMALLEST EIGENVALUES,
1262
+ C
1263
+ C E2 HAS BEEN DESTROYED,
1264
+ C
1265
+ C IERR IS SET TO
1266
+ C ZERO FOR NORMAL RETURN,
1267
+ C J IF THE J-TH EIGENVALUE HAS NOT BEEN
1268
+ C DETERMINED AFTER 30 ITERATIONS.
1269
+ C
1270
+ C QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO B. S. GARBOW,
1271
+ C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
1272
+ C
1273
+ C
1274
+ C ********** MACHEP IS A MACHINE DEPENDENT PARAMETER SPECIFYING
1275
+ C THE RELATIVE PRECISION OF FLOATING POINT ARITHMETIC.
1276
+ C
1277
+ C **********
1278
+ C
1279
+ IERR = 0
1280
+ IF (N .EQ. 1) GO TO 115
1281
+ C
1282
+ DO 101 I=2,N
1283
+ E2(I-1) = E2(I)*E2(I)
1284
+ 101 CONTINUE
1285
+ C
1286
+ F = 0.0
1287
+ B = 0.0
1288
+ E2(N) = 0.0
1289
+ C
1290
+ DO 112 L=1,N
1291
+ J = 0
1292
+ H = MACHEP*(ABS(D(L))+SQRT(E2(L)))
1293
+ IF (B .GT. H) GO TO 102
1294
+ B = H
1295
+ C = B*B
1296
+ C
1297
+ C ********** LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT **********
1298
+ C
1299
+ 102 DO 103 M=L,N
1300
+ IF (E2(M) .LE. C) GO TO 104
1301
+ C
1302
+ C ********** E2(N) IS ALWAYS ZERO, SO THERE IS NO EXIT
1303
+ C THROUGH THE BOTTOM OF THE LOOP **********
1304
+ C
1305
+ 103 CONTINUE
1306
+ C
1307
+ 104 IF (M .EQ. L) GO TO 108
1308
+ 105 IF (J .EQ. 30) GO TO 114
1309
+ J = J+1
1310
+ C
1311
+ C ********** FORM SHIFT **********
1312
+ C
1313
+ L1 = L+1
1314
+ S = SQRT(E2(L))
1315
+ G = D(L)
1316
+ P = (D(L1)-G)/(2.0*S)
1317
+ R = SQRT(P*P+1.0)
1318
+ D(L) = S/(P+SIGN(R,P))
1319
+ H = G-D(L)
1320
+ C
1321
+ DO 106 I=L1,N
1322
+ D(I) = D(I)-H
1323
+ 106 CONTINUE
1324
+ C
1325
+ F = F+H
1326
+ C
1327
+ C ********** RATIONAL QL TRANSFORMATION **********
1328
+ C
1329
+ G = D(M)
1330
+ IF (G .EQ. 0.0) G = B
1331
+ H = G
1332
+ S = 0.0
1333
+ MML = M-L
1334
+ C
1335
+ C ********** FOR I=M-1 STEP -1 UNTIL L DO -- **********
1336
+ C
1337
+ DO 107 II=1,MML
1338
+ I = M-II
1339
+ P = G*H
1340
+ R = P+E2(I)
1341
+ E2(I+1) = S*R
1342
+ S = E2(I)/R
1343
+ D(I+1) = H+S*(H+D(I))
1344
+ G = D(I)-E2(I)/G
1345
+ IF (G .EQ. 0.0) G = B
1346
+ H = G*P/R
1347
+ 107 CONTINUE
1348
+ C
1349
+ E2(L) = S*G
1350
+ D(L) = H
1351
+ C
1352
+ C ********** GUARD AGAINST UNDERFLOWED H **********
1353
+ C
1354
+ IF (H .EQ. 0.0) GO TO 108
1355
+ IF (ABS(E2(L)) .LE. ABS(C/H)) GO TO 108
1356
+ E2(L) = H*E2(L)
1357
+ IF (E2(L) .NE. 0.0) GO TO 105
1358
+ 108 P = D(L)+F
1359
+ C
1360
+ C ********** ORDER EIGENVALUES **********
1361
+ C
1362
+ IF (L .EQ. 1) GO TO 110
1363
+ C
1364
+ C ********** FOR I=L STEP -1 UNTIL 2 DO -- **********
1365
+ C
1366
+ DO 109 II=2,L
1367
+ I = L+2-II
1368
+ IF (P .GE. D(I-1)) GO TO 111
1369
+ D(I) = D(I-1)
1370
+ 109 CONTINUE
1371
+ C
1372
+ 110 I = 1
1373
+ 111 D(I) = P
1374
+ 112 CONTINUE
1375
+ C
1376
+ IF (ABS(D(N)) .GE. ABS(D(1))) GO TO 115
1377
+ NHALF = N/2
1378
+ DO 113 I=1,NHALF
1379
+ NTOP = N-I
1380
+ DHOLD = D(I)
1381
+ D(I) = D(NTOP+1)
1382
+ D(NTOP+1) = DHOLD
1383
+ 113 CONTINUE
1384
+ GO TO 115
1385
+ C
1386
+ C ********** SET ERROR -- NO CONVERGENCE TO AN
1387
+ C EIGENVALUE AFTER 30 ITERATIONS **********
1388
+ C
1389
+ 114 IERR = L
1390
+ 115 RETURN
1391
+ C
1392
+ C ********** LAST CARD OF TQLRAT **********
1393
+ C
1394
+ C
1395
+ C REVISION HISTORY---
1396
+ C
1397
+ C SEPTEMBER 1973 VERSION 1
1398
+ C APRIL 1976 VERSION 2
1399
+ C JANUARY 1978 VERSION 3
1400
+ C DECEMBER 1979 VERSION 3.1
1401
+ C FEBRUARY 1985 DOCUMENTATION UPGRADE
1402
+ C NOVEMBER 1988 VERSION 3.2, FORTRAN 77 CHANGES
1403
+ C-----------------------------------------------------------------------
1404
+ END