344 SUBROUTINE dgesvx( 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
356 DOUBLE PRECISION RCOND
359 INTEGER IPIV( * ), IWORK( * )
360 DOUBLE PRECISION A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
361 $ BERR( * ), C( * ), FERR( * ), R( * ),
362 $ work( * ), x( ldx, * )
368 DOUBLE PRECISION ZERO, ONE
369 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
372 LOGICAL COLEQU, EQUIL, NOFACT, NOTRAN, ROWEQU
375 DOUBLE PRECISION AMAX, ANORM, BIGNUM, COLCND, RCMAX, RCMIN,
376 $ rowcnd, rpvgrw, smlnum
380 DOUBLE PRECISION DLAMCH, DLANGE, DLANTR
381 EXTERNAL LSAME, DLAMCH, DLANGE, DLANTR
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 = dlamch(
'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(
'DGESVX', -info )
478 CALL dgeequ( n, n, a, lda, r, c, rowcnd, colcnd, amax,
480 IF( infequ.EQ.0 )
THEN
484 CALL dlaqge( 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 dlacpy(
'Full', n, n, a, lda, af, ldaf )
514 CALL dgetrf( n, n, af, ldaf, ipiv, info )
523 rpvgrw = dlantr(
'M',
'U',
'N', info, info, af, ldaf,
525 IF( rpvgrw.EQ.zero )
THEN
528 rpvgrw = dlange(
'M', n, info, a, lda, work ) / rpvgrw
544 anorm = dlange( norm, n, n, a, lda, work )
545 rpvgrw = dlantr(
'M',
'U',
'N', n, n, af, ldaf, work )
546 IF( rpvgrw.EQ.zero )
THEN
549 rpvgrw = dlange(
'M', n, n, a, lda, work ) / rpvgrw
554 CALL dgecon( norm, n, af, ldaf, anorm, rcond, work, iwork,
559 CALL dlacpy(
'Full', n, nrhs, b, ldb, x, ldx )
560 CALL dgetrs( trans, n, nrhs, af, ldaf, ipiv, x, ldx, info )
565 CALL dgerfs( 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
597 IF( rcond.LT.dlamch(
'Epsilon' ) )
subroutine dgesvx(fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
DGESVX computes the solution to system of linear equations A * X = B for GE matrices