502 SUBROUTINE zhesvxx( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV,
503 $ EQUED, S, B, LDB, X, LDX, RCOND, RPVGRW, BERR,
504 $ N_ERR_BNDS, ERR_BNDS_NORM, ERR_BNDS_COMP,
505 $ NPARAMS, PARAMS, WORK, RWORK, INFO )
512 CHARACTER EQUED, FACT, UPLO
513 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS, NPARAMS,
515 DOUBLE PRECISION RCOND, RPVGRW
519 COMPLEX*16 A( lda, * ), AF( ldaf, * ), B( ldb, * ),
520 $ work( * ), x( ldx, * )
521 DOUBLE PRECISION S( * ), PARAMS( * ), BERR( * ), RWORK( * ),
522 $ err_bnds_norm( nrhs, * ),
523 $ err_bnds_comp( nrhs, * )
529 DOUBLE PRECISION ZERO, ONE
530 parameter( zero = 0.0d+0, one = 1.0d+0 )
531 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
532 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
533 INTEGER CMP_ERR_I, PIV_GROWTH_I
534 parameter( final_nrm_err_i = 1, final_cmp_err_i = 2,
536 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
537 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
541 LOGICAL EQUIL, NOFACT, RCEQU
543 DOUBLE PRECISION AMAX, BIGNUM, SMIN, SMAX, SCOND, SMLNUM
548 DOUBLE PRECISION DLAMCH, ZLA_HERPVGRW
560 nofact = lsame( fact,
'N' )
561 equil = lsame( fact,
'E' )
562 smlnum = dlamch(
'Safe minimum' )
563 bignum = one / smlnum
564 IF( nofact .OR. equil )
THEN 568 rcequ = lsame( equed,
'Y' )
579 IF( .NOT.nofact .AND. .NOT.equil .AND. .NOT.
580 $ lsame( fact,
'F' ) )
THEN 582 ELSE IF( .NOT.lsame( uplo,
'U' ) .AND.
583 $ .NOT.lsame( uplo,
'L' ) )
THEN 585 ELSE IF( n.LT.0 )
THEN 587 ELSE IF( nrhs.LT.0 )
THEN 589 ELSE IF( lda.LT.max( 1, n ) )
THEN 591 ELSE IF( ldaf.LT.max( 1, n ) )
THEN 593 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
594 $ ( rcequ .OR. lsame( equed,
'N' ) ) )
THEN 601 smin = min( smin, s( j ) )
602 smax = max( smax, s( j ) )
604 IF( smin.LE.zero )
THEN 606 ELSE IF( n.GT.0 )
THEN 607 scond = max( smin, smlnum ) / min( smax, bignum )
613 IF( ldb.LT.max( 1, n ) )
THEN 615 ELSE IF( ldx.LT.max( 1, n ) )
THEN 622 CALL xerbla(
'ZHESVXX', -info )
630 CALL zheequb( uplo, n, a, lda, s, scond, amax, work, infequ )
631 IF( infequ.EQ.0 )
THEN 635 CALL zlaqhe( uplo, n, a, lda, s, scond, amax, equed )
636 rcequ = lsame( equed,
'Y' )
642 IF( rcequ )
CALL zlascl2( n, nrhs, s, b, ldb )
644 IF( nofact .OR. equil )
THEN 648 CALL zlacpy( uplo, n, n, a, lda, af, ldaf )
649 CALL zhetrf( uplo, n, af, ldaf, ipiv, work, 5*max(1,n), info )
660 $ rpvgrw = zla_herpvgrw( uplo, n, info, a, lda, af, ldaf,
669 $ rpvgrw = zla_herpvgrw( uplo, n, info, a, lda, af, ldaf, ipiv,
674 CALL zlacpy(
'Full', n, nrhs, b, ldb, x, ldx )
675 CALL zhetrs( uplo, n, nrhs, af, ldaf, ipiv, x, ldx, info )
680 CALL zherfsx( uplo, equed, n, nrhs, a, lda, af, ldaf, ipiv,
681 $ s, b, ldb, x, ldx, rcond, berr, n_err_bnds, err_bnds_norm,
682 $ err_bnds_comp, nparams, params, work, rwork, info )
687 CALL zlascl2 ( n, nrhs, s, x, ldx )
logical function lsame(CA, CB)
LSAME
subroutine zlaqhe(UPLO, N, A, LDA, S, SCOND, AMAX, EQUED)
ZLAQHE scales a Hermitian matrix.
subroutine zheequb(UPLO, N, A, LDA, S, SCOND, AMAX, WORK, INFO)
ZHEEQUB
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zherfsx(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)
ZHERFSX
double precision function zla_herpvgrw(UPLO, N, INFO, A, LDA, AF, LDAF, IPIV, WORK)
ZLA_HERPVGRW
subroutine zhetrf(UPLO, N, A, LDA, IPIV, WORK, LWORK, INFO)
ZHETRF
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
double precision function dlamch(CMACH)
DLAMCH
subroutine zhesvxx(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)
ZHESVXX computes the solution to system of linear equations A * X = B for HE matrices ...
subroutine zhetrs(UPLO, N, NRHS, A, LDA, IPIV, B, LDB, INFO)
ZHETRS
subroutine zlascl2(M, N, D, X, LDX)
ZLASCL2 performs diagonal scaling on a matrix.