Contents


NAME

     zsysvx - use the diagonal pivoting factorization to  compute
     the solution to a complex system of linear equations A * X =
     B,

SYNOPSIS

     SUBROUTINE ZSYSVX(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 ZSYSVX_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(*)

  F95 INTERFACE
     SUBROUTINE SYSVX(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 SYSVX_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

  C INTERFACE
     #include <sunperf.h>

     void zsysvx(char fact, char uplo, int  n,  int  nrhs,  doub-
               lecomplex  *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 zsysvx_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);

PURPOSE

     zsysvx uses the diagonal pivoting factorization  to  compute
     the solution to a complex system of linear equations A * X =
     B, where A is an N-by-N symmetric matrix 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.
        The form of the factorization is
           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  diago-
     nal 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.  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) The symmetric matrix A.  If UPLO = 'U', the  lead-
               ing N-by-N upper triangular part of A contains the
               upper triangular part of the  matrix  A,  and  the
               strictly  lower triangular part of A is not refer-
               enced.  If UPLO = 'L', the  leading  N-by-N  lower
               triangular part of A contains the lower triangular
               part of the matrix A, and the strictly upper  tri-
               angular part of A is not referenced.

     LDA (input)
               The leading dimension of  the  array  A.   LDA  >=
               max(1,N).
     AF (input or output)
               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**T or A = L*D*L**T as
               computed by ZSYTRF.

               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**T  or  A  =
               L*D*L**T.

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

     IPIVOT (input or output)
               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
               ZSYTRF.  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
               ZSYTRF.

     B (input) The N-by-NRHS right hand side matrix B.

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

     X (output)
               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)
               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)
               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)
               On exit, if INFO = 0, WORK(1) returns the  optimal
               LDWORK.

     LDWORK (input)
               The length of WORK.  LDWORK >= 2*N, and  for  best
               performance  LDWORK  >=  N*NB,  where  NB  is  the
               optimal blocksize for ZSYTRF.

               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.

     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.