272 SUBROUTINE slaqr3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
273 $ IHIZ, Z, LDZ, NS, ND, SR, SI, V, LDV, NH, T,
274 $ LDT, NV, WV, LDWV, WORK, LWORK )
281 INTEGER IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
282 $ LDZ, LWORK, N, ND, NH, NS, NV, NW
286 REAL H( LDH, * ), SI( * ), SR( * ), T( LDT, * ),
287 $ V( LDV, * ), WORK( * ), WV( LDWV, * ),
294 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
297 REAL AA, BB, BETA, CC, CS, DD, EVI, , FOO, S,
298 $ SAFMAX, SAFMIN, SMLNUM, SN, TAU, ULP
299 INTEGER I, IFST, ILST, INFO, INFQR, J, JW, K, KCOL,
300 $ KEND, KLN, KROW, KWTOP, LTOP, LWK1, LWK2, LWK3,
302 LOGICAL BULGE, SORTED
321 jw =
min( nw, kbot-ktop+1 )
328 CALL sgehrd( jw, 1, jw-1, t, ldt, work, work, -1, info )
329 lwk1 = int( work( 1 ) )
333 CALL sormhr(
'R',
'N', jw, jw, 1, jw-1, t, ldt, work, v, ldv,
335 lwk2 = int( work( 1 ) )
339 CALL slaqr4( .true., .true., jw, 1, jw, t, ldt, sr, si, 1, jw,
340 $ v, ldv, work, -1, infqr )
341 lwk3 = int( work( 1 ) )
345 lwkopt =
max( jw+
max( lwk1, lwk2 ), lwk3 )
350 IF( lwork.EQ.-1 )
THEN
351 work( 1 ) = real( lwkopt )
368 safmin = slamch(
'SAFE MINIMUM' )
369 safmax = one / safmin
370 CALL slabad( safmin, safmax )
371 ulp = slamch(
'PRECISION' )
372 smlnum = safmin*( real( n ) / ulp )
376 jw =
min( nw, kbot-ktop+1 )
377 kwtop = kbot - jw + 1
378 IF( kwtop.EQ.ktop )
THEN
381 s = h( kwtop, kwtop-1 )
384 IF( kbot.EQ.kwtop )
THEN
388 sr( kwtop ) = h( kwtop, kwtop )
392 IF( abs( s ).LE.
max( smlnum, ulp*abs( h( kwtop, kwtop ) ) ) )
397 $ h( kwtop, kwtop-1 ) = zero
409 CALL slacpy(
'U', jw, jw, h( kwtop, kwtop ), ldh, t, ldt )
410 CALL scopy( jw-1, h( kwtop+1, kwtop ), ldh+1, t( 2, 1 ), ldt+1 )
412 CALL slaset(
'A', jw, jw, zero, one, v, ldv )
413 nmin =
ilaenv( 12,
'SLAQR3',
'SV'
414 IF( jw.GT.nmin )
THEN
416 $ si( kwtop ), 1, jw, v, ldv, work, lwork, infqr )
418 CALL slahqr( .true., .true., jw, 1, jw, t, ldt, sr( kwtop ),
419 $ si( kwtop ), 1, jw, v, ldv, infqr )
429 $ t( jw, jw-2 ) = zero
436 IF( ilst.LE.ns )
THEN
440 bulge = t( ns, ns-1 ).NE.zero
445 IF( .NOT. bulge )
THEN
449 foo = abs( t( ns, ns ) )
452 IF( abs( s*v( 1, ns ) ).LE.
max( smlnum, ulp*foo ) )
THEN
463 CALL strexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, work,
471 foo = abs( t( ns, ns ) ) + sqrt( abs( t( ns, ns-1 ) ) )*
472 $ sqrt( abs( t( ns-1, ns ) ) )
475 IF(
max( abs( s*v( 1, ns ) ), abs( s*v( 1, ns-1 ) ) ).LE.
476 $
max( smlnum, ulp*foo ) )
THEN
488 CALL strexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, work,
521 ELSE IF( t( i+1, i ).EQ.zero )
THEN
529 evi = abs( t( i, i ) )
531 evi = abs( t( i, i ) ) + sqrt( abs( t( i+1, i ) ) )*
532 $ sqrt( abs( t( i, i+1 ) ) )
536 evk = abs( t( k, k ) )
537 ELSE IF( t( k+1, k ).EQ.zero )
THEN
538 evk = abs( t( k, k ) )
540 evk = abs( t( k, k ) ) + sqrt( abs( t( k+1, k ) ) )*
541 $ sqrt( abs( t( k, k+1 ) ) )
544 IF( evi.GE.evk )
THEN
550 CALL strexc(
'V', jw, t, ldt, v, ldv, ifst, ilst, work,
560 ELSE IF( t( i+1, i ).EQ.zero )
THEN
575 IF( i.GE.infqr+1 )
THEN
576 IF( i.EQ.infqr+1 )
THEN
577 sr( kwtop+i-1 ) = t( i, i )
578 si( kwtop+i-1 ) = zero
580 ELSE IF( t( i, i-1 ).EQ.zero )
THEN
581 sr( kwtop+i-1 ) = t( i, i )
582 si( kwtop+i-1 ) = zero
589 CALL slanv2( aa, bb, cc, dd, sr( kwtop+i-2 ),
590 $ si( kwtop+i-2 ), sr( kwtop+i-1 ),
591 $ si( kwtop+i-1 ), cs, sn )
597 IF( ns.LT.jw .OR. s.EQ.zero )
THEN
598 IF( ns.GT.1 .AND. s.NE.zero )
THEN
602 CALL scopy( ns, v, ldv, work, 1 )
604 CALL slarfg( ns, beta, work( 2 ), 1, tau )
607 CALL slaset(
'L', jw-2, jw-2, zero, zero, t( 3, 1 ), ldt )
609 CALL slarf(
'L', ns, jw, work, 1, tau, t, ldt,
611 CALL slarf(
'R', ns, ns, work, 1, tau, t, ldt,
613 CALL slarf(
'R', jw, ns, work, 1, tau, v, ldv,
616 CALL sgehrd( jw, 1, ns, t, ldt, work, work( jw+1 ),
623 $ h( kwtop, kwtop-1 ) = s*v( 1, 1 )
624 CALL slacpy(
'U', jw, jw, t, ldt, h( kwtop, kwtop ), ldh )
625 CALL scopy( jw-1, t( 2, 1 ), ldt+1, h( kwtop+1, kwtop ),
631 IF( ns.GT.1 .AND. s.NE.zero )
632 $
CALL sormhr(
'R',
'N', jw, ns, 1, ns, t, ldt, work, v, ldv,
633 $ work( jw+1 ), lwork-jw, info )
642 DO 70 krow = ltop, kwtop - 1, nv
643 kln =
min( nv, kwtop-krow )
644 CALL sgemm(
'N',
'N', kln, jw, jw, one, h( krow, kwtop ),
645 $ ldh, v, ldv, zero, wv, ldwv )
646 CALL slacpy(
'A', kln, jw, wv, ldwv, h( krow, kwtop ), ldh )
652 DO 80 kcol = kbot + 1, n, nh
653 kln =
min( nh, n-kcol+1 )
654 CALL sgemm(
'C',
'N', jw, kln, jw, one, v, ldv,
655 $ h( kwtop, kcol ), ldh, zero, t, ldt )
656 CALL slacpy(
'A', jw, kln, t, ldt, h( kwtop, kcol ),
664 DO 90 krow = iloz, ihiz, nv
665 kln =
min( nv, ihiz-krow+1 )
666 CALL sgemm(
'N',
'N', kln, jw, jw, one, z( krow, kwtop ),
667 $ ldz, v, ldv, zero, wv, ldwv )
668 CALL slacpy(
'A', kln, jw, wv, ldwv, z( krow, kwtop ),
688 work( 1 ) = real( lwkopt )