505 SUBROUTINE chesvxx( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV,
506 $ EQUED, S, B, LDB, X, LDX, RCOND, RPVGRW, BERR,
507 $ N_ERR_BNDS, ERR_BNDS_NORM, ERR_BNDS_COMP,
508 $ NPARAMS, PARAMS, WORK, RWORK, INFO )
515 CHARACTER EQUED, FACT, UPLO
516 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS, NPARAMS,
522 COMPLEX A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
523 $ WORK( * ), X( LDX, * )
524 REAL S( * ), PARAMS( * ), BERR( * ), RWORK( * ),
525 $ err_bnds_norm( nrhs, * ),
526 $ err_bnds_comp( nrhs, * )
533 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
534 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
535 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
536 INTEGER CMP_ERR_I, PIV_GROWTH_I
537 parameter( final_nrm_err_i = 1, final_cmp_err_i = 2,
539 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
540 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
544 LOGICAL EQUIL, NOFACT, RCEQU
546 REAL AMAX, BIGNUM, SMIN, SMAX, SCOND, SMLNUM
551 REAL SLAMCH, CLA_HERPVGRW
563 nofact = lsame( fact,
'N' )
564 equil = lsame( fact,
'E' )
565 smlnum = slamch(
'Safe minimum' )
566 bignum = one / smlnum
567 IF( nofact .OR. equil )
THEN
571 rcequ = lsame( equed,
'Y' )
582 IF( .NOT.nofact .AND. .NOT.equil .AND. .NOT.
583 $ lsame( fact,
'F' ) )
THEN
585 ELSE IF( .NOT.lsame( uplo,
'U' ) .AND.
586 $ .NOT.lsame( uplo,
'L' ) )
THEN
588 ELSE IF( n.LT.0 )
THEN
590 ELSE IF( nrhs.LT.0 )
THEN
592 ELSE IF( lda.LT.max( 1, n ) )
THEN
594 ELSE IF( ldaf.LT.max( 1, n ) )
THEN
596 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
597 $ ( rcequ .OR. lsame( equed,
'N' ) ) )
THEN
604 smin = min( smin, s( j ) )
605 smax = max( smax, s( j ) )
607 IF( smin.LE.zero )
THEN
609 ELSE IF( n.GT.0 )
THEN
610 scond = max( smin, smlnum ) / min( smax, bignum )
616 IF( ldb.LT.max( 1, n ) )
THEN
618 ELSE IF( ldx.LT.max( 1, n ) )
THEN
625 CALL xerbla(
'CHESVXX', -info )
633 CALL cheequb( uplo, n, a, lda, s, scond, amax, work, infequ )
634 IF( infequ.EQ.0 )
THEN
638 CALL claqhe( uplo, n, a, lda, s, scond, amax, equed )
639 rcequ = lsame( equed,
'Y' )
645 IF( rcequ )
CALL clascl2( n, nrhs, s, b, ldb )
647 IF( nofact .OR. equil )
THEN
651 CALL clacpy( uplo, n, n, a, lda, af, ldaf )
652 CALL chetrf( uplo, n, af, ldaf, ipiv, work, 5*max(1,n), info )
663 $ rpvgrw = cla_herpvgrw( uplo, n, info, a, lda, af, ldaf,
672 $ rpvgrw = cla_herpvgrw( uplo, n, info, a, lda, af, ldaf, ipiv,
677 CALL clacpy(
'Full', n, nrhs, b, ldb, x, ldx )
678 CALL chetrs( uplo, n, nrhs, af, ldaf, ipiv, x, ldx, info )
683 CALL cherfsx( uplo, equed, n, nrhs, a, lda, af, ldaf, ipiv,
684 $ s, b, ldb, x, ldx, rcond, berr, n_err_bnds, err_bnds_norm,
685 $ err_bnds_comp, nparams, params, work, rwork, info )
690 CALL clascl2 ( n, nrhs, s, x, ldx )
subroutine xerbla(srname, info)
subroutine cheequb(uplo, n, a, lda, s, scond, amax, work, info)
CHEEQUB
subroutine cherfsx(uplo, equed, n, nrhs, a, lda, af, ldaf, ipiv, s, b, ldb, x, ldx, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, rwork, info)
CHERFSX
subroutine chesvxx(fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, equed, s, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, rwork, info)
CHESVXX computes the solution to system of linear equations A * X = B for HE matrices
subroutine chetrf(uplo, n, a, lda, ipiv, work, lwork, info)
CHETRF
subroutine chetrs(uplo, n, nrhs, a, lda, ipiv, b, ldb, info)
CHETRS
real function cla_herpvgrw(uplo, n, info, a, lda, af, ldaf, ipiv, work)
CLA_HERPVGRW
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
real function slamch(cmach)
SLAMCH
subroutine claqhe(uplo, n, a, lda, s, scond, amax, equed)
CLAQHE scales a Hermitian matrix.
subroutine clascl2(m, n, d, x, ldx)
CLASCL2 performs diagonal scaling on a matrix.
logical function lsame(ca, cb)
LSAME