!----------------------------------------------------------------- ! ! Purpose ! ======= ! ! LA_PTSVX uses the factorization A = L*D*L**T to compute the solution ! to a real system of linear equations A*X = B, where A is either a ! symmetric positive definite or hermitian tridiagonal matrix, and X ! and B are either rectangular matrices or vectors. ! Error bounds on the solution and a condition estimate are also ! provided. ! ! Description ! =========== ! ! The following steps are performed: ! 1. If FACT = 'N', the matrix A is factored as A = L*D*L**T, where L ! is a unit lower bidiagonal matrix and D is diagonal. The ! factorization can also be regarded as having the form ! A = U**T*D*U. ! 2. If the leading i-by-i principal minor is not positive definite, ! 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. ! ! Arguments ! ========= ! ! SUBROUTINE LA_PTSVX(D, E, B, X, DF, EF, FACT, FERR, BERR, & ! RCOND, INFO) ! REAL(), INTENT(IN) :: D(:) ! (), INTENT(IN) :: E(:), ! (), INTENT(OUT) :: ! (), INTENT(INOUT), OPTIONAL :: DF(:), EF(:) ! CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: FACT ! REAL(), INTENT(OUT), OPTIONAL :: , RCOND ! INTEGER, INTENT(OUT), OPTIONAL :: INFO ! ::= REAL | COMPLEX ! ::= KIND(1.0) | KIND(1.0D0) ! ::= B(:,:) | B(:) ! ::= X(:,:) | X(:) ! ::= FERR(:), BERR(:) | FERR, BERR ! ! ===================== ! ! D (input) either REAL array, shape (:), SIZE(D) == n. ! The n diagonal elements of the tridiagonal matrix A. ! INFO = -1 if SIZE(D) < 0 ! ! E (input) either REAL or COMPLEX array, shape (:), SIZE(E) == SIZE(D)-1. ! The (n-1) subdiagonal elements of the tridiagonal matrix A. ! INFO = -2 if SIZE(E) /= SIZE(D) - 1. ! ! B (input) either REAL or COMPLEX rectangular array, ! shape either (:,:) or (:), size(B,1) or size(B) == size(D). ! The right hand side matrix/vector B. ! INFO = -3 if SIZE(B,1) /= SIZE(D) or SIZE(B,2) < 0 ! and if shape of B is (:,:) or ! if SIZE(B) /= SIZE(D) and if shape of B is (:) ! ! X (output) either REAL or COMPLEX rectangular array, shape either ! (:,:) or (:), size(B,1) or size(B) == size(D), and ! SIZE(X,2) == SIZE(B,2) if B and X are matrices. ! If INFO = 0 of INFO = n+1, the solution matrix X, n = SIZE(D). ! INFO = -4 if SIZE(X,1) /= SIZE(D) or SIZE(X,2) /= SIZE(B,2) ! and if shape of X is (:,:) or ! if SIZE(X) /= SIZE(D) and if shape of X is (:) ! ! DF Optional (input/output) either REAL array, shape (:), ! SIZE(DF) == SIZE(D). ! If FACT = 'F', then DF is an input argument and on entry ! contains the n diagonal elements of the diagonal matrix D ! from the L*D*L**T factorization of A. ! If FACT = 'N', then DF is an output argument and on exit ! contains the n diagonal elements of the diagonal matrix D ! from the L*D*L**T factorization of A. ! INFO = -5 if SIZE(DF) /= SIZE(D) or ! if both DF and EF together are not present. ! ! EF Optional (input/output) either REAL or COMPLEX array, shape (:), ! SIZE(EF) == SIZE(E). n = SIZE(D). ! If FACT = 'F', then EF is an input argument and on entry ! contains the (n-1) subdiagonal elements of the unit ! bidiagonal factor L from the L*D*L**T factorization of A. ! If FACT = 'N', then EF is an output argument and on exit ! contains the (n-1) subdiagonal elements of the unit ! bidiagonal factor L from the L*D*L**T factorization of A. ! INFO = -6 if SIZE(EF) /= SIZE(E) ! ! FACT Optional (input) CHARACTER*1 ! Specifies whether or not the factored form of A has been ! supplied on entry. ! = 'F': On entry, DF and EF contain the factored form of A. ! D, E, DF, and EF will not be modified. ! = 'N': The matrix A will be copied to DF and EF and ! factored. ! If FACT is not present FACT = 'N' is assumed. ! INFO = -7 if ( FACT /= 'F' nor 'N' ) or ! if FACT ='F' and DF and EF are not present. ! ! FERR Optional (output) either REAL array, shape (:) or REAL scalar. ! SIZE(FERR) == SIZE(B,2), if FERR is an array. ! The 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). ! INFO = -8 if SIZE(FERR) /= SIZE(B,2) and if FERR is a vector. ! ! BERR Optional (output) either REAL array, shape (:) or REAL scalar. ! 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). ! INFO = -9 if SIZE(BERR) /= SIZE(B,2) and if BERR is a vector. ! ! RCOND (output) REAL. ! 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. ! ! INFO Optional (output) INTEGER ! = 0: successful exit ! < 0: if INFO = -i, the i-th argument had an illegal value ! > 0: if INFO = i, and i is ! <= n: the leading minor of order i of A is ! not positive definite, so the factorization ! could not be completed, and the solution has not ! been computed. RCOND = 0 is returned. ! = n+1: U 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. ! If INFO is not present and an error occurs, then the program is ! terminated with an error message. ! n = SIZE(AB,2) is a rank of the matrix A. !-------------------------------------- .