5
6
7
8
9
10
11
12 INTEGER INFO, LDZ, M, N
13 REAL ORFAC
14
15
16 INTEGER IBLOCK( * ), IFAIL( * ), ISPLIT( * ),
17 $ IWORK( * )
18 REAL D( * ), E( * ), ( * ), ( * ), Z( LDZ, * )
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113 REAL ZERO, ONE, TEN, ODM1
114 parameter( zero = 0.0e+0, one = 1.0e+0, ten = 1.0e+1,
115 $ odm1 = 1.0e-1 )
116 INTEGER MAXITS, EXTRA
117 parameter( maxits = 5, extra = 2 )
118
119
120 INTEGER B1, BLKSIZ, BN, GPIND, I, IINFO, INDRV1,
121 $ INDRV2, INDRV3, INDRV4, INDRV5, ITS, J, J1,
122 $ JBLK, JMAX, NBLK, NRMCHK
123 REAL EPS, EPS1, NRM, ONENRM, ORTOL, PERTOL, SCL,
124 $ SEP, STPCRT, TOL, XJ, XJM, ZTR
125
126
127 INTEGER ISEED( 4 )
128
129
130 INTEGER ISAMAX
131 REAL SASUM, SDOT, SLAMCH, SNRM2
133
134
137
138
139 INTRINSIC abs,
max, sqrt
140
141
142
143
144
145 info = 0
146 DO 10 i = 1, m
147 ifail( i ) = 0
148 10 CONTINUE
149
150 IF( n.LT.0 ) THEN
151 info = -1
152 ELSE IF( m.LT.0 .OR. m.GT.n ) THEN
153 info = -4
154 ELSE IF( orfac.LT.zero ) THEN
155 info = -8
156 ELSE IF( ldz.LT.
max( 1, n ) )
THEN
157 info = -10
158 ELSE
159 DO 20 j = 2, m
160 IF( iblock( j ).LT.iblock( j-1 ) ) THEN
161 info = -6
162 GO TO 30
163 END IF
164 IF( iblock( j ).EQ.iblock( j-1 ) .AND. w( j ).LT.w( j-1 ) )
165 $ THEN
166 info = -5
167 GO TO 30
168 END IF
169 20 CONTINUE
170 30 CONTINUE
171 END IF
172
173 IF( info.NE.0 ) THEN
174 CALL xerbla(
'SSTEIN2', -info )
175 RETURN
176 END IF
177
178
179
180 IF( n.EQ.0 .OR. m.EQ.0 ) THEN
181 RETURN
182 ELSE IF( n.EQ.1 ) THEN
183 z( 1, 1 ) = one
184 RETURN
185 END IF
186
187
188
189 eps =
slamch( 'precision
' )
190
191
192
193 DO 40 I = 1, 4
194 ISEED( I ) = 1
195 40 CONTINUE
196
197
198
199 INDRV1 = 0
200 INDRV2 = INDRV1 + N
201 INDRV3 = INDRV2 + N
202 INDRV4 = INDRV3 + N
203 INDRV5 = INDRV4 + N
204
205
206
207 J1 = 1
208 DO 160 NBLK = 1, IBLOCK( M )
209
210
211
212.EQ. IF( NBLK1 ) THEN
213 B1 = 1
214 ELSE
215 B1 = ISPLIT( NBLK-1 ) + 1
216 END IF
217 BN = ISPLIT( NBLK )
218 BLKSIZ = BN - B1 + 1
219.EQ. IF( BLKSIZ1 )
220 $ GO TO 60
221 GPIND = J1
222
223
224
225 ONENRM = ABS( D( B1 ) ) + ABS( E( B1 ) )
226 ONENRM = MAX( ONENRM, ABS( D( BN ) )+ABS( E( BN-1 ) ) )
227 DO 50 I = B1 + 1, BN - 1
228 ONENRM = MAX( ONENRM, ABS( D( I ) )+ABS( E( I-1 ) )+
229 $ ABS( E( I ) ) )
230 50 CONTINUE
231 ORTOL = ORFAC*ONENRM
232
233 STPCRT = SQRT( ODM1 / BLKSIZ )
234
235
236
237 60 CONTINUE
238 JBLK = 0
239 DO 150 J = J1, M
240.NE. IF( IBLOCK( J )NBLK ) THEN
241 J1 = J
242 GO TO 160
243 END IF
244 JBLK = JBLK + 1
245 XJ = W( J )
246
247
248
249.EQ. IF( BLKSIZ1 ) THEN
250 WORK( INDRV1+1 ) = ONE
251 GO TO 120
252 END IF
253
254
255
256
257.GT. IF( JBLK1 ) THEN
258 EPS1 = ABS( EPS*XJ )
259 PERTOL = TEN*EPS1
260 SEP = XJ - XJM
261.LT. IF( SEPPERTOL )
262 $ XJ = XJM + PERTOL
263 END IF
264
265 ITS = 0
266 NRMCHK = 0
267
268
269
270 CALL SLARNV( 2, ISEED, BLKSIZ, WORK( INDRV1+1 ) )
271
272
273
274 CALL SCOPY( BLKSIZ, D( B1 ), 1, WORK( INDRV4+1 ), 1 )
275 CALL SCOPY( BLKSIZ-1, E( B1 ), 1, WORK( INDRV2+2 ), 1 )
276 CALL SCOPY( BLKSIZ-1, E( B1 ), 1, WORK( INDRV3+1 ), 1 )
277
278
279
280 TOL = ZERO
281 CALL SLAGTF( BLKSIZ, WORK( INDRV4+1 ), XJ, WORK( INDRV2+2 ),
282 $ WORK( INDRV3+1 ), TOL, WORK( INDRV5+1 ), IWORK,
283 $ IINFO )
284
285
286
287 70 CONTINUE
288 ITS = ITS + 1
289.GT. IF( ITSMAXITS )
290 $ GO TO 100
291
292
293
294 SCL = BLKSIZ*ONENRM*MAX( EPS,
295 $ ABS( WORK( INDRV4+BLKSIZ ) ) ) /
296 $ SASUM( BLKSIZ, WORK( INDRV1+1 ), 1 )
297 CALL SSCAL( BLKSIZ, SCL, WORK( INDRV1+1 ), 1 )
298
299
300
301 CALL SLAGTS( -1, BLKSIZ, WORK( INDRV4+1 ), WORK( INDRV2+2 ),
302 $ WORK( INDRV3+1 ), WORK( INDRV5+1 ), IWORK,
303 $ WORK( INDRV1+1 ), TOL, IINFO )
304
305
306
307
308.EQ. IF( JBLK1 )
309 $ GO TO 90
310.GT. IF( ABS( XJ-XJM )ORTOL )
311 $ GPIND = J
312
313.NE. IF( GPINDJ ) THEN
314 DO 80 I = GPIND, J - 1
315 ZTR = -SDOT( BLKSIZ, WORK( INDRV1+1 ), 1, Z( B1, I ),
316 $ 1 )
317 CALL SAXPY( BLKSIZ, ZTR, Z( B1, I ), 1,
318 $ WORK( INDRV1+1 ), 1 )
319 80 CONTINUE
320 END IF
321
322
323
324 90 CONTINUE
325 JMAX = ISAMAX( BLKSIZ, WORK( INDRV1+1 ), 1 )
326 NRM = ABS( WORK( INDRV1+JMAX ) )
327
328
329
330
331.LT. IF( NRMSTPCRT )
332 $ GO TO 70
333 NRMCHK = NRMCHK + 1
334.LT. IF( NRMCHKEXTRA+1 )
335 $ GO TO 70
336
337 GO TO 110
338
339
340
341
342 100 CONTINUE
343 INFO = INFO + 1
344 IFAIL( INFO ) = J
345
346
347
348 110 CONTINUE
349 SCL = ONE / SNRM2( BLKSIZ, WORK( INDRV1+1 ), 1 )
350 JMAX = ISAMAX( BLKSIZ, WORK( INDRV1+1 ), 1 )
351.LT. IF( WORK( INDRV1+JMAX )ZERO )
352 $ SCL = -SCL
353 CALL SSCAL( BLKSIZ, SCL, WORK( INDRV1+1 ), 1 )
354 120 CONTINUE
355 DO 130 I = 1, N
356 Z( I, J ) = ZERO
357 130 CONTINUE
358 DO 140 I = 1, BLKSIZ
359 Z( B1+I-1, J ) = WORK( INDRV1+I )
360 140 CONTINUE
361
362
363
364
365 XJM = XJ
366
367 150 CONTINUE
368 160 CONTINUE
369
370 RETURN
371
372
373
subroutine slarnv(idist, iseed, n, x)
SLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine slagts(job, n, a, b, c, d, in, y, tol, info)
SLAGTS solves the system of equations (T-λI)x = y or (T-λI)Tx = y,where T is a general tridiagonal ma...
subroutine slagtf(n, a, lambda, b, c, tol, d, in, info)
SLAGTF computes an LU factorization of a matrix T-λI, where T is a general tridiagonal matrix,...
subroutine xerbla(srname, info)
XERBLA
integer function isamax(n, sx, incx)
ISAMAX
subroutine sscal(n, sa, sx, incx)
SSCAL
real function sasum(n, sx, incx)
SASUM
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
real function sdot(n, sx, incx, sy, incy)
SDOT
subroutine saxpy(n, sa, sx, incx, sy, incy)
SAXPY
real(wp) function snrm2(n, x, incx)
SNRM2
real function slamch(cmach)
SLAMCH