538 SUBROUTINE sgesvxx( FACT, TRANS, N, NRHS, A, LDA, AF, LDAF, IPIV,
539 $ EQUED, R, C, B, LDB, X, LDX, RCOND, RPVGRW,
540 $ BERR, N_ERR_BNDS, ERR_BNDS_NORM,
541 $ ERR_BNDS_COMP, NPARAMS, PARAMS, WORK, IWORK,
549 CHARACTER EQUED, FACT, TRANS
550 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS, NPARAMS,
555 INTEGER IPIV( * ), IWORK( * )
556 REAL A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
557 $ X( LDX , * ),WORK( * )
558 REAL R( * ), C( * ), PARAMS( * ), BERR( * ),
559 $ err_bnds_norm( nrhs, * ),
560 $ err_bnds_comp( nrhs, * )
567 PARAMETER ( ZERO = 0.0e+0, one
568 INTEGER , FINAL_CMP_ERR_I, BERR_I
569 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
570 INTEGER CMP_ERR_I, PIV_GROWTH_I
571 parameter( final_nrm_err_i = 1, final_cmp_err_i = 2,
573 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
574 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
578 LOGICAL COLEQU, EQUIL, NOFACT, NOTRAN, ROWEQU
580 REAL AMAX, BIGNUM, COLCND, RCMAX, RCMIN, ROWCND,
586 REAL SLAMCH, SLA_GERPVGRW
598 nofact = lsame( fact,
'N' )
599 equil = lsame( fact,
'E' )
600 notran = lsame( trans,
'N' )
601 smlnum = slamch(
'Safe minimum' )
602 bignum = one / smlnum
603 IF( nofact .OR. equil )
THEN
608 rowequ = lsame( equed,
'R' ) .OR. lsame( equed,
'B' )
609 colequ = lsame( equed,
'C' ) .OR. lsame( equed,
'B' )
620 IF( .NOT.nofact .AND. .NOT.equil .AND. .NOT.
621 $ lsame( fact,
'F' ) )
THEN
623 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
624 $ lsame( trans,
'C' ) )
THEN
626 ELSE IF( n.LT.0 )
THEN
628 ELSE IF( nrhs.LT.0 )
THEN
630 ELSE IF( lda.LT.
max( 1, n ) )
THEN
632 ELSE IF( ldaf.LT.
max( 1, n ) )
THEN
634 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
635 $ ( rowequ .OR. colequ .OR. lsame( equed,
'N' ) ) )
THEN
642 rcmin =
min( rcmin, r( j ) )
643 rcmax =
max( rcmax, r( j ) )
645 IF( rcmin.LE.zero )
THEN
647 ELSE IF( n.GT.0 )
THEN
648 rowcnd =
max( rcmin, smlnum ) /
min( rcmax, bignum )
653 IF( colequ .AND. info.EQ.0 )
THEN
657 rcmin =
min( rcmin, c( j ) )
658 rcmax =
max( rcmax, c( j ) )
660 IF( rcmin.LE.zero )
THEN
662 ELSE IF( n.GT.0 )
THEN
663 colcnd =
max( rcmin, smlnum ) /
min( rcmax, bignum )
669 IF( ldb.LT.
max( 1, n ) )
THEN
671 ELSE IF( ldx.LT.
max( 1, n ) )
THEN
678 CALL xerbla(
'SGESVXX', -info )
686 CALL sgeequb( n, n, a, lda, r, c, rowcnd, colcnd, amax,
688 IF( infequ.EQ.0 )
THEN
692 CALL slaqge( n, n, a, lda, r, c, rowcnd, colcnd, amax,
694 rowequ = lsame( equed,
'R' ) .OR. lsame( equed,
'B' )
695 colequ = lsame( equed, 'c.OR.
' ) LSAME( EQUED, 'b
' )
700.NOT.
IF ( ROWEQU ) THEN
705.NOT.
IF ( COLEQU ) THEN
715 IF( ROWEQU ) CALL SLASCL2( N, NRHS, R, B, LDB )
717 IF( COLEQU ) CALL SLASCL2( N, NRHS, C, B, LDB )
720.OR.
IF( NOFACT EQUIL ) THEN
724 CALL SLACPY( 'full
', N, N, A, LDA, AF, LDAF )
725 CALL SGETRF( N, N, AF, LDAF, IPIV, INFO )
735 RPVGRW = SLA_GERPVGRW( N, INFO, A, LDA, AF, LDAF )
742 RPVGRW = SLA_GERPVGRW( N, N, A, LDA, AF, LDAF )
746 CALL SLACPY( 'full
', N, NRHS, B, LDB, X, LDX )
747 CALL SGETRS( TRANS, N, NRHS, AF, LDAF, IPIV, X, LDX, INFO )
752 CALL SGERFSX( TRANS, EQUED, N, NRHS, A, LDA, AF, LDAF,
753 $ IPIV, R, C, B, LDB, X, LDX, RCOND, BERR,
754 $ N_ERR_BNDS, ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
755 $ WORK, IWORK, INFO )
759.AND.
IF ( COLEQU NOTRAN ) THEN
760 CALL SLASCL2 ( N, NRHS, C, X, LDX )
761.AND..NOT.
ELSE IF ( ROWEQU NOTRAN ) THEN
762 CALL SLASCL2 ( N, NRHS, R, X, LDX )
subroutine slaqge(m, n, a, lda, r, c, rowcnd, colcnd, amax, equed)
SLAQGE scales a general rectangular matrix, using row and column scaling factors computed by sgeequ.
subroutine sgerfsx(trans, equed, n, nrhs, a, lda, af, ldaf, ipiv, r, c, b, ldb, x, ldx, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork, info)
SGERFSX
subroutine sgesvxx(fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork, info)
SGESVXX computes the solution to system of linear equations A * X = B for GE matrices