235 SUBROUTINE zlatrs( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X,
244 CHARACTER DIAG, NORMIN, TRANS, UPLO
246 DOUBLE PRECISION SCALE
249 DOUBLE PRECISION CNORM( * )
250 COMPLEX*16 A( LDA, * ), X( * )
256 DOUBLE PRECISION ZERO, HALF, ONE, TWO
257 PARAMETER ( ZERO = 0.0d+0, half = 0.5d+0, one = 1.0d+0,
261 LOGICAL NOTRAN, NOUNIT, UPPER
262 INTEGER I, IMAX, J, JFIRST, JINC, JLAST
263 DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
265 COMPLEX*16 CSUMJ, TJJS, USCAL, ZDUM
269 INTEGER IDAMAX, IZAMAX
270 DOUBLE PRECISION DLAMCH, DZASUM
271 COMPLEX*16 ZDOTC, ZDOTU, ZLADIV
272 EXTERNAL lsame, idamax, izamax, dlamch, dzasum,
280 INTRINSIC abs, dble, dcmplx, dconjg, dimag, max, min
283 DOUBLE PRECISION CABS1, CABS2
286 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
287 cabs2( zdum ) = abs( dble( zdum ) / 2.d0 ) +
288 $ abs( dimag( zdum ) / 2.d0 )
293 upper = lsame( uplo,
'U' )
294 notran = lsame( trans,
'N' )
295 nounit = lsame( diag,
'N' )
299 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
301 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
302 $ lsame( trans,
'C' ) )
THEN
304 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
306 ELSE IF( .NOT.lsame( normin,
'Y' ) .AND. .NOT.
307 $ lsame( normin,
'N' ) )
THEN
309 ELSE IF( n.LT.0 )
THEN
311 ELSE IF( lda.LT.max( 1, n ) )
THEN
315 CALL xerbla(
'ZLATRS', -info )
327 smlnum = dlamch(
'Safe minimum' ) / dlamch(
'Precision' )
328 bignum = one / smlnum
330 IF( lsame( normin,
'N' ) )
THEN
339 cnorm( j ) = dzasum( j-1, a( 1, j ), 1 )
346 cnorm( j ) = dzasum( n-j, a( j+1, j ), 1 )
355 imax = idamax( n, cnorm, 1 )
357 IF( tmax.LE.bignum*half )
THEN
364 IF ( tmax.LE.dlamch(
'Overflow') )
THEN
366 tscal = half / ( smlnum*tmax )
367 CALL dscal( n, tscal, cnorm, 1 )
381 tmax = max( tmax, abs( dble( a( i, j ) ) ),
382 $ abs( dimag(a( i, j ) ) ) )
391 tmax = max( tmax, abs( dble( a( i, j ) ) ),
392 $ abs( dimag(a( i, j ) ) ) )
397 IF( tmax.LE.dlamch(
'Overflow') )
THEN
398 tscal = one / ( smlnum*tmax )
400 IF( cnorm( j ).LE.dlamch(
'Overflow') )
THEN
401 cnorm( j ) = cnorm( j )*tscal
409 cnorm( j ) = cnorm( j ) +
410 $ tscal * cabs2( a( i, j ) )
414 cnorm( j ) = cnorm( j ) +
415 $ tscal * cabs2( a( i, j ) )
424 CALL ztrsv( uplo, trans, diag, n, a, lda, x, 1 )
435 xmax = max( xmax, cabs2( x( j ) ) )
453 IF( tscal.NE.one )
THEN
465 grow = half / max( xbnd, smlnum )
467 DO 40 j = jfirst, jlast, jinc
477 IF( tjj.GE.smlnum )
THEN
481 xbnd = min( xbnd, min( one, tjj )*grow )
489 IF( tjj+cnorm( j ).GE.smlnum )
THEN
493 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
508 grow = min( one, half / max( xbnd, smlnum ) )
509 DO 50 j = jfirst, jlast, jinc
518 grow = grow*( one / ( one+cnorm( j ) ) )
537 IF( tscal.NE.one )
THEN
549 grow = half / max( xbnd, smlnum )
551 DO 70 j = jfirst, jlast, jinc
560 xj = one + cnorm( j )
561 grow = min( grow, xbnd / xj )
566 IF( tjj.GE.smlnum )
THEN
571 $ xbnd = xbnd*( tjj / xj )
579 grow = min( grow, xbnd )
586 grow = min( one, half / max( xbnd, smlnum ) )
587 DO 80 j = jfirst, jlast, jinc
596 xj = one + cnorm( j )
603 IF( ( grow*tscal ).GT.smlnum )
THEN
608 CALL ztrsv( uplo, trans, diag, n, a, lda, x, 1 )
613 IF( xmax.GT.bignum*half )
THEN
618 scale = ( bignum*half ) / xmax
619 CALL zdscal( n, scale, x, 1 )
629 DO 120 j = jfirst, jlast, jinc
635 tjjs = a( j, j )*tscal
642 IF( tjj.GT.smlnum )
THEN
646 IF( tjj.LT.one )
THEN
647 IF( xj.GT.tjj*bignum )
THEN
652 CALL zdscal( n, rec, x, 1 )
657 x( j ) = zladiv( x( j ), tjjs )
659 ELSE IF( tjj.GT.zero )
THEN
663 IF( xj.GT.tjj*bignum )
THEN
668 rec = ( tjj*bignum ) / xj
669 IF( cnorm( j ).GT.one )
THEN
674 rec = rec / cnorm( j )
676 CALL zdscal( n, rec, x, 1 )
680 x( j ) = zladiv( x( j ), tjjs )
702 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
707 CALL zdscal( n, rec, x, 1 )
710 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
714 CALL zdscal( n, half, x, 1 )
724 CALL zaxpy( j-1, -x( j )*tscal, a( 1, j ), 1, x,
726 i = izamax( j-1, x, 1 )
727 xmax = cabs1( x( i ) )
735 CALL zaxpy( n-j, -x( j )*tscal, a( j+1, j ), 1,
737 i = j + izamax( n-j, x( j+1 ), 1 )
738 xmax = cabs1( x( i ) )
743 ELSE IF( lsame( trans,
'T' ) )
THEN
747 DO 170 j = jfirst, jlast, jinc
754 rec = one / max( xmax, one )
755 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
761 tjjs = a( j, j )*tscal
766 IF( tjj.GT.one )
THEN
770 rec = min( one, rec*tjj )
771 uscal = zladiv( uscal, tjjs )
773 IF( rec.LT.one )
THEN
774 CALL zdscal( n, rec, x, 1 )
781 IF( uscal.EQ.dcmplx( one ) )
THEN
787 csumj = zdotu( j-1, a( 1, j ), 1, x, 1 )
788 ELSE IF( j.LT.n )
THEN
789 csumj = zdotu( n-j, a( j+1, j ), 1, x( j+1 ),
798 csumj = csumj + ( a( i, j )*uscal )*x( i )
800 ELSE IF( j.LT.n )
THEN
802 csumj = csumj + ( a( i, j )*uscal )*x( i )
807 IF( uscal.EQ.dcmplx( tscal ) )
THEN
812 x( j ) = x( j ) - csumj
815 tjjs = a( j, j )*tscal
825 IF( tjj.GT.smlnum )
THEN
829 IF( tjj.LT.one )
THEN
830 IF( xj.GT.tjj*bignum )
THEN
835 CALL zdscal( n, rec, x, 1 )
840 x( j ) = zladiv( x( j ), tjjs )
841 ELSE IF( tjj.GT.zero )
THEN
845 IF( xj.GT.tjj*bignum )
THEN
849 rec = ( tjj*bignum ) / xj
850 CALL zdscal( n, rec, x, 1 )
854 x( j ) = zladiv( x( j ), tjjs )
873 x( j ) = zladiv( x( j ), tjjs ) - csumj
875 xmax = max( xmax, cabs1( x( j ) ) )
882 DO 220 j = jfirst, jlast, jinc
889 rec = one / max( xmax, one )
890 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
896 tjjs = dconjg( a( j, j ) )*tscal
901 IF( tjj.GT.one )
THEN
905 rec = min( one, rec*tjj )
906 uscal = zladiv( uscal, tjjs )
908 IF( rec.LT.one )
THEN
909 CALL zdscal( n, rec, x, 1 )
916 IF( uscal.EQ.dcmplx( one ) )
THEN
922 csumj = zdotc( j-1, a( 1, j ), 1, x, 1 )
923 ELSE IF( j.LT.n )
THEN
924 csumj = zdotc( n-j, a( j+1, j ), 1, x( j+1 ),
933 csumj = csumj + ( dconjg( a( i, j ) )*uscal )*
936 ELSE IF( j.LT.n )
THEN
938 csumj = csumj + ( dconjg( a( i, j ) )*uscal )*
944 IF( uscal.EQ.dcmplx( tscal ) )
THEN
949 x( j ) = x( j ) - csumj
952 tjjs = dconjg( a( j, j ) )*tscal
962 IF( tjj.GT.smlnum )
THEN
966 IF( tjj.LT.one )
THEN
967 IF( xj.GT.tjj*bignum )
THEN
972 CALL zdscal( n, rec, x, 1 )
977 x( j ) = zladiv( x( j ), tjjs )
978 ELSE IF( tjj.GT.zero )
THEN
982 IF( xj.GT.tjj*bignum )
THEN
986 rec = ( tjj*bignum ) / xj
987 CALL zdscal( n, rec, x, 1 )
991 x( j ) = zladiv( x( j ), tjjs )
1010 x( j ) = zladiv( x( j ), tjjs ) - csumj
1012 xmax = max( xmax, cabs1( x( j ) ) )
1015 scale = scale / tscal
1020 IF( tscal.NE.one )
THEN
1021 CALL dscal( n, one / tscal, cnorm, 1 )