366 SUBROUTINE dgbsvx( FACT, TRANS, N, KL, KU, NRHS, AB, LDAB, AFB,
367 $ LDAFB, IPIV, EQUED, R, C, B, LDB, X, LDX,
368 $ RCOND, FERR, BERR, WORK, IWORK, INFO )
375 CHARACTER EQUED, FACT, TRANS
376 INTEGER INFO, KL, KU, LDAB, LDAFB, LDB, LDX, N, NRHS
377 DOUBLE PRECISION RCOND
380 INTEGER IPIV( * ), IWORK( * )
381 DOUBLE PRECISION AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
382 $ berr( * ), c( * ), ferr( * ), r( * ),
383 $ work( * ), x( ldx, * )
389 DOUBLE PRECISION ZERO, ONE
390 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
393 LOGICAL COLEQU, EQUIL, NOFACT, , ROWEQU
395 INTEGER I, INFEQU, J, J1, J2
396 DOUBLE PRECISION AMAX, ANORM, BIGNUM, COLCND, RCMAX, RCMIN,
397 $ rowcnd, rpvgrw, smlnum
401 DOUBLE PRECISION DLAMCH, DLANGB, DLANTB
402 EXTERNAL lsame, dlamch, dlangb, dlantb
414 nofact = lsame( fact,
'N' )
415 equil = lsame( fact,
'E' )
416 notran = lsame( trans,
'N' )
417 IF( nofact .OR. equil )
THEN
422 rowequ = lsame( equed, 'r.OR.
' ) LSAME( EQUED, 'b
' )
423 COLEQU = LSAME( EQUED, 'c.OR.
' ) LSAME( EQUED, 'b
' )
424 SMLNUM = DLAMCH( 'safe minimum
' )
425 BIGNUM = ONE / SMLNUM
430.NOT..AND..NOT..AND..NOT.
IF( NOFACT EQUIL LSAME( FACT, 'f
' ) )
433.NOT..AND..NOT.
ELSE IF( NOTRAN LSAME( TRANS, 't.AND..NOT.
' )
434 $ LSAME( TRANS, 'c
' ) ) THEN
436.LT.
ELSE IF( N0 ) THEN
438.LT.
ELSE IF( KL0 ) THEN
440.LT.
ELSE IF( KU0 ) THEN
442.LT.
ELSE IF( NRHS0 ) THEN
444.LT.
ELSE IF( LDABKL+KU+1 ) THEN
446.LT.
ELSE IF( LDAFB2*KL+KU+1 ) THEN
448 ELSE IF( LSAME( FACT, 'f.AND..NOT.
' )
449.OR..OR.
$ ( ROWEQU COLEQU LSAME( EQUED, 'n
' ) ) ) THEN
456 RCMIN = MIN( RCMIN, R( J ) )
457 RCMAX = MAX( RCMAX, R( J ) )
459.LE.
IF( RCMINZERO ) THEN
461.GT.
ELSE IF( N0 ) THEN
462 ROWCND = MAX( RCMIN, SMLNUM ) / MIN( RCMAX, BIGNUM )
467.AND..EQ.
IF( COLEQU INFO0 ) THEN
471 RCMIN = MIN( RCMIN, C( J ) )
472 RCMAX = MAX( RCMAX, C( J ) )
474.LE.
IF( RCMINZERO ) THEN
476.GT.
ELSE IF( N0 ) THEN
477 COLCND = MAX( RCMIN, SMLNUM ) / MIN( RCMAX, BIGNUM )
483.LT.
IF( LDBMAX( 1, N ) ) THEN
485.LT.
ELSE IF( LDXMAX( 1, N ) ) THEN
492 CALL XERBLA( 'dgbsvx', -INFO )
500 CALL DGBEQU( N, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND,
502.EQ.
IF( INFEQU0 ) THEN
506 CALL DLAQGB( N, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND,
508 ROWEQU = LSAME( EQUED, 'r.OR.
' ) LSAME( EQUED, 'b
' )
509 COLEQU = LSAME( EQUED, 'c.OR.
' ) LSAME( EQUED, 'b
' )
519 B( I, J ) = R( I )*B( I, J )
523 ELSE IF( COLEQU ) THEN
526 B( I, J ) = C( I )*B( I, J )
531.OR.
IF( NOFACT EQUIL ) THEN
538 CALL DCOPY( J2-J1+1, AB( KU+1-J+J1, J ), 1,
539 $ AFB( KL+KU+1-J+J1, J ), 1 )
542 CALL DGBTRF( N, N, KL, KU, AFB, LDAFB, IPIV, INFO )
553 DO 80 I = MAX( KU+2-J, 1 ), MIN( N+KU+1-J, KL+KU+1 )
554 ANORM = MAX( ANORM, ABS( AB( I, J ) ) )
557 RPVGRW = DLANTB( 'm
', 'u
', 'n
', INFO, MIN( INFO-1, KL+KU ),
558 $ AFB( MAX( 1, KL+KU+2-INFO ), 1 ), LDAFB,
560.EQ.
IF( RPVGRWZERO ) THEN
563 RPVGRW = ANORM / RPVGRW
579 ANORM = DLANGB( NORM, N, KL, KU, AB, LDAB, WORK )
580 RPVGRW = DLANTB( 'm
', 'u
', 'n
', N, KL+KU, AFB, LDAFB, WORK )
581.EQ.
IF( RPVGRWZERO ) THEN
584 RPVGRW = DLANGB( 'm
', N, KL, KU, AB, LDAB, WORK ) / RPVGRW
589 CALL DGBCON( NORM, N, KL, KU, AFB, LDAFB, IPIV, ANORM, RCOND,
590 $ WORK, IWORK, INFO )
594 CALL DLACPY( 'full
', N, NRHS, B, LDB, X, LDX )
595 CALL DGBTRS( TRANS, N, KL, KU, NRHS, AFB, LDAFB, IPIV, X, LDX,
601 CALL DGBRFS( TRANS, N, KL, KU, NRHS, AB, LDAB, AFB, LDAFB, IPIV,
602 $ B, LDB, X, LDX, FERR, BERR, WORK, IWORK, INFO )
611 X( I, J ) = C( I )*X( I, J )
615 FERR( J ) = FERR( J ) / COLCND
618 ELSE IF( ROWEQU ) THEN
621 X( I, J ) = R( I )*X( I, J )
625 FERR( J ) = FERR( J ) / ROWCND
631.LT.
IF( RCONDDLAMCH( 'epsilon
' ) )
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(srname, info)
XERBLA
subroutine dlaqgb(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, equed)
DLAQGB scales a general band matrix, using row and column scaling factors computed by sgbequ.
subroutine dgbtrs(trans, n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info)
DGBTRS
subroutine dgbequ(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, info)
DGBEQU
subroutine dgbtrf(m, n, kl, ku, ab, ldab, ipiv, info)
DGBTRF
subroutine dgbrfs(trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, b, ldb, x, ldx, ferr, berr, work, iwork, info)
DGBRFS
subroutine dgbcon(norm, n, kl, ku, ab, ldab, ipiv, anorm, rcond, work, iwork, info)
DGBCON
subroutine dgbsvx(fact, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
DGBSVX computes the solution to system of linear equations A * X = B for GB matrices
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY