2
3
4
5
6
7
8
9 CHARACTER COMPZ
10 INTEGER INFO, LDZ, N, NR
11
12
13 DOUBLE PRECISION D( * ), E( * ), WORK( * )
14 COMPLEX*16 Z( LDZ, * )
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
84
85 DOUBLE PRECISION ZERO, ONE, TWO, THREE, HALF
86 parameter( zero = 0.0d0, one = 1.0d0, two = 2.0d0,
87 $ three = 3.0d0, half = 0.5d0 )
88 COMPLEX*16 CONE
89 parameter( cone = ( 1.0d0, 1.0d0 ) )
90 INTEGER MAXIT, NMAXLOOK
91 parameter( maxit = 30, nmaxlook = 15 )
92
93
94 INTEGER , ICOMPZ, II, ILAST, ISCALE, J, JTOT, K, L,
95 $ L1, LEND, , LENDP1, LENDSV, LM1, LSV, M,
96 $ MM, MM1, NLOOK, NM1, NMAXIT
97 DOUBLE PRECISION ANORM, B, C, EPS, EPS2, F, G, GP, OLDEL, OLDGP,
98 $ OLDRP, P, R, RP, RT1, RT2, S, SAFMAX, SAFMIN,
99 $ SSFMAX, SSFMIN, TST, TST1
100
101
102 LOGICAL LSAME
103 DOUBLE PRECISION DLAMCH, DLANST, DLAPY2
105
106
109
110
111 INTRINSIC abs,
max, sign, sqrt
112
113
114
115
116
117 ilast = 0
118 info = 0
119
120 IF(
lsame( compz,
'N' ) )
THEN
121 icompz = 0
122 ELSEIF(
lsame( compz,
'I' ) )
THEN
123 icompz = 1
124 ELSE
125 icompz = -1
126 ENDIF
127 IF( icompz.LT.0 ) THEN
128 info = -1
129 ELSEIF( n.LT.0 ) THEN
130 info = -2
131 ELSEIF( icompz.GT.0 .AND. ldz.LT.
max( 1, nr ) )
THEN
132 info = -6
133 ENDIF
134 IF( info.NE.0 ) THEN
135 CALL xerbla(
'ZSTEQR2', -info )
136 RETURN
137 ENDIF
138
139
140
141 IF( n.EQ.0 )
142 $ RETURN
143
144
145
146 IF( icompz.EQ.0 ) THEN
147 CALL dsterf( n, d, e, info )
148 RETURN
149 ENDIF
150
151 IF( n.EQ.1 ) THEN
152 z( 1, 1 ) = cone
153 RETURN
154 ENDIF
155
156
157
159 eps2 = eps**2
161 SAFMAX = ONE / SAFMIN
162 SSFMAX = SQRT( SAFMAX ) / THREE
163 SSFMIN = SQRT( SAFMIN ) / EPS2
164
165
166
167
168 NMAXIT = N*MAXIT
169 JTOT = 0
170
171
172
173
174
175 L1 = 1
176 NM1 = N - 1
177
178 10 CONTINUE
179.GT. IF( L1N )
180 $ GOTO 220
181.GT. IF( L11 )
182 $ E( L1-1 ) = ZERO
183.LE. IF( L1NM1 ) THEN
184 DO 20 M = L1, NM1
185 TST = ABS( E( M ) )
186.EQ. IF( TSTZERO )
187 $ GOTO 30
188.LE. IF( TST( SQRT( ABS( D( M ) ) )*SQRT( ABS( D( M+
189 $ 1 ) ) ) )*EPS ) THEN
190 E( M ) = ZERO
191 GOTO 30
192 ENDIF
193 20 CONTINUE
194 ENDIF
195 M = N
196
197 30 CONTINUE
198 L = L1
199 LSV = L
200 LEND = M
201 LENDSV = LEND
202 L1 = M + 1
203.EQ. IF( LENDL )
204 $ GOTO 10
205
206
207
208 ANORM = DLANST( 'i', LEND-L+1, D( L ), E( L ) )
209 ISCALE = 0
210.EQ. IF( ANORMZERO )
211 $ GOTO 10
212.GT. IF( ANORMSSFMAX ) THEN
213 ISCALE = 1
214 CALL DLASCL( 'g', 0, 0, ANORM, SSFMAX, LEND-L+1, 1, D( L ), N,
215 $ INFO )
216 CALL DLASCL( 'g', 0, 0, ANORM, SSFMAX, LEND-L, 1, E( L ), N,
217 $ INFO )
218.LT. ELSEIF( ANORMSSFMIN ) THEN
219 ISCALE = 2
220 CALL DLASCL( 'g', 0, 0, ANORM, SSFMIN, LEND-L+1, 1, D( L ), N,
221 $ INFO )
222 CALL DLASCL( 'g', 0, 0, ANORM, SSFMIN, LEND-L, 1, E( L ), N,
223 $ INFO )
224 ENDIF
225
226
227
228.LT. IF( ABS( D( LEND ) )ABS( D( L ) ) ) THEN
229 LEND = LSV
230 L = LENDSV
231 ENDIF
232
233.GT. IF( LENDL ) THEN
234
235
236
237
238
239 40 CONTINUE
240.NE. IF( LLEND ) THEN
241 LENDM1 = LEND - 1
242 DO 50 M = L, LENDM1
243 TST = ABS( E( M ) )**2
244.LE. IF( TST( EPS2*ABS( D( M ) ) )*ABS( D( M+1 ) )+
245 $ SAFMIN )GOTO 60
246 50 CONTINUE
247 ENDIF
248
249 M = LEND
250
251 60 CONTINUE
252.LT. IF( MLEND )
253 $ E( M ) = ZERO
254 P = D( L )
255.EQ. IF( ML )
256 $ GOTO 110
257
258
259
260
261.EQ. IF( ML+1 ) THEN
262 CALL DLAEV2( D( L ), E( L ), D( L+1 ), RT1, RT2, C, S )
263 WORK( L ) = C
264 WORK( N-1+L ) = S
265 CALL ZLASR( 'r', 'v', 'b', nr, 2, work( l ), work( n-1+l ),
266 $ z( 1, l ), ldz )
267 d( l ) = rt1
268 d( l+1 ) = rt2
269 e( l ) = zero
270 l = l + 2
271 IF( l.LE.lend )
272 $ GOTO 40
273 GOTO 200
274 ENDIF
275
276 IF( jtot.EQ.nmaxit )
277 $ GOTO 200
278 jtot = jtot + 1
279
280
281
282 g = ( d( l+1 )-p ) / ( two*e( l ) )
284 g = d( m ) - p + ( e( l ) / ( g+sign( r, g ) ) )
285
286 IF( icompz.EQ.0 ) THEN
287
288 GOTO 90
289 ENDIF
290
291 oldel = abs( e( l ) )
292 gp = g
293 rp = r
294 tst = abs( e( l ) )**2
295 tst = tst / ( ( eps2*abs( d( l ) ) )*abs( d( l+1 ) )+safmin )
296
297 nlook = 1
298 IF( ( tst.GT.one ) .AND. ( nlook.LE.nmaxlook ) ) THEN
299 70 CONTINUE
300
301
302
303
304 s = one
305 c = one
306 p = zero
307 mm1 = m - 1
308 DO 80 i = mm1, l, -1
309 f = s*e( i )
310 b = c*e( i )
311 CALL dlartg( gp, f, c, s, rp )
312 gp = d( i+1 ) - p
313 rp = ( d( i )-gp )*s + two*c*b
314 p = s*rp
315 IF( i.NE.l )
316 $ gp = c*rp - b
317 80 CONTINUE
318 oldgp = gp
319 oldrp = rp
320
321 IF( abs( c*oldrp-b ).GT.safmin ) THEN
322 gp = ( ( oldgp+p )-( d( l )-p ) ) / ( two*( c*oldrp-b ) )
323 ELSE
324
325
326
327 GOTO 90
328
329
330 ENDIF
332 gp = d( m ) - ( d( l )-p ) +
333 $ ( ( c*oldrp-b ) / ( gp+sign( rp, gp ) ) )
334 tst1 = tst
335 tst = abs( c*oldrp-b )**2
336 tst = tst / ( ( eps2*abs( d( l )-p ) )*abs( oldgp+p )+
337 $ safmin )
338
339 IF( abs( c*oldrp-b ).GT.0.9d0*oldel ) THEN
340 IF( abs( c*oldrp-b ).GT.oldel ) THEN
341 gp = g
342 rp = r
343 ENDIF
344 tst = half
345 ELSE
346 oldel = abs( c*oldrp-b )
347 ENDIF
348 nlook = nlook + 1
349 IF( ( tst.GT.one ) .AND. ( nlook.LE.nmaxlook ) )
350 $ GOTO 70
351 ENDIF
352
353 IF( ( tst.LE.one ) .AND. ( tst.NE.half ) .AND.
354 $ ( abs( p ).LT.eps*abs( d( l ) ) ) .AND.
355 $ ( ilast.EQ.l ) .AND. ( abs( e( l ) )**2.LE.10000.0d0*
356 $ ( ( eps2*abs( d( l ) ) )*abs( d( l+1 ) )+safmin ) ) ) THEN
357
358
359
360 m = l
361 e( m ) = zero
362 p = d( l )
363 jtot = jtot - 1
364 GOTO 110
365 ENDIF
366 g = gp
367 r = rp
368
369
370
371 90 CONTINUE
372
373 s = one
374 c = one
375 p = zero
376
377
378
379 mm1 = m - 1
380 DO 100 i = mm1, l, -1
381 f = s*e( i )
382 b = c*e( i )
383 CALL dlartg( g, f, c, s, r )
384 IF( i.NE.m-1 )
385 $ e( i+1 ) = r
386 g = d( i+1 ) - p
387 r = ( d( i )-g )*s + two*c*b
388 p = s*r
389 d( i+1 ) = g + p
390 g = c*r - b
391
392
393
394 work( i ) = c
395 work( n-1+i ) = -s
396
397 100 CONTINUE
398
399
400
401 mm = m - l + 1
402 CALL zlasr(
'R',
'V',
'B', nr, mm, work( l ), work( n-1+l ),
403 $ z( 1, l ), ldz )
404
405 d( l ) = d( l ) - p
406 e( l ) = g
407 ilast = l
408 GOTO 40
409
410
411
412 110 CONTINUE
413 d( l ) = p
414
415 l = l + 1
416 IF( l.LE.lend )
417 $ GOTO 40
418 GOTO 200
419
420 ELSE
421
422
423
424
425
426 120 CONTINUE
427 IF( l.NE.lend ) THEN
428 lendp1 = lend + 1
429 DO 130 m = l, lendp1, -1
430 tst = abs( e( m-1 ) )**2
431 IF( tst.LE.( eps2*abs( d( m ) ) )*abs( d( m-1 ) )+
432 $ safmin )GOTO 140
433 130 CONTINUE
434 ENDIF
435
436 m = lend
437
438 140 CONTINUE
439 IF( m.GT.lend )
440 $ e( m-1 ) = zero
441 p = d( l )
442 IF( m.EQ.l )
443 $ GOTO 190
444
445
446
447
448 IF( m.EQ.l-1 ) THEN
449 CALL dlaev2( d( l-1 ), e( l-1 ), d( l ), rt1, rt2, c, s )
450 work( m ) = c
451 work( n-1+m ) = s
452 CALL zlasr(
'R',
'V',
'F', nr, 2, work( m ), work( n-1+m ),
453 $ z( 1, l-1 ), ldz )
454 d( l-1 ) = rt1
455 d( l ) = rt2
456 e( l-1 ) = zero
457 l = l - 2
458 IF( l.GE.lend )
459 $ GOTO 120
460 GOTO 200
461 ENDIF
462
463 IF( jtot.EQ.nmaxit )
464 $ GOTO 200
465 jtot = jtot + 1
466
467
468
469 g = ( d( l-1 )-p ) / ( two*e( l-1 ) )
471 g = d( m ) - p + ( e( l-1 ) / ( g+sign( r, g ) ) )
472
473 IF( icompz.EQ.0 ) THEN
474
475 GOTO 170
476 ENDIF
477
478 oldel = abs( e( l-1 ) )
479 gp = g
480 rp = r
481 tst = abs( e( l-1 ) )**2
482 tst = tst / ( ( eps2*abs( d( l ) ) )*abs( d( l-1 ) )+safmin )
483 nlook = 1
484 IF( ( tst.GT.one ) .AND. ( nlook.LE.nmaxlook ) ) THEN
485 150 CONTINUE
486
487
488
489
490 s = one
491 c = one
492 p = zero
493
494
495
496 lm1 = l - 1
497 DO 160 i = m, lm1
498 f = s*e( i )
499 b = c*e( i )
500 CALL dlartg( gp, f, c, s, rp )
501 gp = d( i ) - p
502 rp = ( d( i+1 )-gp )*s + two*c*b
503 p = s*rp
504 IF( i.LT.lm1 )
505 $ gp = c*rp - b
506 160 CONTINUE
507 oldgp = gp
508 oldrp = rp
509
510 IF( abs( c*oldrp-b ).GT.safmin ) THEN
511 gp = ( ( oldgp+p )-( d
512 ELSE
513
514
515
516 GOTO 170
517
518
519 ENDIF
521 gp = d( m ) - ( d( l )-p ) +
522 $ ( ( c*oldrp-b ) / ( gp+sign( rp, gp ) ) )
523 tst1 = tst
524 tst = abs( ( c*oldrp-b ) )**2
525 tst = tst / ( ( eps2*abs( d( l )-p ) )*abs( oldgp+p )+
526 $ safmin )
527
528 IF( abs( c*oldrp-b ).GT.0.9d0*oldel ) THEN
529 IF( abs( c*oldrp-b ).GT.oldel ) THEN
530 gp = g
531 rp = r
532 ENDIF
533 tst = half
534 ELSE
535 oldel = abs( c*oldrp-b )
536 ENDIF
537 nlook = nlook + 1
538 IF( ( tst.GT.one ) .AND. ( nlook.LE.nmaxlook ) )
539 $ GOTO 150
540 ENDIF
541 IF( ( tst.LE.one ) .AND. ( tst.NE.half ) .AND.
542 $ ( abs( p ).LT.eps*abs( d( l ) ) ) .AND.
543 $ ( ilast.EQ.l ) .AND. ( abs( e( l-1 ) )**2.LE.10000.0d0*
544 $ ( ( eps2*abs( d( l-1 ) ) )*abs( d( l ) )+safmin ) ) ) THEN
545
546
547
548 m = l
549 e( m-1 ) = zero
550 p = d( l )
551 jtot = jtot - 1
552 GOTO 190
553 ENDIF
554
555 g = gp
556 r = rp
557
558
559
560 170 CONTINUE
561
562 s = one
563 c = one
564 p = zero
565 DO 180 i = m, lm1
566 f = s*e( i )
567 b = c*e( i )
568 CALL dlartg( g, f, c, s, r )
569 IF( i.NE.m )
570 $ e( i-1 ) = r
571 g = d( i ) - p
572 r = ( d( i+1 )-g )*s + two*c*b
573 p = s*r
574 d( i ) = g + p
575 g = c*r - b
576
577
578
579 work( i ) = c
580 work( n-1+i ) = s
581
582 180 CONTINUE
583
584
585
586 mm = l - m + 1
587 CALL zlasr(
'R',
'V',
'F', nr, mm, work( m ), work( n-1+m ),
588 $ z( 1, m ), ldz )
589
590 d( l ) = d( l ) - p
591 e( lm1 ) = g
592 ilast = l
593 GOTO 120
594
595
596
597 190 CONTINUE
598 d( l ) = p
599
600 l = l - 1
601 IF( l.GE.lend )
602 $ GOTO 120
603 GOTO 200
604
605 ENDIF
606
607
608
609 200 CONTINUE
610 IF( iscale.EQ.1 ) THEN
611 CALL dlascl(
'G', 0, 0, ssfmax, anorm, lendsv-lsv+1, 1,
612 $ d( lsv ), n, info )
613 CALL dlascl(
'G', 0, 0, ssfmax, anorm, lendsv-lsv, 1, e( lsv ),
614 $ n, info )
615 ELSEIF( iscale.EQ.2 ) THEN
616 CALL dlascl(
'G', 0, 0, ssfmin, anorm, lendsv-lsv+1, 1,
617 $ d( lsv ), n, info )
618 CALL dlascl(
'G', 0, 0, ssfmin, anorm, lendsv-lsv, 1, e( lsv ),
619 $ n, info )
620 ENDIF
621
622
623
624
625 IF( jtot.LT.nmaxit )
626 $ GOTO 10
627 DO 210 i = 1, n - 1
628 IF( e( i ).NE.zero )
629 $ info = info + 1
630 210 CONTINUE
631 GOTO 250
632
633
634
635 220 CONTINUE
636
637
638
639 DO 240 ii = 2, n
640 i = ii - 1
641 k = i
642 p = d( i )
643 DO 230 j = ii, n
644 IF( d( j ).LT.p ) THEN
645 k = j
646 p = d( j )
647 ENDIF
648 230 CONTINUE
649 IF( k.NE.i ) THEN
650 d( k ) = d( i )
651 d( i ) = p
652 CALL zswap( nr, z( 1, i ), 1, z( 1, k ), 1 )
653 ENDIF
654 240 CONTINUE
655
656 250 CONTINUE
657
658 RETURN
659
660
661
subroutine dlartg(f, g, c, s, r)
DLARTG generates a plane rotation with real cosine and real sine.
double precision function dlanst(norm, n, d, e)
DLANST returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
double precision function dlapy2(x, y)
DLAPY2 returns sqrt(x2+y2).
subroutine dlaev2(a, b, c, rt1, rt2, cs1, sn1)
DLAEV2 computes the eigenvalues and eigenvectors of a 2-by-2 symmetric/Hermitian matrix.
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine dsterf(n, d, e, info)
DSTERF
subroutine xerbla(srname, info)
XERBLA
logical function lsame(ca, cb)
LSAME
subroutine zlasr(side, pivot, direct, m, n, c, s, a, lda)
ZLASR applies a sequence of plane rotations to a general rectangular matrix.
subroutine zswap(n, zx, incx, zy, incy)
ZSWAP
double precision function dlamch(cmach)
DLAMCH