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
268 EXTERNAL lsame, idamax, dasum, ddot, dlamch
279 upper = lsame( uplo, 'u
' )
280 NOTRAN = LSAME( TRANS, 'n
' )
281 NOUNIT = LSAME( DIAG, 'n
' )
285.NOT..AND..NOT.
IF( UPPER LSAME( UPLO, 'l
' ) ) THEN
287.NOT..AND..NOT.
ELSE IF( NOTRAN LSAME( TRANS, 't.AND..NOT.
' )
288 $ LSAME( TRANS, 'c
' ) ) THEN
290.NOT..AND..NOT.
ELSE IF( NOUNIT LSAME( DIAG, 'u
' ) ) THEN
292.NOT.
ELSE IF( LSAME( NORMIN, 'y.AND..NOT.
' )
293 $ LSAME( NORMIN, 'n
' ) ) THEN
295.LT.
ELSE IF( N0 ) THEN
297.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
301 CALL XERBLA( 'dlatrs', -INFO )
312 SMLNUM = DLAMCH( 'safe minimum
' ) / DLAMCH( 'precision
' )
313 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.LE.
IF( TMAXBIGNUM ) THEN
346 TSCAL = ONE / ( SMLNUM*TMAX )
347 CALL DSCAL( N, TSCAL, CNORM, 1 )
353 J = IDAMAX( N, X, 1 )
370.NE.
IF( TSCALONE ) THEN
382 GROW = ONE / MAX( XBND, SMLNUM )
384 DO 30 J = JFIRST, JLAST, JINC
393 TJJ = ABS( A( J, J ) )
394 XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
395.GE.
IF( TJJ+CNORM( J )SMLNUM ) THEN
399 GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
414 GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
415 DO 40 J = JFIRST, JLAST, JINC
424 GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
443.NE.
IF( TSCALONE ) THEN
455 GROW = ONE / MAX( XBND, SMLNUM )
457 DO 60 J = JFIRST, JLAST, JINC
466 XJ = ONE + CNORM( J )
467 GROW = MIN( GROW, XBND / XJ )
471 TJJ = ABS( A( J, J ) )
473 $ XBND = XBND*( TJJ / XJ )
475 GROW = MIN( GROW, XBND )
482 GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
483 DO 70 J = JFIRST, JLAST, JINC
492 XJ = ONE + CNORM( J )
499.GT.
IF( ( GROW*TSCAL )SMLNUM ) THEN
504 CALL DTRSV( UPLO, TRANS, DIAG, N, A, LDA, X, 1 )
509.GT.
IF( XMAXBIGNUM ) THEN
514 SCALE = BIGNUM / XMAX
515 CALL DSCAL( N, SCALE, X, 1 )
523 DO 110 J = JFIRST, JLAST, JINC
529 TJJS = A( J, J )*TSCAL
536.GT.
IF( TJJSMLNUM ) THEN
540.LT.
IF( TJJONE ) THEN
541.GT.
IF( XJTJJ*BIGNUM ) THEN
546 CALL DSCAL( N, REC, X, 1 )
551 X( J ) = X( J ) / TJJS
553.GT.
ELSE IF( TJJZERO ) THEN
557.GT.
IF( XJTJJ*BIGNUM ) THEN
562 REC = ( TJJ*BIGNUM ) / XJ
563.GT.
IF( CNORM( J )ONE ) THEN
568 REC = REC / CNORM( J )
570 CALL DSCAL( N, REC, X, 1 )
574 X( J ) = X( J ) / TJJS
596.GT.
IF( CNORM( J )( BIGNUM-XMAX )*REC ) THEN
601 CALL DSCAL( N, REC, X, 1 )
604.GT.
ELSE IF( XJ*CNORM( J )( BIGNUM-XMAX ) ) THEN
608 CALL DSCAL( N, HALF, X, 1 )
618 CALL DAXPY( J-1, -X( J )*TSCAL, A( 1, J ), 1, X,
620 I = IDAMAX( J-1, X, 1 )
629 CALL DAXPY( N-J, -X( J )*TSCAL, A( J+1, J ), 1,
631 I = J + IDAMAX( N-J, X( J+1 ), 1 )
641 DO 160 J = JFIRST, JLAST, JINC
648 REC = ONE / MAX( XMAX, ONE )
649.GT.
IF( CNORM( J )( BIGNUM-XJ )*REC ) THEN
655 TJJS = A( J, J )*TSCAL
660.GT.
IF( TJJONE ) THEN
664 REC = MIN( ONE, REC*TJJ )
667.LT.
IF( RECONE ) THEN
668 CALL DSCAL( N, REC, X, 1 )
675.EQ.
IF( USCALONE ) THEN
681 SUMJ = DDOT( J-1, A( 1, J ), 1, X, 1 )
682.LT.
ELSE IF( JN ) THEN
683 SUMJ = DDOT( N-J, A( J+1, J ), 1, X( J+1 ), 1 )
691 SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I )
693.LT.
ELSE IF( JN ) THEN
695 SUMJ = SUMJ + ( A( I, J )*USCAL )*X( I )
700.EQ.
IF( USCALTSCAL ) THEN
705 X( J ) = X( J ) - SUMJ
708 TJJS = A( J, J )*TSCAL
718.GT.
IF( TJJSMLNUM ) THEN
722.LT.
IF( TJJONE ) THEN
723.GT.
IF( XJTJJ*BIGNUM ) THEN
728 CALL DSCAL( N, REC, X, 1 )
733 X( J ) = X( J ) / TJJS
734.GT.
ELSE IF( TJJZERO ) THEN
738.GT.
IF( XJTJJ*BIGNUM ) THEN
742 REC = ( TJJ*BIGNUM ) / XJ
743 CALL DSCAL( N, REC, X, 1 )
747 X( J ) = X( J ) / TJJS
766 X( J ) = X( J ) / TJJS - SUMJ
768 XMAX = MAX( XMAX, ABS( X( J ) ) )
771 SCALE = SCALE / TSCAL
776.NE.
IF( TSCALONE ) THEN
777 CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
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 dtrsv(uplo, trans, diag, n, a, lda, x, incx)
DTRSV