277 SUBROUTINE slaqr2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
278 $ ihiz, z, ldz, ns, nd, sr, si, v, ldv, nh, t,
279 $ ldt, nv, wv, ldwv, work, lwork )
287 INTEGER ihiz, iloz, kbot, ktop, ldh, ldt, ldv, ldwv,
288 $ ldz, lwork, n, nd, nh, ns, nv, nw
292 REAL h( ldh, * ), si( * ), sr( * ), t( ldt, * ),
293 $ v( ldv, * ), work( * ), wv( ldwv, * ),
300 parameter( zero = 0.0e0, one = 1.0e0 )
303 REAL aa, bb, beta, cc, cs, dd, evi, evk, foo, s,
304 $ safmax, safmin, smlnum, sn, tau, ulp
305 INTEGER i, ifst, ilst, info, infqr, j, jw, k, kcol,
306 $ kend, kln, krow, kwtop, ltop, lwk1, lwk2,
308 LOGICAL bulge, sorted
319 INTRINSIC abs, int, max, min,
REAL, sqrt
325 jw = min( nw, kbot-ktop+1 )
332 CALL
sgehrd( jw, 1, jw-1, t, ldt, work, work, -1, info )
333 lwk1 = int( work( 1 ) )
337 CALL
sormhr(
'R',
'N', jw, jw, 1, jw-1, t, ldt, work, v, ldv,
339 lwk2 = int( work( 1 ) )
343 lwkopt = jw + max( lwk1, lwk2 )
348 IF( lwork.EQ.-1 )
THEN
349 work( 1 ) =
REAL( lwkopt )
366 safmin =
slamch(
'SAFE MINIMUM' )
367 safmax = one / safmin
368 CALL
slabad( safmin, safmax )
369 ulp =
slamch(
'PRECISION' )
370 smlnum = safmin*(
REAL( N ) / ulp )
374 jw = min( nw, kbot-ktop+1 )
375 kwtop = kbot - jw + 1
376 IF( kwtop.EQ.ktop )
THEN
379 s = h( kwtop, kwtop-1 )
382 IF( kbot.EQ.kwtop )
THEN
386 sr( kwtop ) = h( kwtop, kwtop )
390 IF( abs( s ).LE.max( smlnum, ulp*abs( h( kwtop, kwtop ) ) ) )
395 $ h( kwtop, kwtop-1 ) = zero
407 CALL
slacpy(
'U', jw, jw, h( kwtop, kwtop ), ldh, t, ldt )
408 CALL
scopy( jw-1, h( kwtop+1, kwtop ), ldh+1, t( 2, 1 ), ldt+1 )
410 CALL
slaset(
'A', jw, jw, zero, one, v, ldv )
411 CALL
slahqr( .true., .true., jw, 1, jw, t, ldt, sr( kwtop ),
412 $ si( kwtop ), 1, jw, v, ldv, infqr )
421 $ t( jw, jw-2 ) = zero
428 IF( ilst.LE.ns )
THEN
432 bulge = t( ns, ns-1 ).NE.zero
437 IF( .NOT.bulge )
THEN
441 foo = abs( t( ns, ns ) )
444 IF( abs( s*v( 1, ns ) ).LE.max( smlnum, ulp*foo ) )
THEN
455 CALL
strexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, work,
463 foo = abs( t( ns, ns ) ) + sqrt( abs( t( ns, ns-1 ) ) )*
464 $ sqrt( abs( t( ns-1, ns ) ) )
467 IF( max( abs( s*v( 1, ns ) ), abs( s*v( 1, ns-1 ) ) ).LE.
468 $ max( smlnum, ulp*foo ) )
THEN
480 CALL
strexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, work,
513 ELSE IF( t( i+1, i ).EQ.zero )
THEN
521 evi = abs( t( i, i ) )
523 evi = abs( t( i, i ) ) + sqrt( abs( t( i+1, i ) ) )*
524 $ sqrt( abs( t( i, i+1 ) ) )
528 evk = abs( t( k, k ) )
529 ELSE IF( t( k+1, k ).EQ.zero )
THEN
530 evk = abs( t( k, k ) )
532 evk = abs( t( k, k ) ) + sqrt( abs( t( k+1, k ) ) )*
533 $ sqrt( abs( t( k, k+1 ) ) )
536 IF( evi.GE.evk )
THEN
542 CALL
strexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, work,
552 ELSE IF( t( i+1, i ).EQ.zero )
THEN
567 IF( i.GE.infqr+1 )
THEN
568 IF( i.EQ.infqr+1 )
THEN
569 sr( kwtop+i-1 ) = t( i, i )
570 si( kwtop+i-1 ) = zero
572 ELSE IF( t( i, i-1 ).EQ.zero )
THEN
573 sr( kwtop+i-1 ) = t( i, i )
574 si( kwtop+i-1 ) = zero
581 CALL
slanv2( aa, bb, cc, dd, sr( kwtop+i-2 ),
582 $ si( kwtop+i-2 ), sr( kwtop+i-1 ),
583 $ si( kwtop+i-1 ), cs, sn )
589 IF( ns.LT.jw .OR. s.EQ.zero )
THEN
590 IF( ns.GT.1 .AND. s.NE.zero )
THEN
594 CALL
scopy( ns, v, ldv, work, 1 )
596 CALL
slarfg( ns, beta, work( 2 ), 1, tau )
599 CALL
slaset(
'L', jw-2, jw-2, zero, zero, t( 3, 1 ), ldt )
601 CALL
slarf(
'L', ns, jw, work, 1, tau, t, ldt,
603 CALL
slarf(
'R', ns, ns, work, 1, tau, t, ldt,
605 CALL
slarf(
'R', jw, ns, work, 1, tau, v, ldv,
608 CALL
sgehrd( jw, 1, ns, t, ldt, work, work( jw+1 ),
615 $ h( kwtop, kwtop-1 ) = s*v( 1, 1 )
616 CALL
slacpy(
'U', jw, jw, t, ldt, h( kwtop, kwtop ), ldh )
617 CALL
scopy( jw-1, t( 2, 1 ), ldt+1, h( kwtop+1, kwtop ),
623 IF( ns.GT.1 .AND. s.NE.zero )
624 $ CALL
sormhr(
'R',
'N', jw, ns, 1, ns, t, ldt, work, v, ldv,
625 $ work( jw+1 ), lwork-jw, info )
634 DO 70 krow = ltop, kwtop - 1, nv
635 kln = min( nv, kwtop-krow )
636 CALL
sgemm(
'N',
'N', kln, jw, jw, one, h( krow, kwtop ),
637 $ ldh, v, ldv, zero, wv, ldwv )
638 CALL
slacpy(
'A', kln, jw, wv, ldwv, h( krow, kwtop ), ldh )
644 DO 80 kcol = kbot + 1, n, nh
645 kln = min( nh, n-kcol+1 )
646 CALL
sgemm(
'C',
'N', jw, kln, jw, one, v, ldv,
647 $ h( kwtop, kcol ), ldh, zero, t, ldt )
648 CALL
slacpy(
'A', jw, kln, t, ldt, h( kwtop, kcol ),
656 DO 90 krow = iloz, ihiz, nv
657 kln = min( nv, ihiz-krow+1 )
658 CALL
sgemm(
'N',
'N', kln, jw, jw, one, z( krow, kwtop ),
659 $ ldz, v, ldv, zero, wv, ldwv )
660 CALL
slacpy(
'A', kln, jw, wv, ldwv, z( krow, kwtop ),
680 work( 1 ) =
REAL( lwkopt )