240 SUBROUTINE dlatbs( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
241 $ SCALE, CNORM, INFO )
248 CHARACTER DIAG, NORMIN, TRANS, UPLO
249 INTEGER INFO, KD, LDAB, N
250 DOUBLE PRECISION SCALE
253 DOUBLE PRECISION AB( LDAB, * ), CNORM( * ), X( * )
259 DOUBLE PRECISION ZERO, HALF, ONE
260 parameter( zero = 0.0d+0, half = 0.5d+0, one = 1.0d+0 )
263 LOGICAL NOTRAN, NOUNIT, UPPER
264 INTEGER I, IMAX, J, JFIRST, JINC, JLAST, JLEN, MAIND
265 DOUBLE PRECISION BIGNUM, GROW, REC, SMLNUM, SUMJ, TJJ, TJJS,
266 $ tmax, tscal, uscal, xbnd, xj, xmax
271 DOUBLE PRECISION DASUM, , DLAMCH
272 EXTERNAL lsame, idamax
283 upper = lsame( uplo,
'U' )
284 notran = lsame( trans,
'N' )
285 nounit = lsame( diag,
'N' )
289 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
291 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
292 $ lsame( trans,
'C' ) )
THEN
294 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
296 ELSE IF( .NOT.lsame( normin, 'y.AND..NOT.
' )
297 $ LSAME( NORMIN, 'n
' ) ) THEN
299.LT.
ELSE IF( N0 ) THEN
301.LT.
ELSE IF( KD0 ) THEN
303.LT.
ELSE IF( LDABKD+1 ) THEN
307 CALL XERBLA( 'dlatbs', -INFO )
318 SMLNUM = DLAMCH( 'safe minimum
' ) / DLAMCH( 'precision
' )
319 BIGNUM = ONE / SMLNUM
322 IF( LSAME( NORMIN, 'n
' ) ) THEN
331 JLEN = MIN( KD, J-1 )
332 CNORM( J ) = DASUM( JLEN, AB( KD+1-JLEN, J ), 1 )
339 JLEN = MIN( KD, N-J )
341 CNORM( J ) = DASUM( JLEN, AB( 2, J ), 1 )
352 IMAX = IDAMAX( N, CNORM, 1 )
354.LE.
IF( TMAXBIGNUM ) THEN
357 TSCAL = ONE / ( SMLNUM*TMAX )
358 CALL DSCAL( N, TSCAL, CNORM, 1 )
364 J = IDAMAX( N, X, 1 )
383.NE.
IF( TSCALONE ) THEN
395 GROW = ONE / MAX( XBND, SMLNUM )
397 DO 30 J = JFIRST, JLAST, JINC
406 TJJ = ABS( AB( MAIND, J ) )
407 XBND = MIN( XBND, MIN( ONE, TJJ )*GROW )
408.GE.
IF( TJJ+CNORM( J )SMLNUM ) THEN
412 GROW = GROW*( TJJ / ( TJJ+CNORM( J ) ) )
427 GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
428 DO 40 J = JFIRST, JLAST, JINC
437 GROW = GROW*( ONE / ( ONE+CNORM( J ) ) )
458.NE.
IF( TSCALONE ) THEN
470 GROW = ONE / MAX( XBND, SMLNUM )
472 DO 60 J = JFIRST, JLAST, JINC
481 XJ = ONE + CNORM( J )
482 GROW = MIN( GROW, XBND / XJ )
486 TJJ = ABS( AB( MAIND, J ) )
488 $ XBND = XBND*( TJJ / XJ )
490 GROW = MIN( GROW, XBND )
497 GROW = MIN( ONE, ONE / MAX( XBND, SMLNUM ) )
498 DO 70 J = JFIRST, JLAST, JINC
507 XJ = ONE + CNORM( J )
514.GT.
IF( ( GROW*TSCAL )SMLNUM ) THEN
519 CALL DTBSV( UPLO, TRANS, DIAG, N, KD, AB, LDAB, X, 1 )
524.GT.
IF( XMAXBIGNUM ) THEN
529 SCALE = BIGNUM / XMAX
530 CALL DSCAL( N, SCALE, X, 1 )
538 DO 110 J = JFIRST, JLAST, JINC
544 TJJS = AB( MAIND, J )*TSCAL
551.GT.
IF( TJJSMLNUM ) THEN
555.LT.
IF( TJJONE ) THEN
556.GT.
IF( XJTJJ*BIGNUM ) THEN
561 CALL DSCAL( N, REC, X, 1 )
566 X( J ) = X( J ) / TJJS
568.GT.
ELSE IF( TJJZERO ) THEN
572.GT.
IF( XJTJJ*BIGNUM ) THEN
577 REC = ( TJJ*BIGNUM ) / XJ
578.GT.
IF( CNORM( J )ONE ) THEN
583 REC = REC / CNORM( J )
585 CALL DSCAL( N, REC, X, 1 )
589 X( J ) = X( J ) / TJJS
611.GT.
IF( CNORM( J )( BIGNUM-XMAX )*REC ) THEN
616 CALL DSCAL( N, REC, X, 1 )
619.GT.
ELSE IF( XJ*CNORM( J )( BIGNUM-XMAX ) ) THEN
623 CALL DSCAL( N, HALF, X, 1 )
634 JLEN = MIN( KD, J-1 )
635 CALL DAXPY( JLEN, -X( J )*TSCAL,
636 $ AB( KD+1-JLEN, J ), 1, X( J-JLEN ), 1 )
637 I = IDAMAX( J-1, X, 1 )
640.LT.
ELSE IF( JN ) THEN
646 JLEN = MIN( KD, N-J )
648 $ CALL DAXPY( JLEN, -X( J )*TSCAL, AB( 2, J ), 1,
650 I = J + IDAMAX( N-J, X( J+1 ), 1 )
659 DO 160 J = JFIRST, JLAST, JINC
666 REC = ONE / MAX( XMAX, ONE )
667.GT.
IF( CNORM( J )( BIGNUM-XJ )*REC ) THEN
673 TJJS = AB( MAIND, J )*TSCAL
678.GT.
IF( TJJONE ) THEN
682 REC = MIN( ONE, REC*TJJ )
685.LT.
IF( RECONE ) THEN
686 CALL DSCAL( N, REC, X, 1 )
693.EQ.
IF( USCALONE ) THEN
699 JLEN = MIN( KD, J-1 )
700 SUMJ = DDOT( JLEN, AB( KD+1-JLEN, J ), 1,
703 JLEN = MIN( KD, N-J )
705 $ SUMJ = DDOT( JLEN, AB( 2, J ), 1, X( J+1 ), 1 )
712 JLEN = MIN( KD, J-1 )
714 SUMJ = SUMJ + ( AB( KD+I-JLEN, J )*USCAL )*
718 JLEN = MIN( KD, N-J )
720 SUMJ = SUMJ + ( AB( I+1, J )*USCAL )*X( J+I )
725.EQ.
IF( USCALTSCAL ) THEN
730 X( J ) = X( J ) - SUMJ
736 TJJS = AB( MAIND, J )*TSCAL
743.GT.
IF( TJJSMLNUM ) THEN
747.LT.
IF( TJJONE ) THEN
748.GT.
IF( XJTJJ*BIGNUM ) THEN
753 CALL DSCAL( N, REC, X, 1 )
758 X( J ) = X( J ) / TJJS
759.GT.
ELSE IF( TJJZERO ) THEN
763.GT.
IF( XJTJJ*BIGNUM ) THEN
767 REC = ( TJJ*BIGNUM ) / XJ
768 CALL DSCAL( N, REC, X, 1 )
772 X( J ) = X( J ) / TJJS
791 X( J ) = X( J ) / TJJS - SUMJ
793 XMAX = MAX( XMAX, ABS( X( J ) ) )
796 SCALE = SCALE / TSCAL
801.NE.
IF( TSCALONE ) THEN
802 CALL DSCAL( N, ONE / TSCAL, CNORM, 1 )
subroutine dlatbs(uplo, trans, diag, normin, n, kd, ab, ldab, x, scale, cnorm, info)
DLATBS solves a triangular banded system of equations.
subroutine dtbsv(uplo, trans, diag, n, k, a, lda, x, incx)
DTBSV