Contents


NAME

     zhpsvx  -  use  the  diagonal  pivoting  factorization  A  =
     U*D*U**H  or  A = L*D*L**H to compute the solution to a com-
     plex system of linear equations A * X = B, where A is an  N-
     by-N  Hermitian  matrix  stored in packed format and X and B
     are N-by-NRHS matrices

SYNOPSIS

     SUBROUTINE ZHPSVX(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 ZHPSVX_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(*)

  F95 INTERFACE
     SUBROUTINE HPSVX(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 HPSVX_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

  C INTERFACE
     #include <sunperf.h>

     void zhpsvx(char fact, char uplo, int  n,  int  nrhs,  doub-
               lecomplex  *a,  doublecomplex  *af,  int  *ipivot,
               doublecomplex *b, int ldb, doublecomplex  *x,  int
               ldx,  double  *rcond,  double *ferr, double *berr,
               int *info);

     void zhpsvx_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);

PURPOSE

     zhpsvx uses the diagonal pivoting factorization A = U*D*U**H
     or  A = L*D*L**H to compute the solution to a complex system
     of linear equations A * X = B, where A is an  N-by-N  Hermi-
     tian  matrix  stored  in packed format and X and B are N-by-
     NRHS matrices.

     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**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  fac-
     tored form
        of A.

     4. Iterative refinement is applied to improve  the  computed
     solution
        matrix and calculate  error  bounds  and  backward  error
     estimates
        for it.

ARGUMENTS

     FACT (input)
               Specifies whether or not the factored  form  of  A
               has  been supplied on entry.  = 'F':  On entry, AF
               and IPIVOT contain the factored form of A.  AF and
               IPIVOT will not be modified.  = 'N':  The matrix A
               will be copied to AF and factored.

     UPLO (input)
               = 'U':  Upper triangle of A is stored;
               = 'L':  Lower triangle of A is stored.

     N (input) The number of linear equations, i.e., the order of
               the matrix A.  N >= 0.

     NRHS (input)
               The number of right hand sides, i.e.,  the  number
               of columns of the matrices B and X.  NRHS >= 0.

     A (input) COMPLEX*16 array, dimension (N*(N+1)/2)
               The upper  or  lower  triangle  of  the  Hermitian
               matrix  A,  packed  columnwise  in a linear array.
               The j-th column of A is stored in the array  A  as
               follows:  if UPLO = 'U', A(i + (j-1)*j/2) = A(i,j)
               for 1<=i<=j; if UPLO = 'L', A(i + (j-1)*(2*n-j)/2)
               =  A(i,j)  for  j<=i<=n.   See  below  for further
               details.

     AF (input or output) COMPLEX*16 array, dimension (N*(N+1)/2)
               If FACT = 'F', then AF is an input argument and on
               entry contains 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 as
               computed by CHPTRF, stored as a packed  triangular
               matrix in the same storage format as A.

               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**H  or  A  =
               L*D*L**H as computed by CHPTRF, stored as a packed
               triangular matrix in the same storage format as A.

     IPIVOT (input or output) INTEGER array, dimension (N)
               If FACT = 'F', then IPIVOT is  an  input  argument
               and  on entry contains details of the interchanges
               and the block structure of  D,  as  determined  by
               CHPTRF.  If IPIVOT(k) > 0, then rows and columns k
               and IPIVOT(k) were interchanged and  D(k,k)  is  a
               1-by-1   diagonal   block.   If  UPLO  =  'U'  and
               IPIVOT(k) = IPIVOT(k-1) < 0, then rows and columns
               k-1  and  -IPIVOT(k)  were  interchanged  and D(k-
               1:k,k-1:k) is a 2-by-2 diagonal block.  If UPLO  =
               'L' and IPIVOT(k) = IPIVOT(k+1) < 0, then rows and
               columns k+1 and -IPIVOT(k) were  interchanged  and
               D(k:k+1,k:k+1) is a 2-by-2 diagonal block.

               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
               CHPTRF.

     B (input) COMPLEX*16 array, dimension (LDB,NRHS)
               The N-by-NRHS right hand side matrix B.

     LDB (input)
               The leading dimension of  the  array  B.   LDB  >=
               max(1,N).

     X (output) COMPLEX*16 array, dimension (LDX,NRHS)
               If INFO = 0 or INFO = N+1, the N-by-NRHS  solution
               matrix X.

     LDX (input)
               The leading dimension of  the  array  X.   LDX  >=
               max(1,N).

     RCOND (output)
               The estimate of the reciprocal condition number of
               the  matrix  A.  If RCOND is less than the machine
               precision (in  particular,  if  RCOND  =  0),  the
               matrix  is  singular  to  working precision.  This
               condition is indicated by a return code of INFO  >
               0.

     FERR (output) DOUBLE PRECISION array, dimension (NRHS)
               The estimated forward error bound for  each  solu-
               tion  vector X(j) (the j-th column of the solution
               matrix  X).   If  XTRUE  is  the   true   solution
               corresponding  to  X(j),  FERR(j)  is an estimated
               upper bound for the magnitude of the largest  ele-
               ment in (X(j) - XTRUE) divided by the magnitude of
               the largest element in X(j).  The estimate  is  as
               reliable  as the estimate for RCOND, and is almost
               always a slight overestimate of the true error.

     BERR (output) DOUBLE PRECISION array, dimension (NRHS)
               The componentwise relative backward error of  each
               solution  vector X(j) (i.e., the smallest relative
               change in any element of A or B that makes X(j) an
               exact solution).

     WORK (workspace)
               COMPLEX*16 array, dimension(2*N)

     DOUBLE PRECISION array, WORK2 (workspace)
               dimension(N)

     INFO (output)
               = 0: successful exit
               < 0: if INFO = -i, the i-th argument had an  ille-
               gal value
               > 0:  if INFO = i, and i is
               <= N:  D(i,i) is exactly zero.  The  factorization
               has  been  completed  but  the factor D is exactly
               singular, so the solution and error  bounds  could
               not  be computed. RCOND = 0 is returned.  = N+1: D
               is nonsingular, but RCOND  is  less  than  machine
               precision,  meaning that the matrix is singular to
               working precision.  Nevertheless, the solution and
               error  bounds  are  computed  because  there are a
               number of situations where the  computed  solution
               can be more accurate than the value of RCOND would
               suggest.

FURTHER DETAILS

     The packed storage scheme is illustrated  by  the  following
     example when N = 4, UPLO = 'U':

     Two-dimensional storage of the Hermitian matrix A:

        a11 a12 a13 a14
            a22 a23 a24
                a33 a34     (aij = conjg(aji))
                    a44

     Packed storage of the upper triangle of A:

     A = [ a11, a12, a22, a13, a23, a33, a14, a24, a34, a44 ]