216 SUBROUTINE ztrevc( SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR,
217 $ LDVR, MM, M, WORK, RWORK, INFO )
224 CHARACTER HOWMNY, SIDE
225 INTEGER INFO, LDT, LDVL, LDVR, M, MM, N
229 DOUBLE PRECISION RWORK( * )
230 COMPLEX*16 T( LDT, * ), VL( LDVL, * ), VR( LDVR, * ),
237 DOUBLE PRECISION ZERO, ONE
238 parameter( zero = 0.0d+0, one = 1.0d+0 )
239 COMPLEX*16 CMZERO, CMONE
240 parameter( cmzero = ( 0.0d+0, 0.0d+0 ),
241 $ cmone = ( 1.0d+0, 0.0d+0 ) )
244 LOGICAL ALLV, BOTHV, LEFTV, OVER, RIGHTV, SOMEV
245 INTEGER I, II, IS, J, K, KI
246 DOUBLE PRECISION OVFL, REMAX, SCALE, SMIN, SMLNUM, ULP, UNFL
252 DOUBLE PRECISION DLAMCH,
253 EXTERNAL lsame, izamax, dlamch,
dzasum
259 INTRINSIC abs, dble, dcmplx, dconjg, dimag,
max
262 DOUBLE PRECISION CABS1
265 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
271 bothv = lsame( side,
'B' )
272 rightv = lsame( side,
'R' ) .OR. bothv
273 leftv = lsame( side,
'L' ) .OR. bothv
275 allv = lsame( howmny,
'A' )
276 over = lsame( howmny,
'B' )
277 somev = lsame( howmny,
'S' )
293 IF( .NOT.rightv .AND. .NOT.leftv )
THEN
295 ELSE IF( .NOT.allv .AND. .NOT.over .AND. .NOT.somev )
THEN
297 ELSE IF( n.LT.0 )
THEN
299 ELSE IF( ldt.LT.
max( 1, n ) )
THEN
301 ELSE IF( ldvl.LT.1 .OR. ( leftv .AND. ldvl.LT.n ) )
THEN
303 ELSE IF( ldvr.LT.1 .OR. ( rightv .AND. ldvr.LT.n ) )
THEN
305 ELSE IF( mm.LT.m )
THEN
309 CALL xerbla(
'ZTREVC', -info )
320 unfl = dlamch(
'Safe minimum' )
323 ulp = dlamch( 'precision
' )
324 SMLNUM = UNFL*( N / ULP )
329 WORK( I+N ) = T( I, I )
337 RWORK( J ) = DZASUM( J-1, T( 1, J ), 1 )
348.NOT.
IF( SELECT( KI ) )
351 SMIN = MAX( ULP*( CABS1( T( KI, KI ) ) ), SMLNUM )
358 WORK( K ) = -T( K, KI )
365 T( K, K ) = T( K, K ) - T( KI, KI )
366.LT.
IF( CABS1( T( K, K ) )SMIN )
371 CALL ZLATRS( 'upper
', 'no transpose
', 'non-unit
', 'y
',
372 $ KI-1, T, LDT, WORK( 1 ), SCALE, RWORK,
380 CALL ZCOPY( KI, WORK( 1 ), 1, VR( 1, IS ), 1 )
382 II = IZAMAX( KI, VR( 1, IS ), 1 )
383 REMAX = ONE / CABS1( VR( II, IS ) )
384 CALL ZDSCAL( KI, REMAX, VR( 1, IS ), 1 )
391 $ CALL ZGEMV( 'n
', N, KI-1, CMONE, VR, LDVR, WORK( 1 ),
392 $ 1, DCMPLX( SCALE ), VR( 1, KI ), 1 )
394 II = IZAMAX( N, VR( 1, KI ), 1 )
395 REMAX = ONE / CABS1( VR( II, KI ) )
396 CALL ZDSCAL( N, REMAX, VR( 1, KI ), 1 )
402 T( K, K ) = WORK( K+N )
417.NOT.
IF( SELECT( KI ) )
420 SMIN = MAX( ULP*( CABS1( T( KI, KI ) ) ), SMLNUM )
427 WORK( K ) = -DCONJG( T( KI, K ) )
434 T( K, K ) = T( K, K ) - T( KI, KI )
435.LT.
IF( CABS1( T( K, K ) )SMIN )
440 CALL ZLATRS( 'upper
', 'conjugate transpose
', 'non-unit
',
441 $ 'y
', N-KI, T( KI+1, KI+1 ), LDT,
442 $ WORK( KI+1 ), SCALE, RWORK, INFO )
449 CALL ZCOPY( N-KI+1, WORK( KI ), 1, VL( KI, IS ), 1 )
451 II = IZAMAX( N-KI+1, VL( KI, IS ), 1 ) + KI - 1
452 REMAX = ONE / CABS1( VL( II, IS ) )
453 CALL ZDSCAL( N-KI+1, REMAX, VL( KI, IS ), 1 )
460 $ CALL ZGEMV( 'n
', N, N-KI, CMONE, VL( 1, KI+1 ), LDVL,
461 $ WORK( KI+1 ), 1, DCMPLX( SCALE ),
464 II = IZAMAX( N, VL( 1, KI ), 1 )
465 REMAX = ONE / CABS1( VL( II, KI ) )
466 CALL ZDSCAL( N, REMAX, VL( 1, KI ), 1 )
472 T( K, K ) = WORK( K+N )
subroutine zlatrs(uplo, trans, diag, normin, n, a, lda, x, scale, cnorm, info)
ZLATRS solves a triangular system of equations with the scale factor set to prevent overflow.
subroutine ztrevc(side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, rwork, info)
ZTREVC
subroutine zgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
ZGEMV