doubleSYsolve(3)

NAME
doubleSYsolve - double

SYNOPSIS

  Functions
subroutine dsysv (uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
DSYSV computes the solution to system of linear equations A * X = B for SY matrices
subroutine dsysv_aa (uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
DSYSV_AA computes the solution to system of linear equations A * X = B for SY matrices
subroutine dsysv_aa_2stage (uplo, n, nrhs, a, lda, tb, ltb, ipiv, ipiv2, b, ldb, work, lwork, info)
DSYSV_AA_2STAGE computes the solution to system of linear equations A * X = B for SY matrices
subroutine dsysv_rk (uplo, n, nrhs, a, lda, e, ipiv, b, ldb, work, lwork, info)
DSYSV_RK computes the solution to system of linear equations A * X = B for SY matrices
subroutine dsysv_rook (uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info)
DSYSV_ROOK computes the solution to system of linear equations A * X = B for SY matrices
subroutine dsysvx (fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, lwork, iwork, info)
DSYSVX computes the solution to system of linear equations A * X = B for SY matrices
subroutine dsysvxx (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, iwork, info)
DSYSVXX

Detailed Description

This is the group of double solve driver functions for SY matrices

Function Documentation

  subroutine dsysv (character uplo, integer n, integer nrhs, double precision, dimension( lda, * ) a, integer lda, integer, dimension( * ) ipiv, double precision, dimension( ldb, * ) b, integer ldb, double precision, dimension( * ) work, integer lwork, integer info)

DSYSV computes the solution to system of linear equations A * X = B for SY matrices

Purpose:

     DSYSV computes the solution to a real 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.
     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.  The factored form of A is then
     used to solve the system of equations A * X = B.

Parameters
    UPLO

              UPLO is CHARACTER*1
              = 'U':  Upper triangle of A is stored;
              = 'L':  Lower triangle of A is stored.

    N

              N is INTEGER
              The number of linear equations, i.e., the order of the
              matrix A.  N >= 0.

    NRHS

              NRHS is INTEGER
              The number of right hand sides, i.e., the number of columns
              of the matrix B.  NRHS >= 0.

    A

              A is DOUBLE PRECISION array, dimension (LDA,N)
              On entry, the symmetric matrix A.  If UPLO = 'U', the leading
              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 referenced.  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
              triangular part of A is not referenced.
              On exit, if INFO = 0, 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
              DSYTRF.

    LDA

              LDA is INTEGER
              The leading dimension of the array A.  LDA >= max(1,N).

    IPIV

              IPIV is INTEGER array, dimension (N)
              Details of the interchanges and the block structure of D, as
              determined by DSYTRF.  If IPIV(k) > 0, then rows and columns
              k and IPIV(k) were interchanged, and D(k,k) is a 1-by-1
              diagonal block.  If UPLO = 'U' and IPIV(k) = IPIV(k-1) < 0,
              then rows and columns k-1 and -IPIV(k) were interchanged and
              D(k-1:k,k-1:k) is a 2-by-2 diagonal block.  If UPLO = 'L' and
              IPIV(k) = IPIV(k+1) < 0, then rows and columns k+1 and
              -IPIV(k) were interchanged and D(k:k+1,k:k+1) is a 2-by-2
              diagonal block.

    B

              B is DOUBLE PRECISION array, dimension (LDB,NRHS)
              On entry, the N-by-NRHS right hand side matrix B.
              On exit, if INFO = 0, the N-by-NRHS solution matrix X.

    LDB

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

    WORK

              WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
              On exit, if INFO = 0, WORK(1) returns the optimal LWORK.

    LWORK

              LWORK is INTEGER
              The length of WORK.  LWORK >= 1, and for best performance
              LWORK >= max(1,N*NB), where NB is the optimal blocksize for
              DSYTRF.
              for LWORK < N, TRS will be done with Level BLAS 2
              for LWORK >= N, TRS will be done with Level BLAS 3
              If LWORK = -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 LWORK is issued by XERBLA.

    INFO

              INFO is INTEGER
              = 0: successful exit
              < 0: if INFO = -i, the i-th argument had an illegal value
              > 0: if INFO = i, D(i,i) is exactly zero.  The factorization
                   has been completed, but the block diagonal matrix D is
                   exactly singular, so the solution could not be computed.

Author
    Univ. of Tennessee

    Univ. of California Berkeley

    Univ. of Colorado Denver

    NAG Ltd.

Definition at line 169 of file dsysv.f.

  subroutine dsysv_aa (character uplo, integer n, integer nrhs, double precision, dimension( lda, * ) a, integer lda, integer, dimension( * ) ipiv, double precision, dimension( ldb, * ) b, integer ldb, double precision, dimension( * ) work, integer lwork, integer info)

DSYSV_AA computes the solution to system of linear equations A * X = B for SY matrices

Purpose:

     DSYSV computes the solution to a real 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.
     Aasen's algorithm is used to factor A as
        A = U**T * T * U,  if UPLO = 'U', or
        A = L * T * L**T,  if UPLO = 'L',
     where U (or L) is a product of permutation and unit upper (lower)
     triangular matrices, and T is symmetric tridiagonal. The factored
     form of A is then used to solve the system of equations A * X = B.

Parameters
    UPLO

              UPLO is CHARACTER*1
              = 'U':  Upper triangle of A is stored;
              = 'L':  Lower triangle of A is stored.

    N

              N is INTEGER
              The number of linear equations, i.e., the order of the
              matrix A.  N >= 0.

    NRHS

              NRHS is INTEGER
              The number of right hand sides, i.e., the number of columns
              of the matrix B.  NRHS >= 0.

    A

              A is DOUBLE PRECISION array, dimension (LDA,N)
              On entry, the symmetric matrix A.  If UPLO = 'U', the leading
              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 referenced.  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
              triangular part of A is not referenced.
              On exit, if INFO = 0, the tridiagonal matrix T and the
              multipliers used to obtain the factor U or L from the
              factorization A = U**T*T*U or A = L*T*L**T as computed by
              DSYTRF.

    LDA

              LDA is INTEGER
              The leading dimension of the array A.  LDA >= max(1,N).

    IPIV

              IPIV is INTEGER array, dimension (N)
              On exit, it contains the details of the interchanges, i.e.,
              the row and column k of A were interchanged with the
              row and column IPIV(k).

    B

              B is DOUBLE PRECISION array, dimension (LDB,NRHS)
              On entry, the N-by-NRHS right hand side matrix B.
              On exit, if INFO = 0, the N-by-NRHS solution matrix X.

    LDB

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

    WORK

              WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
              On exit, if INFO = 0, WORK(1) returns the optimal LWORK.

    LWORK

              LWORK is INTEGER
              The length of WORK.  LWORK >= MAX(1,2*N,3*N-2), and for
              the best performance, LWORK >= MAX(1,N*NB), where NB is
              the optimal blocksize for DSYTRF_AA.
              If LWORK = -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 LWORK is issued by XERBLA.

    INFO

              INFO is INTEGER
              = 0: successful exit
              < 0: if INFO = -i, the i-th argument had an illegal value
              > 0: if INFO = i, D(i,i) is exactly zero.  The factorization
                   has been completed, but the block diagonal matrix D is
                   exactly singular, so the solution could not be computed.

Author
    Univ. of Tennessee

    Univ. of California Berkeley

    Univ. of Colorado Denver

    NAG Ltd.

Definition at line 160 of file dsysv_aa.f.

  subroutine dsysv_aa_2stage (character uplo, integer n, integer nrhs, double precision, dimension( lda, * ) a, integer lda, double precision, dimension( * ) tb, integer ltb, integer, dimension( * ) ipiv, integer, dimension( * ) ipiv2, double precision, dimension( ldb, * ) b, integer ldb, double precision, dimension( * ) work, integer lwork, integer info)

DSYSV_AA_2STAGE computes the solution to system of linear equations A * X = B for SY matrices

Purpose:

     DSYSV_AA_2STAGE computes the solution to a real 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.
     Aasen's 2-stage algorithm is used to factor A as
        A = U**T * T * U,  if UPLO = 'U', or
        A = L * T * L**T,  if UPLO = 'L',
     where U (or L) is a product of permutation and unit upper (lower)
     triangular matrices, and T is symmetric and band. The matrix T is
     then LU-factored with partial pivoting. The factored form of A
     is then used to solve the system of equations A * X = B.
     This is the blocked version of the algorithm, calling Level 3 BLAS.

Parameters
    UPLO

              UPLO is CHARACTER*1
              = 'U':  Upper triangle of A is stored;
              = 'L':  Lower triangle of A is stored.

    N

              N is INTEGER
              The order of the matrix A.  N >= 0.

    NRHS

              NRHS is INTEGER
              The number of right hand sides, i.e., the number of columns
              of the matrix B.  NRHS >= 0.

    A

              A is DOUBLE PRECISION array, dimension (LDA,N)
              On entry, the symmetric matrix A.  If UPLO = 'U', the leading
              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 referenced.  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
              triangular part of A is not referenced.
              On exit, L is stored below (or above) the subdiaonal blocks,
              when UPLO  is 'L' (or 'U').

    LDA

              LDA is INTEGER
              The leading dimension of the array A.  LDA >= max(1,N).

    TB

              TB is DOUBLE PRECISION array, dimension (LTB)
              On exit, details of the LU factorization of the band matrix.

    LTB

              LTB is INTEGER
              The size of the array TB. LTB >= 4*N, internally
              used to select NB such that LTB >= (3*NB+1)*N.
              If LTB = -1, then a workspace query is assumed; the
              routine only calculates the optimal size of LTB,
              returns this value as the first entry of TB, and
              no error message related to LTB is issued by XERBLA.

    IPIV

              IPIV is INTEGER array, dimension (N)
              On exit, it contains the details of the interchanges, i.e.,
              the row and column k of A were interchanged with the
              row and column IPIV(k).

    IPIV2

              IPIV2 is INTEGER array, dimension (N)
              On exit, it contains the details of the interchanges, i.e.,
              the row and column k of T were interchanged with the
              row and column IPIV(k).

    B

              B is DOUBLE PRECISION array, dimension (LDB,NRHS)
              On entry, the right hand side matrix B.
              On exit, the solution matrix X.

    LDB

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

    WORK

              WORK is DOUBLE PRECISION workspace of size LWORK

    LWORK

              LWORK is INTEGER
              The size of WORK. LWORK >= N, internally used to select NB
              such that LWORK >= N*NB.
              If LWORK = -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 LWORK is issued by XERBLA.

    INFO

              INFO is INTEGER
              = 0:  successful exit
              < 0:  if INFO = -i, the i-th argument had an illegal value.
              > 0:  if INFO = i, band LU factorization failed on i-th column

Author
    Univ. of Tennessee

    Univ. of California Berkeley

    Univ. of Colorado Denver

    NAG Ltd.

Definition at line 185 of file dsysv_aa_2stage.f.

  subroutine dsysv_rk (character uplo, integer n, integer nrhs, double precision, dimension( lda, * ) a, integer lda, double precision, dimension( * ) e, integer, dimension( * ) ipiv, double precision, dimension( ldb, * ) b, integer ldb, double precision, dimension( * ) work, integer lwork, integer info)

DSYSV_RK computes the solution to system of linear equations A * X = B for SY matrices

Purpose:

     DSYSV_RK computes the solution to a real 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.
     The bounded Bunch-Kaufman (rook) diagonal pivoting method is used
     to factor A as
        A = P*U*D*(U**T)*(P**T),  if UPLO = 'U', or
        A = P*L*D*(L**T)*(P**T),  if UPLO = 'L',
     where U (or L) is unit upper (or lower) triangular matrix,
     U**T (or L**T) is the transpose of U (or L), P is a permutation
     matrix, P**T is the transpose of P, and D is symmetric and block
     diagonal with 1-by-1 and 2-by-2 diagonal blocks.
     DSYTRF_RK is called to compute the factorization of a real
     symmetric matrix.  The factored form of A is then used to solve
     the system of equations A * X = B by calling BLAS3 routine DSYTRS_3.

Parameters
    UPLO

              UPLO is CHARACTER*1
              Specifies whether the upper or lower triangular part of the
              symmetric matrix A is stored:
              = 'U':  Upper triangle of A is stored;
              = 'L':  Lower triangle of A is stored.

    N

              N is INTEGER
              The number of linear equations, i.e., the order of the
              matrix A.  N >= 0.

    NRHS

              NRHS is INTEGER
              The number of right hand sides, i.e., the number of columns
              of the matrix B.  NRHS >= 0.

    A

              A is DOUBLE PRECISION array, dimension (LDA,N)
              On entry, the symmetric matrix A.
                If UPLO = 'U': the leading 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
                referenced.
                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 triangular part of A is not
                referenced.
              On exit, if INFO = 0, diagonal of the block diagonal
              matrix D and factors U or L  as computed by DSYTRF_RK:
                a) ONLY diagonal elements of the symmetric block diagonal
                   matrix D on the diagonal of A, i.e. D(k,k) = A(k,k);
                   (superdiagonal (or subdiagonal) elements of D
                    are stored on exit in array E), and
                b) If UPLO = 'U': factor U in the superdiagonal part of A.
                   If UPLO = 'L': factor L in the subdiagonal part of A.
              For more info see the description of DSYTRF_RK routine.

    LDA

              LDA is INTEGER
              The leading dimension of the array A.  LDA >= max(1,N).

    E

              E is DOUBLE PRECISION array, dimension (N)
              On exit, contains the output computed by the factorization
              routine DSYTRF_RK, i.e. the superdiagonal (or subdiagonal)
              elements of the symmetric block diagonal matrix D
              with 1-by-1 or 2-by-2 diagonal blocks, where
              If UPLO = 'U': E(i) = D(i-1,i), i=2:N, E(1) is set to 0;
              If UPLO = 'L': E(i) = D(i+1,i), i=1:N-1, E(N) is set to 0.
              NOTE: For 1-by-1 diagonal block D(k), where
              1 <= k <= N, the element E(k) is set to 0 in both
              UPLO = 'U' or UPLO = 'L' cases.
              For more info see the description of DSYTRF_RK routine.

    IPIV

              IPIV is INTEGER array, dimension (N)
              Details of the interchanges and the block structure of D,
              as determined by DSYTRF_RK.
              For more info see the description of DSYTRF_RK routine.

    B

              B is DOUBLE PRECISION array, dimension (LDB,NRHS)
              On entry, the N-by-NRHS right hand side matrix B.
              On exit, if INFO = 0, the N-by-NRHS solution matrix X.

    LDB

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

    WORK

              WORK is DOUBLE PRECISION array, dimension ( MAX(1,LWORK) ).
              Work array used in the factorization stage.
              On exit, if INFO = 0, WORK(1) returns the optimal LWORK.

    LWORK

              LWORK is INTEGER
              The length of WORK.  LWORK >= 1. For best performance
              of factorization stage LWORK >= max(1,N*NB), where NB is
              the optimal blocksize for DSYTRF_RK.
              If LWORK = -1, then a workspace query is assumed;
              the routine only calculates the optimal size of the WORK
              array for factorization stage, returns this value as
              the first entry of the WORK array, and no error message
              related to LWORK is issued by XERBLA.

    INFO

              INFO is INTEGER
              = 0: successful exit
              < 0: If INFO = -k, the k-th argument had an illegal value
              > 0: If INFO = k, the matrix A is singular, because:
                     If UPLO = 'U': column k in the upper
                     triangular part of A contains all zeros.
                     If UPLO = 'L': column k in the lower
                     triangular part of A contains all zeros.
                   Therefore D(k,k) is exactly zero, and superdiagonal
                   elements of column k of U (or subdiagonal elements of
                   column k of L ) are all zeros. The factorization has
                   been completed, but the block diagonal matrix D is
                   exactly singular, and division by zero will occur if
                   it is used to solve a system of equations.
                   NOTE: INFO only stores the first occurrence of
                   a singularity, any subsequent occurrence of singularity
                   is not stored in INFO even though the factorization
                   always completes.

Author
    Univ. of Tennessee

    Univ. of California Berkeley

    Univ. of Colorado Denver

    NAG Ltd.

Contributors:

      December 2016,  Igor Kozachenko,
                      Computer Science Division,
                      University of California, Berkeley
      September 2007, Sven Hammarling, Nicholas J. Higham, Craig Lucas,
                      School of Mathematics,
                      University of Manchester

Definition at line 226 of file dsysv_rk.f.

  subroutine dsysv_rook (character uplo, integer n, integer nrhs, double precision, dimension( lda, * ) a, integer lda, integer, dimension( * ) ipiv, double precision, dimension( ldb, * ) b, integer ldb, double precision, dimension( * ) work, integer lwork, integer info)

DSYSV_ROOK computes the solution to system of linear equations A * X = B for SY matrices

Purpose:

     DSYSV_ROOK computes the solution to a real 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.
     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.
     DSYTRF_ROOK is called to compute the factorization of a real
     symmetric matrix A using the bounded Bunch-Kaufman ('rook') diagonal
     pivoting method.
     The factored form of A is then used to solve the system
     of equations A * X = B by calling DSYTRS_ROOK.

Parameters
    UPLO

              UPLO is CHARACTER*1
              = 'U':  Upper triangle of A is stored;
              = 'L':  Lower triangle of A is stored.

    N

              N is INTEGER
              The number of linear equations, i.e., the order of the
              matrix A.  N >= 0.

    NRHS

              NRHS is INTEGER
              The number of right hand sides, i.e., the number of columns
              of the matrix B.  NRHS >= 0.

    A

              A is DOUBLE PRECISION array, dimension (LDA,N)
              On entry, the symmetric matrix A.  If UPLO = 'U', the leading
              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 referenced.  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
              triangular part of A is not referenced.
              On exit, if INFO = 0, 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
              DSYTRF_ROOK.

    LDA

              LDA is INTEGER
              The leading dimension of the array A.  LDA >= max(1,N).

    IPIV

              IPIV is INTEGER array, dimension (N)
              Details of the interchanges and the block structure of D,
              as determined by DSYTRF_ROOK.
              If UPLO = 'U':
                   If IPIV(k) > 0, then rows and columns k and IPIV(k)
                   were interchanged and D(k,k) is a 1-by-1 diagonal block.
                   If IPIV(k) < 0 and IPIV(k-1) < 0, then rows and
                   columns k and -IPIV(k) were interchanged and rows and
                   columns k-1 and -IPIV(k-1) were inerchaged,
                   D(k-1:k,k-1:k) is a 2-by-2 diagonal block.
              If UPLO = 'L':
                   If IPIV(k) > 0, then rows and columns k and IPIV(k)
                   were interchanged and D(k,k) is a 1-by-1 diagonal block.
                   If IPIV(k) < 0 and IPIV(k+1) < 0, then rows and
                   columns k and -IPIV(k) were interchanged and rows and
                   columns k+1 and -IPIV(k+1) were inerchaged,
                   D(k:k+1,k:k+1) is a 2-by-2 diagonal block.

    B

              B is DOUBLE PRECISION array, dimension (LDB,NRHS)
              On entry, the N-by-NRHS right hand side matrix B.
              On exit, if INFO = 0, the N-by-NRHS solution matrix X.

    LDB

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

    WORK

              WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
              On exit, if INFO = 0, WORK(1) returns the optimal LWORK.

    LWORK

              LWORK is INTEGER
              The length of WORK.  LWORK >= 1, and for best performance
              LWORK >= max(1,N*NB), where NB is the optimal blocksize for
              DSYTRF_ROOK.
              TRS will be done with Level 2 BLAS
              If LWORK = -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 LWORK is issued by XERBLA.

    INFO

              INFO is INTEGER
              = 0: successful exit
              < 0: if INFO = -i, the i-th argument had an illegal value
              > 0: if INFO = i, D(i,i) is exactly zero.  The factorization
                   has been completed, but the block diagonal matrix D is
                   exactly singular, so the solution could not be computed.

Author
    Univ. of Tennessee

    Univ. of California Berkeley

    Univ. of Colorado Denver

    NAG Ltd.

Contributors:

       April 2012, Igor Kozachenko,
                      Computer Science Division,
                      University of California, Berkeley
      September 2007, Sven Hammarling, Nicholas J. Higham, Craig Lucas,
                      School of Mathematics,
                      University of Manchester

Definition at line 202 of file dsysv_rook.f.

  subroutine dsysvx (character fact, character uplo, integer n, integer nrhs, double precision, dimension( lda, * ) a, integer lda, double precision, dimension( ldaf, * ) af, integer ldaf, integer, dimension( * ) ipiv, double precision, dimension( ldb, * ) b, integer ldb, double precision, dimension( ldx, * ) x, integer ldx, double precision rcond, double precision, dimension( * ) ferr, double precision, dimension( * ) berr, double precision, dimension( * ) work, integer lwork, integer, dimension( * ) iwork, integer info)

DSYSVX computes the solution to system of linear equations A * X = B for SY matrices

Purpose:

     DSYSVX uses the diagonal pivoting factorization to compute the
     solution to a real 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.

Description:

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

Parameters
    FACT

              FACT is CHARACTER*1
              Specifies whether or not the factored form of A has been
              supplied on entry.
              = 'F':  On entry, AF and IPIV contain the factored form of
                      A.  AF and IPIV will not be modified.
              = 'N':  The matrix A will be copied to AF and factored.

    UPLO

              UPLO is CHARACTER*1
              = 'U':  Upper triangle of A is stored;
              = 'L':  Lower triangle of A is stored.

    N

              N is INTEGER
              The number of linear equations, i.e., the order of the
              matrix A.  N >= 0.

    NRHS

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

    A

              A is DOUBLE PRECISION array, dimension (LDA,N)
              The symmetric matrix A.  If UPLO = 'U', the leading 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 referenced.  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 triangular part of A is
              not referenced.

    LDA

              LDA is INTEGER
              The leading dimension of the array A.  LDA >= max(1,N).

    AF

              AF is DOUBLE PRECISION array, dimension (LDAF,N)
              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 DSYTRF.
              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

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

    IPIV

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

    B

              B is DOUBLE PRECISION array, dimension (LDB,NRHS)
              The N-by-NRHS right hand side matrix B.

    LDB

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

    X

              X is DOUBLE PRECISION array, dimension (LDX,NRHS)
              If INFO = 0 or INFO = N+1, the N-by-NRHS solution matrix X.

    LDX

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

    RCOND

              RCOND is DOUBLE PRECISION
              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

              FERR is DOUBLE PRECISION array, dimension (NRHS)
              The estimated forward error bound for each solution 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
              element 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

              BERR is 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

              WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
              On exit, if INFO = 0, WORK(1) returns the optimal LWORK.

    LWORK

              LWORK is INTEGER
              The length of WORK.  LWORK >= max(1,3*N), and for best
              performance, when FACT = 'N', LWORK >= max(1,3*N,N*NB), where
              NB is the optimal blocksize for DSYTRF.
              If LWORK = -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 LWORK is issued by XERBLA.

    IWORK

              IWORK is INTEGER array, dimension (N)

    INFO

              INFO is INTEGER
              = 0: successful exit
              < 0: if INFO = -i, the i-th argument had an illegal 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.

Author
    Univ. of Tennessee

    Univ. of California Berkeley

    Univ. of Colorado Denver

    NAG Ltd.

Definition at line 281 of file dsysvx.f.

  subroutine dsysvxx (character fact, character uplo, integer n, integer nrhs, double precision, dimension( lda, * ) a, integer lda, double precision, dimension( ldaf, * ) af, integer ldaf, integer, dimension( * ) ipiv, character equed, double precision, dimension( * ) s, double precision, dimension( ldb, * ) b, integer ldb, double precision, dimension( ldx, * ) x, integer ldx, double precision rcond, double precision rpvgrw, double precision, dimension( * ) berr, integer n_err_bnds, double precision, dimension( nrhs, * ) err_bnds_norm, double precision, dimension( nrhs, * ) err_bnds_comp, integer nparams, double precision, dimension( * ) params, double precision, dimension( * ) work, integer, dimension( * ) iwork, integer info)

DSYSVXX

Purpose:

        DSYSVXX uses the diagonal pivoting factorization to compute the
        solution to a double precision 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.
        If requested, both normwise and maximum componentwise error bounds
        are returned. DSYSVXX will return a solution with a tiny
        guaranteed error (O(eps) where eps is the working machine
        precision) unless the matrix is very ill-conditioned, in which
        case a warning is returned. Relevant condition numbers also are
        calculated and returned.
        DSYSVXX accepts user-provided factorizations and equilibration
        factors; see the definitions of the FACT and EQUED options.
        Solving with refinement and using a factorization from a previous
        DSYSVXX call will also produce a solution with either O(eps)
        errors or warnings, but we cannot make that claim for general
        user-provided factorizations and equilibration factors if they
        differ from what DSYSVXX would itself produce.

Description:

        The following steps are performed:
        1. If FACT = 'E', double precision scaling factors are computed to equilibrate
        the system:
          diag(S)*A*diag(S)     *inv(diag(S))*X = diag(S)*B
        Whether or not the system will be equilibrated depends on the
        scaling of the matrix A, but if equilibration is used, A is
        overwritten by diag(S)*A*diag(S) and B by diag(S)*B.
        2. If FACT = 'N' or 'E', the LU decomposition is used to factor
        the matrix A (after equilibration if FACT = 'E') 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.
        3. 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 (see
        argument RCOND).  If the reciprocal of the condition number is
        less than machine precision, the routine still goes on to solve
        for X and compute error bounds as described below.
        4. The system of equations is solved for X using the factored form
        of A.
        5. By default (unless PARAMS(LA_LINRX_ITREF_I) is set to zero),
        the routine will use iterative refinement to try to get a small
        error and error bounds.  Refinement calculates the residual to at
        least twice the working precision.
        6. If equilibration was used, the matrix X is premultiplied by
        diag(R) so that it solves the original system before
        equilibration.

         Some optional parameters are bundled in the PARAMS array.  These
         settings determine how refinement is performed, but often the
         defaults are acceptable.  If the defaults are acceptable, users
         can pass NPARAMS = 0 which prevents the source code from accessing
         the PARAMS argument.

Parameters
    FACT

              FACT is CHARACTER*1
         Specifies whether or not the factored form of the matrix A is
         supplied on entry, and if not, whether the matrix A should be
         equilibrated before it is factored.
           = 'F':  On entry, AF and IPIV contain the factored form of A.
                   If EQUED is not 'N', the matrix A has been
                   equilibrated with scaling factors given by S.
                   A, AF, and IPIV are not modified.
           = 'N':  The matrix A will be copied to AF and factored.
           = 'E':  The matrix A will be equilibrated if necessary, then
                   copied to AF and factored.

    UPLO

              UPLO is CHARACTER*1
           = 'U':  Upper triangle of A is stored;
           = 'L':  Lower triangle of A is stored.

    N

              N is INTEGER
         The number of linear equations, i.e., the order of the
         matrix A.  N >= 0.

    NRHS

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

    A

              A is DOUBLE PRECISION array, dimension (LDA,N)
         The symmetric matrix A.  If UPLO = 'U', the leading 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 referenced.  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
         triangular part of A is not referenced.
         On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by
         diag(S)*A*diag(S).

    LDA

              LDA is INTEGER
         The leading dimension of the array A.  LDA >= max(1,N).

    AF

              AF is DOUBLE PRECISION array, dimension (LDAF,N)
         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 DSYTRF.
         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

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

    IPIV

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

    EQUED

              EQUED is CHARACTER*1
         Specifies the form of equilibration that was done.
           = 'N':  No equilibration (always true if FACT = 'N').
           = 'Y':  Both row and column equilibration, i.e., A has been
                   replaced by diag(S) * A * diag(S).
         EQUED is an input argument if FACT = 'F'; otherwise, it is an
         output argument.

    S

              S is DOUBLE PRECISION array, dimension (N)
         The scale factors for A.  If EQUED = 'Y', A is multiplied on
         the left and right by diag(S).  S is an input argument if FACT =
         'F'; otherwise, S is an output argument.  If FACT = 'F' and EQUED
         = 'Y', each element of S must be positive.  If S is output, each
         element of S is a power of the radix. If S is input, each element
         of S should be a power of the radix to ensure a reliable solution
         and error estimates. Scaling by powers of the radix does not cause
         rounding errors unless the result underflows or overflows.
         Rounding errors during scaling lead to refining with a matrix that
         is not equivalent to the input matrix, producing error estimates
         that may not be reliable.

    B

              B is DOUBLE PRECISION array, dimension (LDB,NRHS)
         On entry, the N-by-NRHS right hand side matrix B.
         On exit,
         if EQUED = 'N', B is not modified;
         if EQUED = 'Y', B is overwritten by diag(S)*B;

    LDB

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

    X

              X is DOUBLE PRECISION array, dimension (LDX,NRHS)
         If INFO = 0, the N-by-NRHS solution matrix X to the original
         system of equations.  Note that A and B are modified on exit if
         EQUED .ne. 'N', and the solution to the equilibrated system is
         inv(diag(S))*X.

    LDX

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

    RCOND

              RCOND is DOUBLE PRECISION
         Reciprocal scaled condition number.  This is an estimate of the
         reciprocal Skeel condition number of the matrix A after
         equilibration (if done).  If this is less than the machine
         precision (in particular, if it is zero), the matrix is singular
         to working precision.  Note that the error may still be small even
         if this number is very small and the matrix appears ill-
         conditioned.

    RPVGRW

              RPVGRW is DOUBLE PRECISION
         Reciprocal pivot growth.  On exit, this contains the reciprocal
         pivot growth factor norm(A)/norm(U). The 'max absolute element'
         norm is used.  If this is much less than 1, then the stability of
         the LU factorization of the (equilibrated) matrix A could be poor.
         This also means that the solution X, estimated condition numbers,
         and error bounds could be unreliable. If factorization fails with
         0<INFO<=N, then this contains the reciprocal pivot growth factor
         for the leading INFO columns of A.

    BERR

              BERR is DOUBLE PRECISION array, dimension (NRHS)
         Componentwise relative backward error.  This is 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).

    N_ERR_BNDS

              N_ERR_BNDS is INTEGER
         Number of error bounds to return for each right hand side
         and each type (normwise or componentwise).  See ERR_BNDS_NORM and
         ERR_BNDS_COMP below.

    ERR_BNDS_NORM

              ERR_BNDS_NORM is DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS)
         For each right-hand side, this array contains information about
         various error bounds and condition numbers corresponding to the
         normwise relative error, which is defined as follows:
         Normwise relative error in the ith solution vector:
                 max_j (abs(XTRUE(j,i) - X(j,i)))
                ------------------------------
                      max_j abs(X(j,i))
         The array is indexed by the type of error information as described
         below. There currently are up to three pieces of information
         returned.
         The first index in ERR_BNDS_NORM(i,:) corresponds to the ith
         right-hand side.
         The second index in ERR_BNDS_NORM(:,err) contains the following
         three fields:
         err = 1 'Trust/don't trust' boolean. Trust the answer if the
                  reciprocal condition number is less than the threshold
                  sqrt(n) * dlamch('Epsilon').
         err = 2 'Guaranteed' error bound: The estimated forward error,
                  almost certainly within a factor of 10 of the true error
                  so long as the next entry is greater than the threshold
                  sqrt(n) * dlamch('Epsilon'). This error bound should only
                  be trusted if the previous boolean is true.
         err = 3  Reciprocal condition number: Estimated normwise
                  reciprocal condition number.  Compared with the threshold
                  sqrt(n) * dlamch('Epsilon') to determine if the error
                  estimate is 'guaranteed'. These reciprocal condition
                  numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
                  appropriately scaled matrix Z.
                  Let Z = S*A, where S scales each row by a power of the
                  radix so all absolute row sums of Z are approximately 1.
         See Lapack Working Note 165 for further details and extra
         cautions.

    ERR_BNDS_COMP

              ERR_BNDS_COMP is DOUBLE PRECISION array, dimension (NRHS, N_ERR_BNDS)
         For each right-hand side, this array contains information about
         various error bounds and condition numbers corresponding to the
         componentwise relative error, which is defined as follows:
         Componentwise relative error in the ith solution vector:
                        abs(XTRUE(j,i) - X(j,i))
                 max_j ----------------------
                             abs(X(j,i))
         The array is indexed by the right-hand side i (on which the
         componentwise relative error depends), and the type of error
         information as described below. There currently are up to three
         pieces of information returned for each right-hand side. If
         componentwise accuracy is not requested (PARAMS(3) = 0.0), then
         ERR_BNDS_COMP is not accessed.  If N_ERR_BNDS < 3, then at most
         the first (:,N_ERR_BNDS) entries are returned.
         The first index in ERR_BNDS_COMP(i,:) corresponds to the ith
         right-hand side.
         The second index in ERR_BNDS_COMP(:,err) contains the following
         three fields:
         err = 1 'Trust/don't trust' boolean. Trust the answer if the
                  reciprocal condition number is less than the threshold
                  sqrt(n) * dlamch('Epsilon').
         err = 2 'Guaranteed' error bound: The estimated forward error,
                  almost certainly within a factor of 10 of the true error
                  so long as the next entry is greater than the threshold
                  sqrt(n) * dlamch('Epsilon'). This error bound should only
                  be trusted if the previous boolean is true.
         err = 3  Reciprocal condition number: Estimated componentwise
                  reciprocal condition number.  Compared with the threshold
                  sqrt(n) * dlamch('Epsilon') to determine if the error
                  estimate is 'guaranteed'. These reciprocal condition
                  numbers are 1 / (norm(Z^{-1},inf) * norm(Z,inf)) for some
                  appropriately scaled matrix Z.
                  Let Z = S*(A*diag(x)), where x is the solution for the
                  current right-hand side and S scales each row of
                  A*diag(x) by a power of the radix so all absolute row
                  sums of Z are approximately 1.
         See Lapack Working Note 165 for further details and extra
         cautions.

    NPARAMS

              NPARAMS is INTEGER
         Specifies the number of parameters set in PARAMS.  If <= 0, the
         PARAMS array is never referenced and default values are used.

    PARAMS

              PARAMS is DOUBLE PRECISION array, dimension (NPARAMS)
         Specifies algorithm parameters.  If an entry is < 0.0, then
         that entry will be filled with default value used for that
         parameter.  Only positions up to NPARAMS are accessed; defaults
         are used for higher-numbered parameters.
           PARAMS(LA_LINRX_ITREF_I = 1) : Whether to perform iterative
                refinement or not.
             Default: 1.0D+0
                = 0.0:  No refinement is performed, and no error bounds are
                        computed.
                = 1.0:  Use the extra-precise refinement algorithm.
                  (other values are reserved for future use)
           PARAMS(LA_LINRX_ITHRESH_I = 2) : Maximum number of residual
                computations allowed for refinement.
             Default: 10
             Aggressive: Set to 100 to permit convergence using approximate
                         factorizations or factorizations other than LU. If
                         the factorization uses a technique other than
                         Gaussian elimination, the guarantees in
                         err_bnds_norm and err_bnds_comp may no longer be
                         trustworthy.
           PARAMS(LA_LINRX_CWISE_I = 3) : Flag determining if the code
                will attempt to find a solution with small componentwise
                relative error in the double-precision algorithm.  Positive
                is true, 0.0 is false.
             Default: 1.0 (attempt componentwise convergence)

    WORK

              WORK is DOUBLE PRECISION array, dimension (4*N)

    IWORK

              IWORK is INTEGER array, dimension (N)

    INFO

              INFO is INTEGER
           = 0:  Successful exit. The solution to every right-hand side is
             guaranteed.
           < 0:  If INFO = -i, the i-th argument had an illegal value
           > 0 and <= N:  U(INFO,INFO) is exactly zero.  The factorization
             has been completed, but the factor U is exactly singular, so
             the solution and error bounds could not be computed. RCOND = 0
             is returned.
           = N+J: The solution corresponding to the Jth right-hand side is
             not guaranteed. The solutions corresponding to other right-
             hand sides K with K > J may not be guaranteed as well, but
             only the first such right-hand side is reported. If a small
             componentwise error is not requested (PARAMS(3) = 0.0) then
             the Jth right-hand side is the first with a normwise error
             bound that is not guaranteed (the smallest J such
             that ERR_BNDS_NORM(J,1) = 0.0). By default (PARAMS(3) = 1.0)
             the Jth right-hand side is the first with either a normwise or
             componentwise error bound that is not guaranteed (the smallest
             J such that either ERR_BNDS_NORM(J,1) = 0.0 or
             ERR_BNDS_COMP(J,1) = 0.0). See the definition of
             ERR_BNDS_NORM(:,1) and ERR_BNDS_COMP(:,1). To get information
             about all of the right-hand sides check ERR_BNDS_NORM or
             ERR_BNDS_COMP.

Author
    Univ. of Tennessee

    Univ. of California Berkeley

    Univ. of Colorado Denver

    NAG Ltd.

Definition at line 501 of file dsysvxx.f.

Author

Generated automatically by Doxygen for LAPACK from the source code.