217 SUBROUTINE ztgevc( SIDE, HOWMNY, SELECT, N, S, LDS, P, LDP, VL,
218 $ LDVL, VR, LDVR, MM, M, WORK, RWORK, INFO )
225 CHARACTER HOWMNY, SIDE
226 INTEGER INFO, LDP, LDS, LDVL, LDVR, M, MM, N
230 DOUBLE PRECISION RWORK( * )
231 COMPLEX*16 P( LDP, * ), S( LDS, * ), VL( LDVL, * ),
232 $ vr( ldvr, * ), work( * )
239 DOUBLE PRECISION ZERO, ONE
240 parameter( zero = 0.0d+0, one = 1.0d+0 )
241 COMPLEX*16 CZERO, CONE
242 parameter( czero = ( 0.0d+0, 0.0d+0 ),
243 $ cone = ( 1.0d+0, 0.0d+0 ) )
246 LOGICAL COMPL, COMPR, ILALL, ILBACK, ILBBAD, ILCOMP,
248 INTEGER I, IBEG, IEIG, IEND, IHWMNY, IM, ISIDE, ISRC,
250 DOUBLE PRECISION ACOEFA, ACOEFF, ANORM, ASCALE, BCOEFA, BIG,
251 $ bignum, bnorm, bscale, dmin, safmin, sbeta,
252 $ scale, small, temp, ulp, xmax
253 COMPLEX*16 BCOEFF, CA, CB, D, SALPHA, SUM, SUMA, SUMB, X
257 DOUBLE PRECISION DLAMCH
259 EXTERNAL lsame, dlamch, zladiv
265 INTRINSIC abs, dble, dcmplx, dconjg, dimag, max, min
268 DOUBLE PRECISION ABS1
271 abs1( x ) = abs( dble( x ) ) + abs( dimag( x ) )
277 IF( lsame( howmny,
'A' ) )
THEN
281 ELSE IF( lsame( howmny,
'S' ) )
THEN
285 ELSE IF( lsame( howmny,
'B' ) )
THEN
293 IF( lsame( side,
'R' ) )
THEN
297 ELSE IF( lsame( side,
'L' ) )
THEN
301 ELSE IF( lsame( side,
'B' ) )
THEN
310 IF( iside.LT.0 )
THEN
312 ELSE IF( ihwmny.LT.0 )
THEN
314 ELSE IF( n.LT.0 )
THEN
316 ELSE IF( lds.LT.max( 1, n ) )
THEN
318 ELSE IF( ldp.LT.max( 1, n ) )
THEN
322 CALL xerbla(
'ZTGEVC', -info )
328 IF( .NOT.ilall )
THEN
342 IF( dimag( p( j, j ) ).NE.zero )
348 ELSE IF( compl .AND. ldvl.LT.n .OR. ldvl.LT.1 )
THEN
350 ELSE IF( compr .AND. ldvr.LT.n .OR. ldvr.LT.1 )
THEN
352 ELSE IF( mm.LT.im )
THEN
356 CALL xerbla(
'ZTGEVC', -info )
368 safmin = dlamch(
'Safe minimum' )
370 CALL dlabad( safmin, big )
371 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
372 small = safmin*n / ulp
374 bignum = one / ( safmin*n )
380 anorm = abs1( s( 1, 1 ) )
381 bnorm = abs1( p( 1, 1 ) )
388 rwork( j ) = rwork( j ) + abs1( s( i, j ) )
389 rwork( n+j ) = rwork( n+j ) + abs1( p( i, j ) )
391 anorm = max( anorm, rwork( j )+abs1( s( j, j ) ) )
392 bnorm = max( bnorm, rwork( n+j )+abs1( p( j, j ) ) )
395 ascale = one / max( anorm, safmin )
396 bscale = one / max( bnorm, safmin )
409 ilcomp =
SELECT( je )
414 IF( abs1( s( je, je ) ).LE.safmin .AND.
415 $ abs( dble( p( je, je ) ) ).LE.safmin )
THEN
420 vl( jr, ieig ) = czero
422 vl( ieig, ieig ) = cone
431 temp = one / max( abs1( s( je, je ) )*ascale,
432 $ abs( dble( p( je, je ) ) )*bscale, safmin )
433 salpha = ( temp*s( je, je ) )*ascale
434 sbeta = ( temp*dble( p( je, je ) ) )*bscale
435 acoeff = sbeta*ascale
436 bcoeff = salpha*bscale
440 lsa = abs( sbeta ).GE.safmin .AND. abs( acoeff ).LT.small
441 lsb = abs1( salpha ).GE.safmin .AND. abs1( bcoeff ).LT.
446 $ scale = ( small / abs( sbeta ) )*min( anorm, big )
448 $ scale = max( scale, ( small / abs1( salpha ) )*
449 $ min( bnorm, big ) )
450 IF( lsa .OR. lsb )
THEN
451 scale = min( scale, one /
452 $ ( safmin*max( one, abs( acoeff ),
453 $ abs1( bcoeff ) ) ) )
455 acoeff = ascale*( scale*sbeta )
457 acoeff = scale*acoeff
460 bcoeff = bscale*( scale*salpha )
462 bcoeff = scale*bcoeff
466 acoefa = abs( acoeff )
467 bcoefa = abs1( bcoeff )
473 dmin = max( ulp*acoefa*anorm, ulp*bcoefa*bnorm, safmin )
490 IF( acoefa*rwork( j )+bcoefa*rwork( n+j ).GT.bignum*
493 work( jr ) = temp*work( jr )
501 suma = suma + dconjg( s( jr, j ) )*work( jr )
502 sumb = sumb + dconjg( p( jr, j ) )*work( jr )
504 sum = acoeff*suma - dconjg( bcoeff )*sumb
510 d = dconjg( acoeff*s( j, j )-bcoeff*p( j, j ) )
511 IF( abs1( d ).LE.dmin )
514 IF( abs1( d ).LT.one )
THEN
515 IF( abs1( sum ).GE.bignum*abs1( d ) )
THEN
516 temp = one / abs1( sum )
518 work( jr ) = temp*work( jr )
524 work( j ) = zladiv( -sum, d )
525 xmax = max( xmax, abs1( work( j ) ) )
531 CALL zgemv(
'N', n, n+1-je, cone, vl( 1, je ), ldvl,
532 $ work( je ), 1, czero, work( n+1 ), 1 )
544 xmax = max( xmax, abs1( work( ( isrc-1 )*n+jr ) ) )
547 IF( xmax.GT.safmin )
THEN
550 vl( jr, ieig ) = temp*work( ( isrc-1 )*n+jr )
556 DO 130 jr = 1, ibeg - 1
557 vl( jr, ieig ) = czero
575 ilcomp =
SELECT( je )
580 IF( abs1( s( je, je ) ).LE.safmin .AND.
581 $ abs( dble( p( je, je ) ) ).LE.safmin )
THEN
586 vr( jr, ieig ) = czero
588 vr( ieig, ieig ) = cone
597 temp = one / max( abs1( s( je, je ) )*ascale,
598 $ abs( dble( p( je, je ) ) )*bscale, safmin )
599 salpha = ( temp*s( je, je ) )*ascale
600 sbeta = ( temp*dble( p( je, je ) ) )*bscale
601 acoeff = sbeta*ascale
602 bcoeff = salpha*bscale
606 lsa = abs( sbeta ).GE.safmin .AND. abs( acoeff ).LT.small
607 lsb = abs1( salpha ).GE.safmin .AND. abs1( bcoeff ).LT.
612 $ scale = ( small / abs( sbeta ) )*min( anorm, big )
614 $ scale = max( scale, ( small / abs1( salpha ) )*
615 $ min( bnorm, big ) )
616 IF( lsa .OR. lsb )
THEN
617 scale = min( scale, one /
618 $ ( safmin*max( one, abs( acoeff ),
619 $ abs1( bcoeff ) ) ) )
621 acoeff = ascale*( scale*sbeta )
623 acoeff = scale*acoeff
626 bcoeff = bscale*( scale*salpha )
628 bcoeff = scale*bcoeff
632 acoefa = abs( acoeff )
633 bcoefa = abs1( bcoeff )
639 dmin = max( ulp*acoefa*anorm, ulp*bcoefa*bnorm, safmin )
646 DO 170 jr = 1, je - 1
647 work( jr ) = acoeff*s( jr, je ) - bcoeff*p( jr, je )
651 DO 210 j = je - 1, 1, -1
656 d = acoeff*s( j, j ) - bcoeff*p( j, j )
657 IF( abs1( d ).LE.dmin )
660 IF( abs1( d ).LT.one )
THEN
661 IF( abs1( work( j ) ).GE.bignum*abs1( d ) )
THEN
662 temp = one / abs1( work( j ) )
664 work( jr ) = temp*work( jr )
669 work( j ) = zladiv( -work( j ), d )
675 IF( abs1( work( j ) ).GT.one )
THEN
676 temp = one / abs1( work( j ) )
677 IF( acoefa*rwork( j )+bcoefa*rwork( n+j ).GE.
680 work( jr ) = temp*work( jr )
685 ca = acoeff*work( j )
686 cb = bcoeff*work( j )
688 work( jr ) = work( jr ) + ca*s( jr, j ) -
697 CALL zgemv(
'N', n, je, cone, vr, ldvr, work, 1,
698 $ czero, work( n+1 ), 1 )
710 xmax = max( xmax, abs1( work( ( isrc-1 )*n+jr ) ) )
713 IF( xmax.GT.safmin )
THEN
716 vr( jr, ieig ) = temp*work( ( isrc-1 )*n+jr )
722 DO 240 jr = iend + 1, n
723 vr( jr, ieig ) = czero
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZGEMV
subroutine ztgevc(SIDE, HOWMNY, SELECT, N, S, LDS, P, LDP, VL, LDVL, VR, LDVR, MM, M, WORK, RWORK, INFO)
ZTGEVC