344 SUBROUTINE sgesvx( FACT, TRANS, N, NRHS, A, LDA, AF, LDAF,
346 $ EQUED, R, C, B, LDB, X, LDX, RCOND, FERR, BERR,
347 $ WORK, IWORK, INFO )
354 CHARACTER EQUED, FACT, TRANS
355 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS
359 INTEGER IPIV( * ), IWORK( * )
360 REAL A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
361 $ BERR( * ), C( * ), FERR( * ), R( * ),
362 $ work( * ), x( ldx, * )
369 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
372 LOGICAL COLEQU, EQUIL, NOFACT, NOTRAN, ROWEQU
375 REAL AMAX, ANORM, BIGNUM, COLCND, RCMAX, RCMIN,
376 $ rowcnd, rpvgrw, smlnum
380 REAL SLAMCH, SLANGE, SLANTR
381 EXTERNAL LSAME, SLAMCH, SLANGE, SLANTR
394 nofact = lsame( fact,
'N' )
395 equil = lsame( fact,
'E' )
396 notran = lsame( trans,
'N' )
397 IF( nofact .OR. equil )
THEN
402 rowequ = lsame( equed,
'R' ) .OR. lsame( equed,
'B' )
403 colequ = lsame( equed,
'C' ) .OR. lsame( equed,
'B' )
404 smlnum = slamch(
'Safe minimum' )
405 bignum = one / smlnum
410 IF( .NOT.nofact .AND.
412 $ .NOT.lsame( fact,
'F' ) )
415 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
416 $ lsame( trans,
'C' ) )
THEN
418 ELSE IF( n.LT.0 )
THEN
420 ELSE IF( nrhs.LT.0 )
THEN
422 ELSE IF( lda.LT.max( 1, n ) )
THEN
424 ELSE IF( ldaf.LT.max( 1, n ) )
THEN
426 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
427 $ ( rowequ .OR. colequ .OR. lsame( equed,
'N' ) ) )
THEN
434 rcmin = min( rcmin, r( j ) )
435 rcmax = max( rcmax, r( j ) )
437 IF( rcmin.LE.zero )
THEN
439 ELSE IF( n.GT.0 )
THEN
440 rowcnd = max( rcmin, smlnum ) / min( rcmax, bignum )
445 IF( colequ .AND. info.EQ.0 )
THEN
449 rcmin = min( rcmin, c( j ) )
450 rcmax = max( rcmax, c( j ) )
452 IF( rcmin.LE.zero )
THEN
454 ELSE IF( n.GT.0 )
THEN
455 colcnd = max( rcmin, smlnum ) / min( rcmax, bignum )
461 IF( ldb.LT.max( 1, n ) )
THEN
463 ELSE IF( ldx.LT.max( 1, n ) )
THEN
470 CALL xerbla(
'SGESVX', -info )
478 CALL sgeequ( n, n, a, lda, r, c, rowcnd, colcnd, amax,
480 IF( infequ.EQ.0 )
THEN
484 CALL slaqge( n, n, a, lda, r, c, rowcnd, colcnd, amax,
486 rowequ = lsame( equed,
'R' ) .OR. lsame( equed,
'B' )
487 colequ = lsame( equed,
'C' ) .OR. lsame( equed,
'B' )
497 b( i, j ) = r( i )*b( i, j )
501 ELSE IF( colequ )
THEN
504 b( i, j ) = c( i )*b( i, j )
509 IF( nofact .OR. equil )
THEN
513 CALL slacpy(
'Full', n, n, a, lda, af, ldaf )
514 CALL sgetrf( n, n, af, ldaf, ipiv, info )
523 rpvgrw = slantr(
'M',
'U',
'N', info, info, af, ldaf,
525 IF( rpvgrw.EQ.zero )
THEN
528 rpvgrw = slange(
'M', n, info, a, lda, work ) / rpvgrw
544 anorm = slange( norm, n, n, a, lda, work )
545 rpvgrw = slantr(
'M',
'U',
'N', n, n, af, ldaf, work )
546 IF( rpvgrw.EQ.zero )
THEN
549 rpvgrw = slange(
'M', n, n, a, lda, work ) / rpvgrw
554 CALL sgecon( norm, n, af, ldaf, anorm, rcond, work, iwork,
559 CALL slacpy(
'Full', n, nrhs, b, ldb, x, ldx )
560 CALL sgetrs( trans, n, nrhs, af, ldaf, ipiv, x, ldx, info )
565 CALL sgerfs( trans, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x,
566 $ ldx, ferr, berr, work, iwork, info )
575 x( i, j ) = c( i )*x( i, j )
579 ferr( j ) = ferr( j ) / colcnd
582 ELSE IF( rowequ )
THEN
585 x( i, j ) = r( i )*x( i, j )
589 ferr( j ) = ferr( j ) / rowcnd
595 IF( rcond.LT.slamch(
'Epsilon' ) )
subroutine sgesvx(fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
SGESVX computes the solution to system of linear equations A * X = B for GE matrices