238 SUBROUTINE slatrs( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
247 CHARACTER DIAG, NORMIN, TRANS, UPLO
252 REAL A( LDA, * ), CNORM( * ), X( * )
259 parameter( zero = 0.0e+0, half = 0.5e+0, one = 1.0e+0 )
262 LOGICAL NOTRAN, NOUNIT, UPPER
263 INTEGER I, IMAX, J, JFIRST, JINC, JLAST
264 REAL BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
265 $ tmax, tscal, uscal, xbnd, xj, xmax
270 REAL SASUM, SDOT, SLAMCH
271 EXTERNAL lsame, isamax, sasum, sdot, slamch
277 INTRINSIC abs, max, min
282 upper = lsame( uplo,
'U' )
283 notran = lsame( trans,
'N' )
284 nounit = lsame( diag,
'N' )
288 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
290 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
291 $ lsame( trans,
'C' ) )
THEN
293 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
295 ELSE IF( .NOT.lsame( normin,
'Y' ) .AND. .NOT.
296 $ lsame( normin,
'N' ) )
THEN
298 ELSE IF( n.LT.0 )
THEN
300 ELSE IF( lda.LT.max( 1, n ) )
THEN
304 CALL xerbla(
'SLATRS', -info )
315 smlnum = slamch(
'Safe minimum' ) / slamch(
'Precision' )
316 bignum = one / smlnum
319 IF( lsame( normin,
'N' ) )
THEN
328 cnorm( j ) = sasum( j-1, a( 1, j ), 1 )
335 cnorm( j ) = sasum( n-j, a( j+1, j ), 1 )
344 imax = isamax( n, cnorm, 1 )
346 IF( tmax.LE.bignum )
THEN
349 tscal = one / ( smlnum*tmax )
350 CALL sscal( n, tscal, cnorm, 1 )
356 j = isamax( n, x, 1 )
373 IF( tscal.NE.one )
THEN
385 grow = one / max( xbnd, smlnum )
387 DO 30 j = jfirst, jlast, jinc
396 tjj = abs( a( j, j ) )
397 xbnd = min( xbnd, min( one, tjj )*grow )
398 IF( tjj+cnorm( j ).GE.smlnum )
THEN
402 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
417 grow = min( one, one / max( xbnd, smlnum ) )
418 DO 40 j = jfirst, jlast, jinc
427 grow = grow*( one / ( one+cnorm( j ) ) )
446 IF( tscal.NE.one )
THEN
458 grow = one / max( xbnd, smlnum )
460 DO 60 j = jfirst, jlast, jinc
469 xj = one + cnorm( j )
470 grow = min( grow, xbnd / xj )
474 tjj = abs( a( j, j ) )
476 $ xbnd = xbnd*( tjj / xj )
478 grow = min( grow, xbnd )
485 grow = min( one, one / max( xbnd, smlnum ) )
486 DO 70 j = jfirst, jlast, jinc
495 xj = one + cnorm( j )
502 IF( ( grow*tscal ).GT.smlnum )
THEN
507 CALL strsv( uplo, trans, diag, n, a, lda, x, 1 )
512 IF( xmax.GT.bignum )
THEN
517 scale = bignum / xmax
518 CALL sscal( n, scale, x, 1 )
526 DO 100 j = jfirst, jlast, jinc
532 tjjs = a( j, j )*tscal
539 IF( tjj.GT.smlnum )
THEN
543 IF( tjj.LT.one )
THEN
544 IF( xj.GT.tjj*bignum )
THEN
549 CALL sscal( n, rec, x, 1 )
554 x( j ) = x( j ) / tjjs
556 ELSE IF( tjj.GT.zero )
THEN
560 IF( xj.GT.tjj*bignum )
THEN
565 rec = ( tjj*bignum ) / xj
566 IF( cnorm( j ).GT.one )
THEN
571 rec = rec / cnorm( j )
573 CALL sscal( n, rec, x, 1 )
577 x( j ) = x( j ) / tjjs
599 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN
604 CALL sscal( n, rec, x, 1 )
607 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN
611 CALL sscal( n, half, x, 1 )
621 CALL saxpy( j-1, -x( j )*tscal, a( 1, j ), 1, x,
623 i = isamax( j-1, x, 1 )
632 CALL saxpy( n-j, -x( j )*tscal, a( j+1, j ), 1,
634 i = j + isamax( n-j, x( j+1 ), 1 )
644 DO 140 j = jfirst, jlast, jinc
651 rec = one / max( xmax, one )
652 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN
658 tjjs = a( j, j )*tscal
663 IF( tjj.GT.one )
THEN
667 rec = min( one, rec*tjj )
670 IF( rec.LT.one )
THEN
671 CALL sscal( n, rec, x, 1 )
678 IF( uscal.EQ.one )
THEN
684 sumj = sdot( j-1, a( 1, j ), 1, x, 1 )
685 ELSE IF( j.LT.n )
THEN
686 sumj = sdot( n-j, a( j+1, j ), 1, x( j+1 ), 1 )
694 sumj = sumj + ( a( i, j )*uscal )*x( i )
696 ELSE IF( j.LT.n )
THEN
698 sumj = sumj + ( a( i, j )*uscal )*x( i )
703 IF( uscal.EQ.tscal )
THEN
708 x( j ) = x( j ) - sumj
711 tjjs = a( j, j )*tscal
721 IF( tjj.GT.smlnum )
THEN
725 IF( tjj.LT.one )
THEN
726 IF( xj.GT.tjj*bignum )
THEN
731 CALL sscal( n, rec, x, 1 )
736 x( j ) = x( j ) / tjjs
737 ELSE IF( tjj.GT.zero )
THEN
741 IF( xj.GT.tjj*bignum )
THEN
745 rec = ( tjj*bignum ) / xj
746 CALL sscal( n, rec, x, 1 )
750 x( j ) = x( j ) / tjjs
769 x( j ) = x( j ) / tjjs - sumj
771 xmax = max( xmax, abs( x( j ) ) )
774 scale = scale / tscal
779 IF( tscal.NE.one )
THEN
780 CALL sscal( n, one / tscal, cnorm, 1 )