SUBROUTINE ZHESVX( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIVOT, B, * LDB, X, LDX, RCOND, FERR, BERR, WORK, LDWORK, WORK2, INFO) CHARACTER * 1 FACT, UPLO DOUBLE COMPLEX A(LDA,*), AF(LDAF,*), B(LDB,*), X(LDX,*), WORK(*) INTEGER N, NRHS, LDA, LDAF, LDB, LDX, LDWORK, INFO INTEGER IPIVOT(*) DOUBLE PRECISION RCOND DOUBLE PRECISION FERR(*), BERR(*), WORK2(*) SUBROUTINE ZHESVX_64( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, IPIVOT, * B, LDB, X, LDX, RCOND, FERR, BERR, WORK, LDWORK, WORK2, INFO) CHARACTER * 1 FACT, UPLO DOUBLE COMPLEX A(LDA,*), AF(LDAF,*), B(LDB,*), X(LDX,*), WORK(*) INTEGER*8 N, NRHS, LDA, LDAF, LDB, LDX, LDWORK, INFO INTEGER*8 IPIVOT(*) DOUBLE PRECISION RCOND DOUBLE PRECISION FERR(*), BERR(*), WORK2(*)
SUBROUTINE HESVX( FACT, UPLO, [N], [NRHS], A, [LDA], AF, [LDAF], * IPIVOT, B, [LDB], X, [LDX], RCOND, FERR, BERR, [WORK], [LDWORK], * [WORK2], [INFO]) CHARACTER(LEN=1) :: FACT, UPLO COMPLEX(8), DIMENSION(:) :: WORK COMPLEX(8), DIMENSION(:,:) :: A, AF, B, X INTEGER :: N, NRHS, LDA, LDAF, LDB, LDX, LDWORK, INFO INTEGER, DIMENSION(:) :: IPIVOT REAL(8) :: RCOND REAL(8), DIMENSION(:) :: FERR, BERR, WORK2 SUBROUTINE HESVX_64( FACT, UPLO, [N], [NRHS], A, [LDA], AF, [LDAF], * IPIVOT, B, [LDB], X, [LDX], RCOND, FERR, BERR, [WORK], [LDWORK], * [WORK2], [INFO]) CHARACTER(LEN=1) :: FACT, UPLO COMPLEX(8), DIMENSION(:) :: WORK COMPLEX(8), DIMENSION(:,:) :: A, AF, B, X INTEGER(8) :: N, NRHS, LDA, LDAF, LDB, LDX, LDWORK, INFO INTEGER(8), DIMENSION(:) :: IPIVOT REAL(8) :: RCOND REAL(8), DIMENSION(:) :: FERR, BERR, WORK2
void zhesvx(char fact, char uplo, int n, int nrhs, doublecomplex *a, int lda, doublecomplex *af, int ldaf, int *ipivot, doublecomplex *b, int ldb, doublecomplex *x, int ldx, double *rcond, double *ferr, double *berr, int *info);
void zhesvx_64(char fact, char uplo, long n, long nrhs, doublecomplex *a, long lda, doublecomplex *af, long ldaf, long *ipivot, doublecomplex *b, long ldb, doublecomplex *x, long ldx, double *rcond, double *ferr, double *berr, long *info);
Error bounds on the solution and a condition estimate are also provided.
The following steps are performed:
1. If FACT = 'N', the diagonal pivoting method is used to factor A. The form of the factorization is
A = U * D * U**H, if UPLO = 'U', or A = L * D * L**H, if UPLO = 'L', where U (or L) is a product of permutation and unit upper (lower) triangular matrices, and D is Hermitian and block diagonal with 1-by-1 and 2-by-2 diagonal blocks.
2. If some D(i,i)=0, so that D is exactly singular, then the routine returns with INFO = i. Otherwise, the factored form of A is used to estimate the condition number of the matrix A. If the reciprocal of the condition number is less than machine precision, INFO = N+1 is returned as a warning, but the routine still goes on to solve for X and compute error bounds as described below.
3. The system of equations is solved for X using the factored form of A.
4. Iterative refinement is applied to improve the computed solution matrix and calculate error bounds and backward error estimates for it.
If FACT = 'N', then AF is an output argument and on exit returns the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**H or A = L*D*L**H.
If FACT = 'N', then IPIVOT is an output argument and on exit contains details of the interchanges and the block structure of D, as determined by CHETRF.
If LDWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LDWORK is issued by XERBLA.