367 SUBROUTINE cgbsvx( FACT, TRANS, N, KL, KU, NRHS, AB, LDAB, AFB,
368 $ LDAFB, IPIV, EQUED, R, C, B, LDB, X, LDX,
369 $ RCOND, FERR, BERR, WORK, RWORK, INFO )
376 CHARACTER EQUED, FACT, TRANS
377 INTEGER INFO, KL, KU, LDAB, LDAFB, LDB, LDX, N, NRHS
382 REAL BERR( * ), C( * ), FERR( * ), R( * ),
384 COMPLEX AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
385 $ WORK( * ), X( LDX, * )
395 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
398 LOGICAL COLEQU, EQUIL, NOFACT, NOTRAN, ROWEQU
400 INTEGER I, INFEQU, J, J1, J2
401 REAL AMAX, ANORM, BIGNUM, COLCND, RCMAX, RCMIN,
402 $ rowcnd, rpvgrw, smlnum
406 REAL CLANGB, CLANTB, SLAMCH
407 EXTERNAL lsame, clangb, clantb, slamch
419 nofact = lsame( fact,
'N' )
420 equil = lsame( fact,
'E' )
421 notran = lsame( trans,
'N' )
422 IF( nofact .OR. equil )
THEN
427 rowequ = lsame( equed,
'R' ) .OR. lsame( equed,
'B' )
428 colequ = lsame( equed,
'C' ) .OR. lsame( equed,
'B' )
429 smlnum = slamch( 'safe minimum
' )
430 BIGNUM = ONE / SMLNUM
435.NOT..AND..NOT..AND..NOT.
IF( NOFACT EQUIL LSAME( FACT, 'f
' ) )
438.NOT..AND..NOT.
ELSE IF( NOTRAN LSAME( TRANS, 't.AND..NOT.
' )
439 $ LSAME( TRANS, 'c
' ) ) THEN
441.LT.
ELSE IF( N0 ) THEN
443.LT.
ELSE IF( KL0 ) THEN
445.LT.
ELSE IF( KU0 ) THEN
447.LT.
ELSE IF( NRHS0 ) THEN
449.LT.
ELSE IF( LDABKL+KU+1 ) THEN
451.LT.
ELSE IF( LDAFB2*KL+KU+1 ) THEN
453 ELSE IF( LSAME( FACT, 'f.AND..NOT.
' )
454.OR..OR.
$ ( ROWEQU COLEQU LSAME( EQUED, 'n
' ) ) ) THEN
461 RCMIN = MIN( RCMIN, R( J ) )
462 RCMAX = MAX( RCMAX, R( J ) )
464.LE.
IF( RCMINZERO ) THEN
466.GT.
ELSE IF( N0 ) THEN
467 ROWCND = MAX( RCMIN, SMLNUM ) / MIN( RCMAX, BIGNUM )
472.AND..EQ.
IF( COLEQU INFO0 ) THEN
476 RCMIN = MIN( RCMIN, C( J ) )
477 RCMAX = MAX( RCMAX, C( J ) )
479.LE.
IF( RCMINZERO ) THEN
481.GT.
ELSE IF( N0 ) THEN
482 COLCND = MAX( RCMIN, SMLNUM ) / MIN( RCMAX, BIGNUM )
488.LT.
IF( LDBMAX( 1, N ) ) THEN
490.LT.
ELSE IF( LDXMAX( 1, N ) ) THEN
497 CALL XERBLA( 'cgbsvx', -INFO )
505 CALL CGBEQU( N, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND,
507.EQ.
IF( INFEQU0 ) THEN
511 CALL CLAQGB( N, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND,
513 ROWEQU = LSAME( EQUED, 'r.OR.
' ) LSAME( EQUED, 'b
' )
514 COLEQU = LSAME( EQUED, 'c.OR.
' ) LSAME( EQUED, 'b
' )
524 B( I, J ) = R( I )*B( I, J )
528 ELSE IF( COLEQU ) THEN
531 B( I, J ) = C( I )*B( I, J )
536.OR.
IF( NOFACT EQUIL ) THEN
543 CALL CCOPY( J2-J1+1, AB( KU+1-J+J1, J ), 1,
544 $ AFB( KL+KU+1-J+J1, J ), 1 )
547 CALL CGBTRF( N, N, KL, KU, AFB, LDAFB, IPIV, INFO )
558 DO 80 I = MAX( KU+2-J, 1 ), MIN( N+KU+1-J, KL+KU+1 )
559 ANORM = MAX( ANORM, ABS( AB( I, J ) ) )
562 RPVGRW = CLANTB( 'm
', 'u
', 'n
', INFO, MIN( INFO-1, KL+KU ),
563 $ AFB( MAX( 1, KL+KU+2-INFO ), 1 ), LDAFB,
565.EQ.
IF( RPVGRWZERO ) THEN
568 RPVGRW = ANORM / RPVGRW
584 anorm = clangb( norm, n, kl, ku, ab, ldab, rwork )
585 rpvgrw = clantb(
'M',
'U',
'N', n, kl+ku, afb, ldafb, rwork )
586 IF( rpvgrw.EQ.zero )
THEN
589 rpvgrw = clangb(
'M', n, kl, ku, ab, ldab, rwork ) / rpvgrw
594 CALL cgbcon( norm, n, kl, ku, afb, ldafb, ipiv, anorm, rcond,
595 $ work, rwork, info )
599 CALL clacpy(
'Full', n, nrhs, b, ldb, x, ldx )
600 CALL cgbtrs( trans, n, kl, ku, nrhs, afb, ldafb, ipiv, x, ldx,
606 CALL cgbrfs( trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv,
607 $ b, ldb, x, ldx, ferr, berr, work, rwork, info )
616 x( i, j ) = c( i )*x( i, j )
620 ferr( j ) = ferr( j ) / colcnd
623 ELSE IF( rowequ )
THEN
626 x( i, j ) = r( i )*x( i, j )
630 ferr( j ) = ferr( j ) / rowcnd
636 IF( rcond.LT.slamch(
'Epsilon' ) )
subroutine claqgb(m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax, equed)
CLAQGB scales a general band matrix, using row and column scaling factors computed by sgbequ.
subroutine cgbrfs(trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CGBRFS
subroutine cgbsvx(fact, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, rwork, info)
CGBSVX computes the solution to system of linear equations A * X = B for GB matrices