297 SUBROUTINE chseqr( JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ,
298 $ WORK, LWORK, INFO )
305 INTEGER IHI, ILO, INFO, LDH, LDZ, LWORK, N
309 COMPLEX H( ldh, * ), W( * ), WORK( * ), Z( ldz, * )
320 parameter( ntiny = 15 )
331 parameter( zero = ( 0.0e0, 0.0e0 ),
332 $ one = ( 1.0e0, 0.0e0 ) )
334 parameter( rzero = 0.0e0 )
337 COMPLEX HL( nl, nl ), WORKL( nl )
341 LOGICAL INITZ, LQUERY, WANTT, WANTZ
346 EXTERNAL ilaenv, lsame
352 INTRINSIC cmplx, max, min, real
358 wantt = lsame( job,
'S' )
359 initz = lsame( compz,
'I' )
360 wantz = initz .OR. lsame( compz,
'V' )
361 work( 1 ) = cmplx(
REAL( MAX( 1, N ) ), RZERO )
365 IF( .NOT.lsame( job,
'E' ) .AND. .NOT.wantt )
THEN 367 ELSE IF( .NOT.lsame( compz,
'N' ) .AND. .NOT.wantz )
THEN 369 ELSE IF( n.LT.0 )
THEN 371 ELSE IF( ilo.LT.1 .OR. ilo.GT.max( 1, n ) )
THEN 373 ELSE IF( ihi.LT.min( ilo, n ) .OR. ihi.GT.n )
THEN 375 ELSE IF( ldh.LT.max( 1, n ) )
THEN 377 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.max( 1, n ) ) )
THEN 379 ELSE IF( lwork.LT.max( 1, n ) .AND. .NOT.lquery )
THEN 387 CALL xerbla(
'CHSEQR', -info )
390 ELSE IF( n.EQ.0 )
THEN 396 ELSE IF( lquery )
THEN 400 CALL claqr0( wantt, wantz, n, ilo, ihi, h, ldh, w, ilo, ihi, z,
401 $ ldz, work, lwork, info )
404 work( 1 ) = cmplx( max(
REAL( WORK( 1 ) ),
REAL( MAX( 1,
$ N ) ) 412 $
CALL ccopy( ilo-1, h, ldh+1, w, 1 )
414 $
CALL ccopy( n-ihi, h( ihi+1, ihi+1 ), ldh+1, w( ihi+1 ), 1 )
419 $
CALL claset(
'A', n, n, zero, one, z, ldz )
423 IF( ilo.EQ.ihi )
THEN 424 w( ilo ) = h( ilo, ilo )
430 nmin = ilaenv( 12,
'CHSEQR', job( : 1 ) // compz( : 1 ), n,
432 nmin = max( ntiny, nmin )
437 CALL claqr0( wantt, wantz, n, ilo, ihi, h, ldh, w, ilo, ihi,
438 $ z, ldz, work, lwork, info )
443 CALL clahqr( wantt, wantz, n, ilo, ihi, h, ldh, w, ilo, ihi,
458 CALL claqr0( wantt, wantz, n, ilo, kbot, h, ldh, w,
459 $ ilo, ihi, z, ldz, work, lwork, info )
468 CALL clacpy(
'A', n, n, h, ldh, hl, nl )
470 CALL claset(
'A', nl, nl-n, zero, zero, hl( 1, n+1 ),
472 CALL claqr0( wantt, wantz, nl, ilo, kbot, hl, nl, w,
473 $ ilo, ihi, z, ldz, workl, nl, info )
474 IF( wantt .OR. info.NE.0 )
475 $
CALL clacpy(
'A', n, n, hl, nl, h, ldh )
482 IF( ( wantt .OR. info.NE.0 ) .AND. n.GT.2 )
483 $
CALL claset(
'L', n-2, n-2, zero, zero, h( 3, 1 ), ldh )
488 work( 1 ) = cmplx( max(
REAL( MAX( 1, N ) ),
489 $
REAL( WORK( 1 ) ) ), rzero )
495 subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine claqr0(WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ, IHIZ, Z, LDZ, WORK, LWORK, INFO)
CLAQR0 computes the eigenvalues of a Hessenberg matrix, and optionally the matrices from the Schur de...
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine clahqr(WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ, IHIZ, Z, LDZ, INFO)
CLAHQR computes the eigenvalues and Schur factorization of an upper Hessenberg matrix, using the double-shift/single-shift QR algorithm.
subroutine chseqr(JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ, WORK, LWORK, INFO)
CHSEQR