263 SUBROUTINE claqr3( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
264 $ IHIZ, Z, LDZ, NS, ND, SH, V, LDV, NH, T, LDT,
265 $ NV, WV, LDWV, WORK, LWORK )
272 INTEGER IHIZ, ILOZ, KBOT, KTOP, LDH, LDT, LDV, LDWV,
273 $ LDZ, LWORK, N, ND, NH, NS, NV, NW
277 COMPLEX H( LDH, * ), SH( * ), T( LDT, * ), V( LDV, * ),
278 $ WORK( * ), WV( LDWV, * ), Z( LDZ, * )
285 PARAMETER ( ZERO = ( 0.0e0, 0.0e0 ),
286 $ one = ( 1.0e0, 0.0e0 ) )
288 PARAMETER ( RZERO = 0.0e0, rone = 1.0e0 )
291 COMPLEX BETA, CDUM, S, TAU
292 REAL FOO, SAFMAX, , SMLNUM, ULP
293 INTEGER I, IFST, ILST, INFO, INFQR, J, JW, KCOL, KLN,
294 $ knt, krow, kwtop, ltop, lwk1, lwk2, lwk3,
300 EXTERNAL slamch, ilaenv
307 INTRINSIC abs, aimag,
cmplx, conjg, int,
max,
min, real
313 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( cdum ) )
319 jw =
min( nw, kbot-ktop+1 )
326 CALL cgehrd( jw, 1, jw-1, t, ldt, work, work, -1, info )
327 lwk1 = int( work( 1 ) )
331 CALL cunmhr(
'R',
'N', jw, jw, 1, jw-1, t, ldt, work, v, ldv,
333 lwk2 = int( work( 1 ) )
337 CALL claqr4( .true., .true., jw, 1, jw, t, ldt, sh, 1, jw, v,
338 $ ldv, work, -1, infqr )
339 lwk3 = int( work( 1 ) )
343 lwkopt =
max( jw+
max( lwk1, lwk2 ), lwk3 )
348 IF( lwork.EQ.-1 )
THEN
349 work( 1 ) =
cmplx( lwkopt, 0 )
366 safmin = slamch(
'SAFE MINIMUM' )
367 safmax = rone / 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 sh( kwtop ) = h( kwtop, kwtop )
389 IF( cabs1( s ).LE.
max( smlnum, ulp*cabs1( h( kwtop,
394 $ h( kwtop, kwtop-1 ) = zero
406 CALL clacpy( 'u
', JW, JW, H( KWTOP, KWTOP ), LDH, T, LDT )
407 CALL CCOPY( JW-1, H( KWTOP+1, KWTOP ), LDH+1, T( 2, 1 ), LDT+1 )
409 CALL CLASET( 'a
', JW, JW, ZERO, ONE, V, LDV )
410 NMIN = ILAENV( 12, 'claqr3', 'sv
', JW, 1, JW, LWORK )
411.GT.
IF( JWNMIN ) THEN
412 CALL CLAQR4( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
413 $ JW, V, LDV, WORK, LWORK, INFQR )
415 CALL CLAHQR( .true., .true., JW, 1, JW, T, LDT, SH( KWTOP ), 1,
416 $ JW, V, LDV, INFQR )
423 DO 10 KNT = INFQR + 1, JW
427 FOO = CABS1( T( NS, NS ) )
430.LE.
IF( CABS1( S )*CABS1( V( 1, NS ) )MAX( SMLNUM, ULP*FOO ) )
442 CALL CTREXC( 'v
', JW, T, LDT, V, LDV, IFST, ILST, INFO )
457 DO 30 I = INFQR + 1, NS
460.GT.
IF( CABS1( T( J, J ) )CABS1( T( IFST, IFST ) ) )
465 $ CALL CTREXC( 'v
', JW, T, LDT, V, LDV, IFST, ILST, INFO )
471 DO 40 I = INFQR + 1, JW
472 SH( KWTOP+I-1 ) = T( I, I )
476.LT..OR..EQ.
IF( NSJW SZERO ) THEN
477.GT..AND..NE.
IF( NS1 SZERO ) THEN
481 CALL CCOPY( NS, V, LDV, WORK, 1 )
483 WORK( I ) = CONJG( WORK( I ) )
486 CALL CLARFG( NS, BETA, WORK( 2 ), 1, TAU )
489 CALL CLASET( 'l
', JW-2, JW-2, ZERO, ZERO, T( 3, 1 ), LDT )
491 CALL CLARF( 'l
', NS, JW, WORK, 1, CONJG( TAU ), T, LDT,
493 CALL CLARF( 'r
', NS, NS, WORK, 1, TAU, T, LDT,
495 CALL CLARF( 'r
', JW, NS, WORK, 1, TAU, V, LDV,
498 CALL CGEHRD( JW, 1, NS, T, LDT, WORK, WORK( JW+1 ),
505 $ H( KWTOP, KWTOP-1 ) = S*CONJG( V( 1, 1 ) )
506 CALL CLACPY( 'u
', JW, JW, T, LDT, H( KWTOP, KWTOP ), LDH )
507 CALL CCOPY( JW-1, T( 2, 1 ), LDT+1, H( KWTOP+1, KWTOP ),
513.GT..AND..NE.
IF( NS1 SZERO )
514 $ CALL CUNMHR( 'r
', 'n
', JW, NS, 1, NS, T, LDT, WORK, V, LDV,
515 $ WORK( JW+1 ), LWORK-JW, INFO )
524 DO 60 KROW = LTOP, KWTOP - 1, NV
525 KLN = MIN( NV, KWTOP-KROW )
526 CALL CGEMM( 'n
', 'n
', KLN, JW, JW, ONE, H( KROW, KWTOP ),
527 $ LDH, V, LDV, ZERO, WV, LDWV )
528 CALL CLACPY( 'a
', KLN, JW, WV, LDWV, H( KROW, KWTOP ), LDH )
534 DO 70 KCOL = KBOT + 1, N, NH
535 KLN = MIN( NH, N-KCOL+1 )
536 CALL CGEMM( 'c
', 'n
', JW, KLN, JW, ONE, V, LDV,
537 $ H( KWTOP, KCOL ), LDH, ZERO, T, LDT )
538 CALL CLACPY( 'a
', JW, KLN, T, LDT, H( KWTOP, KCOL ),
546 DO 80 KROW = ILOZ, IHIZ, NV
547 KLN = MIN( NV, IHIZ-KROW+1 )
548 CALL CGEMM( 'n
', 'n
', KLN, JW, JW, ONE, Z( KROW, KWTOP ),
549 $ LDZ, V, LDV, ZERO, WV, LDWV )
550 CALL CLACPY( 'a
', KLN, JW, WV, LDWV, Z( KROW, KWTOP ),
570 WORK( 1 ) = CMPLX( LWKOPT, 0 )
subroutine slabad(small, large)
SLABAD
subroutine cgehrd(n, ilo, ihi, a, lda, tau, work, lwork, info)
CGEHRD
subroutine clarfg(n, alpha, x, incx, tau)
CLARFG generates an elementary reflector (Householder matrix).
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,...
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
subroutine claqr4(wantt, wantz, n, ilo, ihi, h, ldh, w, iloz, ihiz, z, ldz, work, lwork, info)
CLAQR4 computes the eigenvalues of a Hessenberg matrix, and optionally the matrices from the Schur de...
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 claqr3(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, ihiz, z, ldz, ns, nd, sh, v, ldv, nh, t, ldt, nv, wv, ldwv, work, lwork)
CLAQR3 performs the unitary similarity transformation of a Hessenberg matrix to detect and deflate fu...
subroutine clarf(side, m, n, v, incv, tau, c, ldc, work)
CLARF applies an elementary reflector to a general rectangular matrix.
subroutine ctrexc(compq, n, t, ldt, q, ldq, ifst, ilst, info)
CTREXC
subroutine cunmhr(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, work, lwork, info)
CUNMHR
subroutine ccopy(n, cx, incx, cy, incy)
CCOPY
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM