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, EVK, 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
307 EXTERNAL slamch, ilaenv
315 INTRINSIC abs, int, max, min,
REAL, SQRT
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', jw, 1, jw, lwork )
414 IF( jw.GT.nmin )
THEN 415 CALL slaqr4( .true., .true., jw, 1, jw, t, ldt, sr( kwtop ),
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 )
subroutine sormhr(SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMHR
subroutine slahqr(WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILOZ, IHIZ, Z, LDZ, INFO)
SLAHQR computes the eigenvalues and Schur factorization of an upper Hessenberg matrix, using the double-shift/single-shift QR algorithm.
subroutine sgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
SGEHRD
subroutine slanv2(A, B, C, D, RT1R, RT1I, RT2R, RT2I, CS, SN)
SLANV2 computes the Schur factorization of a real 2-by-2 nonsymmetric matrix in standard form...
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM
subroutine slaqr4(WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI, ILOZ, IHIZ, Z, LDZ, WORK, LWORK, INFO)
SLAQR4 computes the eigenvalues of a Hessenberg matrix, and optionally the matrices from the Schur de...
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine slarf(SIDE, M, N, V, INCV, TAU, C, LDC, WORK)
SLARF applies an elementary reflector to a general rectangular matrix.
subroutine strexc(COMPQ, N, T, LDT, Q, LDQ, IFST, ILST, WORK, INFO)
STREXC
subroutine slarfg(N, ALPHA, X, INCX, TAU)
SLARFG generates an elementary reflector (Householder matrix).
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine slaqr3(WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ, IHIZ, Z, LDZ, NS, ND, SR, SI, V, LDV, NH, T, LDT, NV, WV, LDWV, WORK, LWORK)
SLAQR3 performs the orthogonal similarity transformation of a Hessenberg matrix to detect and deflate...