237 SUBROUTINE clatrs( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
245 CHARACTER , NORMIN, TRANS, UPLO
251 COMPLEX A( LDA, * ), X( * )
257 REAL ZERO, HALF, ONE, TWO
258 parameter( zero = 0.0e+0, half = 0.5e+0, one = 1.0e+0,
262 LOGICAL NOTRAN, NOUNIT, UPPER
263 INTEGER I, IMAX, J, , JINC, JLAST
264 REAL BIGNUM, GROW, REC, SMLNUM, TJJ, TMAX, TSCAL,
266 COMPLEX CSUMJ, TJJS, USCAL, ZDUM
270 INTEGER ICAMAX, ISAMAX
272 COMPLEX CDOTC, CDOTU, CLADIV
273 EXTERNAL lsame, icamax, isamax, scasum, slamch, cdotc,
286 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
287 cabs2( zdum ) = abs( real( zdum ) / 2. ) +
288 $ abs( aimag( zdum ) / 2. )
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(
'CLATRS', -info )
326 smlnum = slamch(
'Safe minimum' )
327 bignum = one / smlnum
328 CALL slabad( smlnum, bignum )
329 smlnum = smlnum / slamch(
'Precision' )
330 bignum = one / smlnum
333 IF( lsame( normin,
'N' ) )
THEN
342 cnorm( j ) = scasum( j-1, a( 1, j ), 1 )
349 cnorm( j ) = scasum( n-j, a( j+1, j ), 1 )
358 imax = isamax( n, cnorm, 1 )
360 IF( tmax.LE.bignum*half )
THEN
363 tscal = half / ( smlnum*tmax )
364 CALL sscal( n, tscal, cnorm, 1 )
372 xmax =
max( xmax, cabs2( x( j ) ) )
390 IF( tscal.NE.one )
THEN
402 grow = half /
max( xbnd, smlnum )
404 DO 40 j = jfirst, jlast, jinc
414 IF( tjj.GE.smlnum )
THEN
418 xbnd =
min( xbnd,
min( one, tjj )*grow )
426 IF( tjj+cnorm( j ).GE.smlnum )
THEN
430 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
445 grow =
min( one, half /
max( xbnd, smlnum ) )
446 DO 50 j = jfirst, jlast, jinc
455 grow = grow*( one / ( one+cnorm( j ) ) )
474 IF( tscal.NE.one )
THEN
486 grow = half /
max( xbnd, smlnum )
488 DO 70 j = jfirst, jlast, jinc
497 xj = one + cnorm( j )
498 grow =
min( grow, xbnd / xj )
503 IF( tjj.GE.smlnum )
THEN
508 $ xbnd = xbnd*( tjj / xj )
516 grow =
min( grow, xbnd )
523 grow =
min( one, half /
max( xbnd, smlnum ) )
524 DO 80 j = jfirst, jlast, jinc
533 xj = one + cnorm( j )
540 IF( ( grow*tscal ).GT.smlnum )
THEN
545 CALL ctrsv( uplo, trans, diag, n, a, lda, x, 1 )
550 IF( xmax.GT.bignum*half )
THEN
555 scale = ( bignum*half ) / xmax
556 CALL csscal( n, scale, x, 1 )
566 DO 110 j = jfirst, jlast, jinc
572 tjjs = a( j, j )*tscal
579 IF( tjj.GT.smlnum )
THEN
583 IF( tjj.LT.one )
THEN
584 IF( xj.GT.tjj*bignum )
THEN
589 CALL csscal( n, rec, x, 1 )
594 x( j ) = cladiv( x( j ), tjjs )
596 ELSE IF( tjj.GT.zero )
THEN
600 IF( xj.GT.tjj*bignum )
THEN
605 rec = ( tjj*bignum ) / xj
606 IF( cnorm( j ).GT.one )
THEN
611 rec = rec / cnorm( j )
613 CALL csscal( n, rec, x, 1 )
617 x( j ) = cladiv( x( j ), tjjs )
639 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
644 CALL csscal( n, rec, x, 1 )
647 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
651 CALL csscal( n, half, x, 1 )
661 CALL caxpy( j-1, -x( j )*tscal, a( 1, j ),
663 i = icamax( j-1, x, 1 )
664 xmax = cabs1( x( i ) )
672 CALL caxpy( n-j, -x( j )*tscal, a( j+1, j ), 1,
674 i = j + icamax( n-j, x( j+1 ), 1 )
675 xmax = cabs1( x( i ) )
680 ELSE IF( lsame( trans,
'T' ) )
THEN
684 DO 150 j = jfirst, jlast, jinc
691 rec = one /
max( xmax, one )
692 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
698 tjjs = a( j, j )*tscal
703 IF( tjj.GT.one )
THEN
707 rec =
min( one, rec*tjj )
708 uscal = cladiv( uscal, tjjs )
710 IF( rec.LT.one )
THEN
711 CALL csscal( n, rec, x, 1 )
718 IF( uscal.EQ.
cmplx( one ) )
THEN
724 csumj = cdotu( j-1, a( 1, j ), 1, x, 1 )
725 ELSE IF( j.LT.n )
THEN
726 csumj = cdotu( n-j, a( j+1, j ), 1, x( j+1 ), 1 )
734 csumj = csumj + ( a( i, j )*uscal )*x( i )
736 ELSE IF( j.LT.n )
THEN
738 csumj = csumj + ( a( i, j )*uscal )*x( i )
743 IF( uscal.EQ.
cmplx( tscal ) )
THEN
748 x( j ) = x( j ) - csumj
751 tjjs = a( j, j )*tscal
761 IF( tjj.GT.smlnum )
THEN
765 IF( tjj.LT.one )
THEN
766 IF( xj.GT.tjj*bignum )
THEN
771 CALL csscal( n, rec, x, 1 )
776 x( j ) = cladiv( x( j ), tjjs )
777 ELSE IF( tjj.GT.zero )
THEN
781 IF( xj.GT.tjj*bignum )
THEN
785 rec = ( tjj*bignum ) / xj
786 CALL csscal( n, rec, x, 1 )
790 x( j ) = cladiv( x( j ), tjjs )
809 x( j ) = cladiv( x( j ), tjjs ) - csumj
811 xmax =
max( xmax, cabs1( x( j ) ) )
818 DO 190 j = jfirst, jlast, jinc
825 rec = one /
max( xmax, one )
826 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
832 tjjs = conjg( a( j, j ) )*tscal
837 IF( tjj.GT.one )
THEN
841 rec =
min( one, rec*tjj )
842 uscal = cladiv( uscal, tjjs )
844 IF( rec.LT.one )
THEN
845 CALL csscal( n, rec, x, 1 )
852 IF( uscal.EQ.
cmplx( one ) )
THEN
858 csumj = cdotc( j-1, a( 1, j ), 1, x, 1 )
859 ELSE IF( j.LT.n )
THEN
860 csumj = cdotc( n-j, a( j+1, j ), 1, x( j+1 ), 1 )
868 csumj = csumj + ( conjg( a( i, j ) )*uscal )*
871 ELSE IF( j.LT.n )
THEN
873 csumj = csumj + ( conjg( a( i, j ) )*uscal )*
879 IF( uscal.EQ.
cmplx( tscal ) )
THEN
884 x( j ) = x( j ) - csumj
887 tjjs = conjg( a( j, j ) )*tscal
897 IF( tjj.GT.smlnum )
THEN
901 IF( tjj.LT.one )
THEN
902 IF( xj.GT.tjj*bignum )
THEN
907 CALL csscal( n, rec, x, 1 )
912 x( j ) = cladiv( x( j ), tjjs )
913 ELSE IF( tjj.GT.zero )
THEN
917 IF( xj.GT.tjj*bignum )
THEN
921 rec = ( tjj*bignum ) / xj
922 CALL csscal( n, rec, x, 1 )
926 x( j ) = cladiv( x( j ), tjjs )
945 x( j ) = cladiv( x( j ), tjjs ) - csumj
947 xmax =
max( xmax, cabs1( x( j ) ) )
950 scale = scale / tscal
955 IF( tscal.NE.one )
THEN
956 CALL sscal( n, one / tscal, cnorm, 1 )