2
3
4
5
6
7
8
9 CHARACTER COMPZ
10 INTEGER INFO, LDZ, N, NR
11
12
13 DOUBLE PRECISION D( * ), E( * ), WORK( * ), Z( LDZ, * )
14
15
16
17
18
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 DOUBLE PRECISION ZERO, ONE, TWO, THREE
84 parameter( zero = 0.0d0, one = 1.0d0, two = 2.0d0,
85 $ three = 3.0d0 )
86 INTEGER MAXIT
87 parameter( maxit = 30 )
88
89
90 INTEGER I, ICOMPZ, II, ISCALE, J, JTOT, K, L, L1, LEND,
91 $ LENDM1, LENDP1, LENDSV, LM1, LSV, M, MM, MM1,
92 $ NM1, NMAXIT
93 DOUBLE PRECISION ANORM, B, C, EPS, EPS2, F, G, P, R, RT1, RT2,
94 $ S, SAFMAX, SAFMIN, SSFMAX, SSFMIN, TST
95
96
97 LOGICAL LSAME
98 DOUBLE PRECISION DLAMCH, DLANST, DLAPY2
100
101
102 EXTERNAL dlae2, dlaev2, dlartg, dlascl, dlasr,
103 $ dlasrt, dswap, xerbla
104
105
106 INTRINSIC abs,
max, sign, sqrt
107
108
109
110
111
112 info = 0
113
114 IF(
lsame( compz,
'N' ) )
THEN
115 icompz = 0
116 ELSE IF(
lsame( compz,
'I' ) )
THEN
117 icompz = 1
118 ELSE
119 icompz = -1
120 END IF
121 IF( icompz.LT.0 ) THEN
122 info = -1
123 ELSE IF( n.LT.0 ) THEN
124 info = -2
125 ELSE IF( icompz.GT.0 .AND. ldz.LT.
max( 1, nr ) )
THEN
126 info = -6
127 END IF
128 IF( info.NE.0 ) THEN
129 CALL xerbla( 'DSTEQR2', -info )
130 RETURN
131 END IF
132
133
134
135 IF( n.EQ.0 )
136 $ RETURN
137
138 IF( n.EQ.1 ) THEN
139 IF( icompz.EQ.1 )
140 $ z( 1, 1 ) = one
141 RETURN
142 END IF
143
144
145
147 eps2 = eps**2
149 safmax = one / safmin
150 ssfmax = sqrt( safmax ) / three
151 ssfmin = sqrt( safmin ) / eps2
152
153
154
155
156 nmaxit = n*maxit
157 jtot = 0
158
159
160
161
162
163 l1 = 1
164 nm1 = n - 1
165
166 10 CONTINUE
167 IF( l1.GT.n )
168 $ GO TO 160
169 IF( l1.GT.1 )
170 $ e( l1-1 ) = zero
171 IF( l1.LE.nm1 ) THEN
172 DO 20 m = l1, nm1
173 tst = abs( e( m ) )
174 IF( tst.EQ.zero )
175 $ GO TO 30
176 IF( tst.LE.( sqrt( abs( d( m ) ) )*sqrt( abs( d( m+
177 $ 1 ) ) ) )*eps ) THEN
178 e( m ) = zero
179 GO TO 30
180 END IF
181 20 CONTINUE
182 END IF
183 m = n
184
185 30 CONTINUE
186 l = l1
187 lsv = l
188 lend = m
189 lendsv = lend
190 l1 = m + 1
191 IF( lend.EQ.l )
192 $ GO TO 10
193
194
195
196 anorm = dlanst( 'I', lend-l+1, d( l ), e( l ) )
197 iscale = 0
198 IF( anorm.EQ.zero )
199 $ GO TO 10
200 IF( anorm.GT.ssfmax ) THEN
201 iscale = 1
202 CALL dlascl( 'G', 0, 0, anorm, ssfmax, lend-l+1, 1, d( l ), n,
203 $ info )
204 CALL dlascl( 'G', 0, 0, anorm, ssfmax, lend-l, 1, e( l ), n,
205 $ info )
206 ELSE IF( anorm.LT.ssfmin ) THEN
207 iscale = 2
208 CALL dlascl( 'G', 0, 0, anorm, ssfmin, lend-l+1, 1, d( l ), n,
209 $ info )
210 CALL dlascl( 'G', 0, 0, anorm, ssfmin, lend-l, 1, e( l ), n,
211 $ info )
212 END IF
213
214
215
216 IF( abs( d( lend ) ).LT.abs( d( l ) ) ) THEN
217 lend = lsv
218 l = lendsv
219 END IF
220
221 IF( lend.GT.l ) THEN
222
223
224
225
226
227 40 CONTINUE
228 IF( l.NE.lend ) THEN
229 lendm1 = lend - 1
230 DO 50 m = l, lendm1
231 tst = abs( e( m ) )**2
232 IF( tst.LE.( eps2*abs( d( m ) ) )*abs( d( m+1 ) )+
233 $ safmin )GO TO 60
234 50 CONTINUE
235 END IF
236
237 m = lend
238
239 60 CONTINUE
240 IF( m.LT.lend )
241 $ e( m ) = zero
242 p = d( l )
243 IF( m.EQ.l )
244 $ GO TO 80
245
246
247
248
249 IF( m.EQ.l+1 ) THEN
250 IF( icompz.GT.0 ) THEN
251 CALL dlaev2( d( l ), e( l ), d( l+1 ), rt1, rt2, c, s )
252 work( l ) = c
253 work( n-1+l ) = s
254 CALL dlasr( 'R', 'V', 'B', nr, 2, work( l ),
255 $ work( n-1+l ), z( 1, l ), ldz )
256 ELSE
257 CALL dlae2( d( l ), e( l ), d( l+1 ), rt1, rt2 )
258 END IF
259 d( l ) = rt1
260 d( l+1 ) = rt2
261 e( l ) = zero
262 l = l + 2
263 IF( l.LE.lend )
264 $ GO TO 40
265 GO TO 140
266 END IF
267
268 IF( jtot.EQ.nmaxit )
269 $ GO TO 140
270 jtot = jtot + 1
271
272
273
274 g = ( d( l+1 )-p ) / ( two*e( l ) )
275 r = dlapy2( g, one )
276 g = d( m ) - p + ( e( l ) / ( g+sign( r, g ) ) )
277
278 s = one
279 c = one
280 p = zero
281
282
283
284 mm1 = m - 1
285 DO 70 i = mm1, l, -1
286 f = s*e( i )
287 b = c*e( i )
288 CALL dlartg( g, f, c, s, r )
289 IF( i.NE.m-1 )
290 $ e( i+1 ) = r
291 g = d( i+1 ) - p
292 r = ( d( i )-g )*s + two*c*b
293 p = s*r
294 d( i+1 ) = g + p
295 g = c*r - b
296
297
298
299 IF( icompz.GT.0 ) THEN
300 work( i ) = c
301 work( n-1+i ) = -s
302 END IF
303
304 70 CONTINUE
305
306
307
308 IF( icompz.GT.0 ) THEN
309 mm = m - l + 1
310 CALL dlasr( 'R', 'V', 'B', nr, mm, work( l ), work( n-1+l ),
311 $ z( 1, l ), ldz )
312 END IF
313
314 d( l ) = d( l ) - p
315 e( l ) = g
316 GO TO 40
317
318
319
320 80 CONTINUE
321 d( l ) = p
322
323 l = l + 1
324 IF( l.LE.lend )
325 $ GO TO 40
326 GO TO 140
327
328 ELSE
329
330
331
332
333
334 90 CONTINUE
335 IF( l.NE.lend ) THEN
336 lendp1 = lend + 1
337 DO 100 m = l, lendp1, -1
338 tst = abs( e( m-1 ) )**2
339 IF( tst.LE.( eps2*abs( d( m ) ) )*abs( d( m-1 ) )+
340 $ safmin )GO TO 110
341 100 CONTINUE
342 END IF
343
344 m = lend
345
346 110 CONTINUE
347 IF( m.GT.lend )
348 $ e( m-1 ) = zero
349 p = d( l )
350 IF( m.EQ.l )
351 $ GO TO 130
352
353
354
355
356 IF( m.EQ.l-1 ) THEN
357 IF( icompz.GT.0 ) THEN
358 CALL dlaev2( d( l-1 ), e( l-1 ), d( l ), rt1, rt2, c, s )
359 work( m ) = c
360 work( n-1+m ) = s
361 CALL dlasr( 'R', 'V', 'F', nr, 2, work( m ),
362 $ work( n-1+m ), z( 1, l-1 ), ldz )
363 ELSE
364 CALL dlae2( d( l-1 ), e( l-1 ), d( l ), rt1, rt2 )
365 END IF
366 d( l-1 ) = rt1
367 d( l ) = rt2
368 e( l-1 ) = zero
369 l = l - 2
370 IF( l.GE.lend )
371 $ GO TO 90
372 GO TO 140
373 END IF
374
375 IF( jtot.EQ.nmaxit )
376 $ GO TO 140
377 jtot = jtot + 1
378
379
380
381 g = ( d( l-1 )-p ) / ( two*e( l-1 ) )
382 r = dlapy2( g, one )
383 g = d( m ) - p + ( e( l-1 ) / ( g+sign( r, g ) ) )
384
385 s = one
386 c = one
387 p = zero
388
389
390
391 lm1 = l - 1
392 DO 120 i = m, lm1
393 f = s*e( i )
394 b = c*e( i )
395 CALL dlartg( g, f, c, s, r )
396 IF( i.NE.m )
397 $ e( i-1 ) = r
398 g = d( i ) - p
399 r = ( d( i+1 )-g )*s + two*c*b
400 p = s*r
401 d( i ) = g + p
402 g = c*r - b
403
404
405
406 IF( icompz.GT.0 ) THEN
407 work( i ) = c
408 work( n-1+i ) = s
409 END IF
410
411 120 CONTINUE
412
413
414
415 IF( icompz.GT.0 ) THEN
416 mm = l - m + 1
417 CALL dlasr( 'R', 'V', 'F', nr, mm, work( m ), work( n-1+m ),
418 $ z( 1, m ), ldz )
419 END IF
420
421 d( l ) = d( l ) - p
422 e( lm1 ) = g
423 GO TO 90
424
425
426
427 130 CONTINUE
428 d( l ) = p
429
430 l = l - 1
431 IF( l.GE.lend )
432 $ GO TO 90
433 GO TO 140
434
435 END IF
436
437
438
439 140 CONTINUE
440 IF( iscale.EQ.1 ) THEN
441 CALL dlascl( 'G', 0, 0, ssfmax, anorm, lendsv-lsv+1, 1,
442 $ d( lsv ), n, info )
443 CALL dlascl( 'G', 0, 0, ssfmax, anorm, lendsv-lsv, 1, e( lsv ),
444 $ n, info )
445 ELSE IF( iscale.EQ.2 ) THEN
446 CALL dlascl( 'G', 0, 0, ssfmin, anorm, lendsv-lsv+1, 1,
447 $ d( lsv ), n, info )
448 CALL dlascl( 'G', 0, 0, ssfmin, anorm, lendsv-lsv, 1, e( lsv ),
449 $ n, info )
450 END IF
451
452
453
454
455 IF( jtot.LT.nmaxit )
456 $ GO TO 10
457 DO 150 i = 1, n - 1
458 IF( e( i ).NE.zero )
459 $ info = info + 1
460 150 CONTINUE
461 GO TO 190
462
463
464
465 160 CONTINUE
466 IF( icompz.EQ.0 ) THEN
467
468
469
470 CALL dlasrt( 'I', n, d, info )
471
472 ELSE
473
474
475
476 DO 180 ii = 2, n
477 i = ii - 1
478 k = i
479 p = d( i )
480 DO 170 j = ii, n
481 IF( d( j ).LT.p ) THEN
482 k = j
483 p = d( j )
484 END IF
485 170 CONTINUE
486 IF( k.NE.i ) THEN
487 d( k ) = d( i )
488 d( i ) = p
489 CALL dswap( nr, z( 1, i ), 1, z( 1, k ), 1 )
490 END IF
491 180 CONTINUE
492 END IF
493
494 190 CONTINUE
495 RETURN
496
497
498