236 SUBROUTINE dlatrs( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
244 CHARACTER DIAG, NORMIN, TRANS, UPLO
246 DOUBLE PRECISION SCALE
249 DOUBLE PRECISION A( lda, * ), CNORM( * ), X( * )
255 DOUBLE PRECISION ZERO, HALF, ONE
256 parameter( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0 )
259 LOGICAL NOTRAN, NOUNIT, UPPER
260 INTEGER I, IMAX, J, JFIRST, JINC, JLAST
261 DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
262 $ tmax, tscal, uscal, xbnd, xj, xmax
267 DOUBLE PRECISION DASUM, DDOT, DLAMCH, DLANGE
268 EXTERNAL lsame, idamax, dasum, ddot, dlamch, dlange
274 INTRINSIC abs, max, min
279 upper = lsame( uplo,
'U' )
280 notran = lsame( trans,
'N' )
281 nounit = lsame( diag,
'N' )
285 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN 287 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
288 $ lsame( trans,
'C' ) )
THEN 290 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN 292 ELSE IF( .NOT.lsame( normin,
'Y' ) .AND. .NOT.
293 $ lsame( normin,
'N' ) )
THEN 295 ELSE IF( n.LT.0 )
THEN 297 ELSE IF( lda.LT.max( 1, n ) )
THEN 301 CALL xerbla(
'DLATRS', -info )
313 smlnum = dlamch(
'Safe minimum' ) / dlamch(
'Precision' )
314 bignum = one / smlnum
316 IF( lsame( normin,
'N' ) )
THEN 325 cnorm( j ) = dasum( j-1, a( 1, j ), 1 )
332 cnorm( j ) = dasum( n-j, a( j+1, j ), 1 )
341 imax = idamax( n, cnorm, 1 )
343 IF( tmax.LE.bignum )
THEN 350 IF( tmax.LE.dlamch(
'Overflow') )
THEN 352 tscal = one / ( smlnum*tmax )
353 CALL dscal( n, tscal, cnorm, 1 )
365 tmax = max( dlange(
'M', j-1, 1, a( 1, j ), 1, sumj ),
373 tmax = max( dlange(
'M', n-j, 1, a( j+1, j ), 1,
378 IF( tmax.LE.dlamch(
'Overflow') )
THEN 379 tscal = one / ( smlnum*tmax )
381 IF( cnorm( j ).LE.dlamch(
'Overflow') )
THEN 382 cnorm( j ) = cnorm( j )*tscal
389 cnorm( j ) = cnorm( j ) +
390 $ tscal * abs( a( i, j ) )
394 cnorm( j ) = cnorm( j ) +
395 $ tscal * abs( a( i, j ) )
403 CALL dtrsv( uplo, trans, diag, n, a, lda, x, 1 )
412 j = idamax( n, x, 1 )
429 IF( tscal.NE.one )
THEN 441 grow = one / max( xbnd, smlnum )
443 DO 30 j = jfirst, jlast, jinc
452 tjj = abs( a( j, j ) )
453 xbnd = min( xbnd, min( one, tjj )*grow )
454 IF( tjj+cnorm( j ).GE.smlnum )
THEN 458 grow = grow*( tjj / ( tjj+cnorm( j ) ) )
473 grow = min( one, one / max( xbnd, smlnum ) )
474 DO 40 j = jfirst, jlast, jinc
483 grow = grow*( one / ( one+cnorm( j ) ) )
502 IF( tscal.NE.one )
THEN 514 grow = one / max( xbnd, smlnum )
516 DO 60 j = jfirst, jlast, jinc
525 xj = one + cnorm( j )
526 grow = min( grow, xbnd / xj )
530 tjj = abs( a( j, j ) )
532 $ xbnd = xbnd*( tjj / xj )
534 grow = min( grow, xbnd )
541 grow = min( one, one / max( xbnd, smlnum ) )
542 DO 70 j = jfirst, jlast, jinc
551 xj = one + cnorm( j )
558 IF( ( grow*tscal ).GT.smlnum )
THEN 563 CALL dtrsv( uplo, trans, diag, n, a, lda, x, 1 )
568 IF( xmax.GT.bignum )
THEN 573 scale = bignum / xmax
574 CALL dscal( n, scale, x, 1 )
582 DO 110 j = jfirst, jlast, jinc
588 tjjs = a( j, j )*tscal
595 IF( tjj.GT.smlnum )
THEN 599 IF( tjj.LT.one )
THEN 600 IF( xj.GT.tjj*bignum )
THEN 605 CALL dscal( n, rec, x, 1 )
610 x( j ) = x( j ) / tjjs
612 ELSE IF( tjj.GT.zero )
THEN 616 IF( xj.GT.tjj*bignum )
THEN 621 rec = ( tjj*bignum ) / xj
622 IF( cnorm( j ).GT.one )
THEN 627 rec = rec / cnorm( j )
629 CALL dscal( n, rec, x, 1 )
633 x( j ) = x( j ) / tjjs
655 IF( cnorm( j ).GT.( bignum-xmax )*rec )
THEN 660 CALL dscal( n, rec, x, 1 )
663 ELSE IF( xj*cnorm( j ).GT.( bignum-xmax ) )
THEN 667 CALL dscal( n, half, x, 1 )
677 CALL daxpy( j-1, -x( j )*tscal, a( 1, j ), 1, x,
679 i = idamax( j-1, x, 1 )
688 CALL daxpy( n-j, -x( j )*tscal, a( j+1, j ), 1,
690 i = j + idamax( n-j, x( j+1 ), 1 )
700 DO 160 j = jfirst, jlast, jinc
707 rec = one / max( xmax, one )
708 IF( cnorm( j ).GT.( bignum-xj )*rec )
THEN 714 tjjs = a( j, j )*tscal
719 IF( tjj.GT.one )
THEN 723 rec = min( one, rec*tjj )
726 IF( rec.LT.one )
THEN 727 CALL dscal( n, rec, x, 1 )
734 IF( uscal.EQ.one )
THEN 740 sumj = ddot( j-1, a( 1, j ), 1, x, 1 )
741 ELSE IF( j.LT.n )
THEN 742 sumj = ddot( n-j, a( j+1, j ), 1, x( j+1 ), 1 )
750 sumj = sumj + ( a( i, j )*uscal )*x( i )
752 ELSE IF( j.LT.n )
THEN 754 sumj = sumj + ( a( i, j )*uscal )*x( i )
759 IF( uscal.EQ.tscal )
THEN 764 x( j ) = x( j ) - sumj
767 tjjs = a( j, j )*tscal
777 IF( tjj.GT.smlnum )
THEN 781 IF( tjj.LT.one )
THEN 782 IF( xj.GT.tjj*bignum )
THEN 787 CALL dscal( n, rec, x, 1 )
792 x( j ) = x( j ) / tjjs
793 ELSE IF( tjj.GT.zero )
THEN 797 IF( xj.GT.tjj*bignum )
THEN 801 rec = ( tjj*bignum ) / xj
802 CALL dscal( n, rec, x, 1 )
806 x( j ) = x( j ) / tjjs
825 x( j ) = x( j ) / tjjs - sumj
827 xmax = max( xmax, abs( x( j ) ) )
830 scale = scale / tscal
835 IF( tscal.NE.one )
THEN 836 CALL dscal( n, one / tscal, cnorm, 1 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlatrs(UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE, CNORM, INFO)
DLATRS solves a triangular system of equations with the scale factor set to prevent overflow...
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dtrsv(UPLO, TRANS, DIAG, N, A, LDA, X, INCX)
DTRSV