SUBROUTINE ZSPSVX( FACT, UPLO, N, NRHS, A, AF, IPIVOT, B, LDB, X, * LDX, RCOND, FERR, BERR, WORK, WORK2, INFO) CHARACTER * 1 FACT, UPLO DOUBLE COMPLEX A(*), AF(*), B(LDB,*), X(LDX,*), WORK(*) INTEGER N, NRHS, LDB, LDX, INFO INTEGER IPIVOT(*) DOUBLE PRECISION RCOND DOUBLE PRECISION FERR(*), BERR(*), WORK2(*) SUBROUTINE ZSPSVX_64( FACT, UPLO, N, NRHS, A, AF, IPIVOT, B, LDB, X, * LDX, RCOND, FERR, BERR, WORK, WORK2, INFO) CHARACTER * 1 FACT, UPLO DOUBLE COMPLEX A(*), AF(*), B(LDB,*), X(LDX,*), WORK(*) INTEGER*8 N, NRHS, LDB, LDX, INFO INTEGER*8 IPIVOT(*) DOUBLE PRECISION RCOND DOUBLE PRECISION FERR(*), BERR(*), WORK2(*)
SUBROUTINE SPSVX( FACT, UPLO, N, NRHS, A, AF, IPIVOT, B, [LDB], X, * [LDX], RCOND, FERR, BERR, [WORK], [WORK2], [INFO]) CHARACTER(LEN=1) :: FACT, UPLO COMPLEX(8), DIMENSION(:) :: A, AF, WORK COMPLEX(8), DIMENSION(:,:) :: B, X INTEGER :: N, NRHS, LDB, LDX, INFO INTEGER, DIMENSION(:) :: IPIVOT REAL(8) :: RCOND REAL(8), DIMENSION(:) :: FERR, BERR, WORK2 SUBROUTINE SPSVX_64( FACT, UPLO, N, NRHS, A, AF, IPIVOT, B, [LDB], * X, [LDX], RCOND, FERR, BERR, [WORK], [WORK2], [INFO]) CHARACTER(LEN=1) :: FACT, UPLO COMPLEX(8), DIMENSION(:) :: A, AF, WORK COMPLEX(8), DIMENSION(:,:) :: B, X INTEGER(8) :: N, NRHS, LDB, LDX, INFO INTEGER(8), DIMENSION(:) :: IPIVOT REAL(8) :: RCOND REAL(8), DIMENSION(:) :: FERR, BERR, WORK2
void zspsvx(char fact, char uplo, int n, int nrhs, doublecomplex *a, doublecomplex *af, int *ipivot, doublecomplex *b, int ldb, doublecomplex *x, int ldx, double *rcond, double *ferr, double *berr, int *info);
void zspsvx_64(char fact, char uplo, long n, long nrhs, doublecomplex *a, doublecomplex *af, 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 as A = U * D * U**T, if UPLO = 'U', or
A = L * D * L**T, if UPLO = 'L',
where U (or L) is a product of permutation and unit upper (lower)
triangular matrices and D is symmetric 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 contains the block diagonal matrix D and the multipliers used to obtain the factor U or L from the factorization A = U*D*U**T or A = L*D*L**T as computed by CSPTRF, stored as a packed triangular matrix in the same storage format as A.
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 CSPTRF.