281 SUBROUTINE sgges( JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB,
282 $ SDIM, ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR,
283 $ LDVSR, WORK, LWORK, BWORK, INFO )
290 CHARACTER JOBVSL, JOBVSR, SORT
291 INTEGER INFO, LDA, LDB, LDVSL, LDVSR, LWORK, N, SDIM
295 REAL A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
296 $ b( ldb, * ), beta( * ), vsl( ldvsl, * ),
297 $ vsr( ldvsr, * ), work( * )
308 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
311 LOGICAL CURSL, ILASCL, ILBSCL, ILVSL, ILVSR, LASTSL,
312 $ LQUERY, LST2SL, WANTST
313 INTEGER I, ICOLS, IERR, IHI, IJOBVL, IJOBVR, ILEFT,
314 $ ILO, IP, IRIGHT, IROWS, ITAU, IWRK, MAXWRK,
316 REAL ANRM, ANRMTO, BIGNUM, BNRM, BNRMTO, EPS, PVSL,
317 $ PVSR, SAFMAX, SAFMIN, SMLNUM
332 EXTERNAL lsame, ilaenv, slamch, slange
335 INTRINSIC abs,
max, sqrt
341 IF( lsame( jobvsl,
'N' ) )
THEN
344 ELSE IF( lsame( jobvsl,
'V' ) )
THEN
352 IF( lsame( jobvsr,
'N' ) )
THEN
355 ELSE IF( lsame( jobvsr,
'V' ) )
THEN
363 wantst = lsame( sort,
'S' )
368 lquery = ( lwork.EQ.-1 )
369 IF( ijobvl.LE.0 )
THEN
371 ELSE IF( ijobvr.LE.0 )
THEN
373 ELSE IF( ( .NOT.wantst ) .AND. ( .NOT.lsame( sort,
'N' ) ) )
THEN
375 ELSE IF( n.LT.0 )
THEN
377 ELSE IF( lda.LT.
max( 1, n ) )
THEN
379 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
381 ELSE IF( ldvsl.LT.1 .OR. ( ilvsl .AND. ldvsl.LT.n ) )
THEN
383 ELSE IF( ldvsr.LT.1 .OR. ( ilvsr .AND. ldvsr.LT.n ) )
THEN
396 minwrk =
max( 8*n, 6*n + 16 )
397 maxwrk = minwrk - n +
398 $ n*ilaenv( 1,
'SGEQRF',
' ', n, 1, n, 0 )
399 maxwrk =
max( maxwrk, minwrk - n +
400 $ n*ilaenv( 1,
'SORMQR',
' ', n, 1, n, -1 ) )
402 maxwrk =
max( maxwrk, minwrk - n +
403 $ n*ilaenv( 1,
'SORGQR',
' ', n, 1, n, -1 ) )
411 IF( lwork.LT.minwrk .AND. .NOT.lquery )
416 CALL xerbla(
'SGGES ', -info )
418 ELSE IF( lquery )
THEN
432 SAFMIN = SLAMCH( 's
' )
433 SAFMAX = ONE / SAFMIN
434 CALL SLABAD( SAFMIN, SAFMAX )
435 SMLNUM = SQRT( SAFMIN ) / EPS
436 BIGNUM = ONE / SMLNUM
440 ANRM = SLANGE( 'm
', N, N, A, LDA, WORK )
442.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
445.GT.
ELSE IF( ANRMBIGNUM ) THEN
450 $ CALL SLASCL( 'g
', 0, 0, ANRM, ANRMTO, N, N, A, LDA, IERR )
454 BNRM = SLANGE( 'm
', N, N, B, LDB, WORK )
456.GT..AND..LT.
IF( BNRMZERO BNRMSMLNUM ) THEN
459.GT.
ELSE IF( BNRMBIGNUM ) THEN
464 $ CALL SLASCL( 'g
', 0, 0, BNRM, BNRMTO, N, N, B, LDB, IERR )
472 CALL SGGBAL( 'p
', N, A, LDA, B, LDB, ILO, IHI, WORK( ILEFT ),
473 $ WORK( IRIGHT ), WORK( IWRK ), IERR )
478 IROWS = IHI + 1 - ILO
482 CALL SGEQRF( IROWS, ICOLS, B( ILO, ILO ), LDB, WORK( ITAU ),
483 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
488 CALL SORMQR( 'l
', 't
', IROWS, ICOLS, IROWS, B( ILO, ILO ), LDB,
489 $ WORK( ITAU ), A( ILO, ILO ), LDA, WORK( IWRK ),
490 $ LWORK+1-IWRK, IERR )
496 CALL SLASET( 'full
', N, N, ZERO, ONE, VSL, LDVSL )
497.GT.
IF( IROWS1 ) THEN
498 CALL SLACPY( 'l
', IROWS-1, IROWS-1, B( ILO+1, ILO ), LDB,
499 $ VSL( ILO+1, ILO ), LDVSL )
501 CALL SORGQR( IROWS, IROWS, IROWS, VSL( ILO, ILO ), LDVSL,
502 $ WORK( ITAU ), WORK( IWRK ), LWORK+1-IWRK, IERR )
508 $ CALL SLASET( 'full
', N, N, ZERO, ONE, VSR, LDVSR )
513 CALL SGGHRD( JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB, VSL,
514 $ LDVSL, VSR, LDVSR, IERR )
520 CALL SHGEQZ( 's
', JOBVSL, JOBVSR, N, ILO, IHI, A, LDA, B, LDB,
521 $ ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR,
522 $ WORK( IWRK ), LWORK+1-IWRK, IERR )
524.GT..AND..LE.
IF( IERR0 IERRN ) THEN
526.GT..AND..LE.
ELSE IF( IERRN IERR2*N ) THEN
543 CALL SLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N,
545 CALL SLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N,
549 $ CALL SLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
554 BWORK( I ) = SELCTG( ALPHAR( I ), ALPHAI( I ), BETA( I ) )
557 CALL STGSEN( 0, ILVSL, ILVSR, BWORK, N, A, LDA, B, LDB, ALPHAR,
558 $ ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR, SDIM, PVSL,
559 $ PVSR, DIF, WORK( IWRK ), LWORK-IWRK+1, IDUM, 1,
570 $ CALL SGGBAK( 'p
', 'l
', N, ILO, IHI, WORK( ILEFT ),
571 $ WORK( IRIGHT ), N, VSL, LDVSL, IERR )
574 $ CALL SGGBAK( 'p
', 'r
', N, ILO, IHI, WORK( ILEFT ),
575 $ WORK( IRIGHT ), N, VSR, LDVSR, IERR )
583.NE.
IF( ALPHAI( I )ZERO ) THEN
584.GT..OR.
IF( ( ALPHAR( I )/SAFMAX )( ANRMTO/ANRM )
585.GT.
$ ( SAFMIN/ALPHAR( I ) )( ANRM/ANRMTO ) ) THEN
586 WORK( 1 ) = ABS( A( I, I )/ALPHAR( I ) )
587 BETA( I ) = BETA( I )*WORK( 1 )
588 ALPHAR( I ) = ALPHAR( I )*WORK( 1 )
589 ALPHAI( I ) = ALPHAI( I )*WORK( 1 )
590.GT..OR.
ELSE IF( ( ALPHAI( I )/SAFMAX )( ANRMTO/ANRM )
591.GT.
$ ( SAFMIN/ALPHAI( I ) )( ANRM/ANRMTO ) ) THEN
592 WORK( 1 ) = ABS( A( I, I+1 )/ALPHAI( I ) )
593 BETA( I ) = BETA( I )*WORK( 1 )
594 ALPHAR( I ) = ALPHAR( I )*WORK( 1 )
595 ALPHAI( I ) = ALPHAI( I )*WORK( 1 )
603.NE.
IF( ALPHAI( I )ZERO ) THEN
604.GT..OR.
IF( ( BETA( I )/SAFMAX )( BNRMTO/BNRM )
605.GT.
$ ( SAFMIN/BETA( I ) )( BNRM/BNRMTO ) ) THEN
606 WORK( 1 ) = ABS(B( I, I )/BETA( I ))
607 BETA( I ) = BETA( I )*WORK( 1 )
608 ALPHAR( I ) = ALPHAR( I )*WORK( 1 )
609 ALPHAI( I ) = ALPHAI( I )*WORK( 1 )
618 CALL SLASCL( 'h
', 0, 0, ANRMTO, ANRM, N, N, A, LDA, IERR )
619 CALL SLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAR, N, IERR )
620 CALL SLASCL( 'g
', 0, 0, ANRMTO, ANRM, N, 1, ALPHAI, N, IERR )
624 CALL SLASCL( 'u
', 0, 0, BNRMTO, BNRM, N, N, B, LDB, IERR )
625 CALL SLASCL( 'g
', 0, 0, BNRMTO, BNRM, N, 1, BETA, N, IERR )
637 CURSL = SELCTG( ALPHAR( I ), ALPHAI( I ), BETA( I ) )
638.EQ.
IF( ALPHAI( I )ZERO ) THEN
642.AND..NOT.
IF( CURSL LASTSL )
649.OR.
CURSL = CURSL LASTSL
654.AND..NOT.
IF( CURSL LST2SL )
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 slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
subroutine slascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine xerbla(srname, info)
XERBLA
subroutine sggbak(job, side, n, ilo, ihi, lscale, rscale, m, v, ldv, info)
SGGBAK
subroutine sggbal(job, n, a, lda, b, ldb, ilo, ihi, lscale, rscale, work, info)
SGGBAL
subroutine sgeqrf(m, n, a, lda, tau, work, lwork, info)
SGEQRF
subroutine shgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alphar, alphai, beta, q, ldq, z, ldz, work, lwork, info)
SHGEQZ
subroutine sgges(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, bwork, info)
SGGES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE m...
subroutine sgghrd(compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z, ldz, info)
SGGHRD
subroutine sormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
SORMQR
subroutine stgsen(ijob, wantq, wantz, select, n, a, lda, b, ldb, alphar, alphai, beta, q, ldq, z, ldz, m, pl, pr, dif, work, lwork, iwork, liwork, info)
STGSEN
subroutine sorgqr(m, n, k, a, lda, tau, work, lwork, info)
SORGQR