!----------------------------------------------------------------- ! ! Purpose ! ======= ! ! LA_GTSVX uses the LU factorization to compute the solution to a system ! of linear equations A * X = B or A**T * X = B, where A is a tridiagonal ! matrix of order N 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 LU decomposition is used to factor the matrix A ! as A = L * U, where L is a product of permutation and unit lower ! bidiagonal matrices and U is upper triangular with nonzeros in ! only the main diagonal and first two superdiagonals. ! 2. If some U(i,i)=0, so that U 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. ! ! Arguments ! ========= ! ! SUBROUTINE LA_GTSVX(DL, D, DU, B, X, DLF, DF, DUF, DU2, & ! IPIV, FACT, TRANS, FERR, BERR, RCOND, INFO) ! (), INTENT(IN) :: DL(:), D(:), DU(:), ! (), INTENT(OUT), OPTIONAL :: ! (), INTENT(INOUT), OPTIONAL :: DLF(:), DF(:), DUF(:), DU2(:) ! INTEGER, INTENT(INOUT), OPTIONAL :: IPIV(:) ! CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: FACT, TRANS ! REAL(), INTENT(OUT), OPTIONAL :: ! 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 ! ! ===================== ! ! DL (input) either REAL or COMPLEX array, shape (:), ! SIZE(DL) == SIZE(D)-1. The subdiagonal elements of A. ! INFO = -1 if SIZE(DL) /= SIZE(D) - 1. ! ! D (input) either REAL or COMPLEX array, shape (:). ! The diagonal elements of A. ! INFO = -2 if SIZE(D) < 0 ! ! DU (input) either REAL or COMPLEX array, shape (:), ! SIZE(DU) == SIZE(D)-1. The superdiagonal elements of A. ! INFO = -3 if SIZE(DU) /= 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 eithermatrix or vector B. ! INFO = -4 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 or INFO = n+1, the solution matrix X. n = SIZE(D) ! INFO = -5 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 (:) ! ! DLF Optional (input/output) either REAL or COMPLEX array, shape (:), ! SIZE(DLF) == SIZE(DL). If FACT = 'F', then DLF is an input ! argument and on entry contains the multipliers that define ! the matrix L from the LU factorization of A. ! If FACT = 'N', then DLF is an output argument and on exit ! contains the multipliers that define the matrix L from ! the LU factorization of A. ! INFO = -6 if SIZE(DLF) /= SIZE(DL) or ! if all DLF, DF, DUF and DU2 together are not present. ! ! DF Optional (input/output) either REAL or COMPLEX array, shape (:), ! SIZE(DF) == SIZE(D). ! If FACT = 'F', then DF is an input argument and on entry ! contains the diagonal elements of the upper triangular ! matrix U from the LU factorization of A. ! If FACT = 'N', then DF is an output argument and on exit ! contains the n diagonal elements of the upper triangular ! matrix U from the LU factorization of A. ! INFO = -7 if SIZE(DF) /= SIZE(D) ! ! DUF Optional (input/output) either REAL or COMPLEX array, shape (:), ! SIZE(DUF) == SIZE(DU). ! If FACT = 'F', then DUF is an input argument and on entry ! contains the elements of the first superdiagonal of U. ! If FACT = 'N', then DUF is an output argument and on exit ! contains the elements of the first superdiagonal of U. ! INFO = -8 if SIZE(DLF) /= SIZE(DL) ! ! DU2 Optional (input/output) either REAL or COMPLEX array, shape (:), ! SIZE(DU2) == SIZE(D)-2. ! If FACT = 'F', then DU2 is an input argument and on entry ! contains the elements of the second superdiagonal of U. ! If FACT = 'N', then DU2 is an output argument and on exit ! contains the elements of the second superdiagonal of U. ! INFO = -9 if SIZE(DU2) /= SIZE(D) - 2. ! ! IPIV Optional (input/output) INTEGER array, shape (:), SIZE(IPIV) == SIZE(D). ! If FACT = 'F', then IPIV is an input argument and on entry ! contains the pivot indices from the LU factorization of A. ! If FACT = 'N', then IPIV is an output argument and on exit ! contains the pivot indices from the LU factorization of A; ! row i of the matrix was interchanged with row IPIV(i). ! IPIV(i) will always be either i or i+1; IPIV(i) = i indicates ! a row interchange was not required. ! INFO = -10 if SIZE(IPIV) /= SIZE(D). ! ! FACT Optional (input) CHARACTER*1 ! Specifies whether or not the factored form of A has been ! supplied on entry. ! = 'F': DLF, DF, DUF, DU2, and IPIV contain the factored ! form of A; DL, D, DU, DLF, DF, DUF, DU2 and IPIV ! will not be modified. ! = 'N': The matrix will be copied to DLF, DF, and DUF ! and factored. ! If FACT is not present FACT = 'N' is assumed. ! INFO = -11 if ( FACT /= 'F' nor 'N' ) or ! if FACT ='F' and either DF or IPIV is not present. ! ! TRANS Optional (input) CHARACTER*1 ! Specifies the form of the system of equations: ! = 'N': A * X = B (No transpose) ! = 'T': A**T * X = B (Transpose) ! = 'C': A**H * X = B (Conjugate transpose = Transpose) ! If TRANS is not present TRANS = 'N' is assumed. ! INFO = -12 if TRANS /= 'N' nor 'T' nor 'C' ! ! ! FERR Optional (output) eithe REAL array, shape (:) or REAL scalar. ! SIZE(FERR) == SIZE(B,2), if FERR is an array, ! 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. ! INFO = -13 if SIZE(FERR) /= SIZE(B,2) and if FERR is a vector. ! ! BERR Optional (output) eithe REAL array, shape (:) or REAL scalar. ! SIZE(BERR) == SIZE(B,2), if FERR is an array, ! 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 = -14 if SIZE(BERR) /= SIZE(B,2) and if BERR is a vector. ! ! RCOND Optional (output) REAL ! 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. ! ! INFO Optional (output) INTEGER scalar. ! = 0: successful exit ! < 0: if INFO = -i, the i-th argument had an illegal value ! > 0: if INFO = i, and i is ! <= n: U(i,i) is exactly zero. The factorization ! has not been completed unless i = N, but the ! factor U is exactly singular, so the solution ! and error bounds could not be 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(D,1) is a rank of the matrix A. !-------------------------------------- .