!----------------------------------------------------------------- ! ! Purpose ! ======= ! ! LA_PBSVX uses the Cholesky factorization A = U**T*U or A = L*L**T ! to compute the solution to a system of linear equations ! A * X = B, ! where A is either a symmetric positive definite or hermitian band ! 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 = 'E', real 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 Cholesky decomposition is used to ! factor the matrix A (after equilibration if FACT = 'E') as ! A = U**T * U, if UPLO = 'U', or ! A = L * L**T, if UPLO = 'L', ! where U is an upper triangular band matrix, and L is a lower ! triangular band matrix. ! 3. 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. ! 4. The system of equations is solved for X using the factored form ! of A. ! 5. Iterative refinement is applied to improve the computed solution ! matrix and calculate error bounds and backward error estimates ! for it. ! 6. If equilibration was used, the matrix X is premultiplied by ! diag(S) so that it solves the original system before ! equilibration. ! ! Arguments ! ========= ! ! SUBROUTINE LA_PBSVX(AB, B, X, UPLO, AFB, FACT, EQUED, & ! S, FERR, BERR, RCOND, INFO) ! (), INTENT(INOUT) :: AB(:,:), ! (), INTENT(OUT) :: ! CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: UPLO ! (), INTENT(INOUT), OPTIONAL :: AFB(:,:) ! CHARACTER(LEN=1), INTENT(IN), OPTIONAL :: FACT ! CHARACTER(LEN=1), INTENT(INOUT), OPTIONAL :: EQUED ! REAL(), INTENT(INOUT), OPTIONAL :: S(:) ! 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 ! ! ===================== ! ! AB (input/output) either REAL or COMPLEX rectangular array, ! shape (:,:), SIZE(AB,1) == kd+1, SIZE(AB,2) == n. ! On entry, the upper or lower triangle of the symmetric band ! matrix A, stored in the first kd+1 rows of the array, except ! if FACT = 'F' and EQUED = 'Y', then A must contain the ! equilibrated matrix diag(S)*A*diag(S). The j-th column of A ! is stored in the j-th column of the array AB as follows: ! if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j; ! if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(N,j+kd). ! See below for further details. ! On exit, if FACT = 'E' and EQUED = 'Y', A is overwritten by ! diag(S)*A*diag(S). ! INFO = -1 if SIZE(AB,1) or SIZE(AB,2) < 0 ! ! B (input/output) either REAL or COMPLEX rectangular array, ! shape either (:,:) or (:), size(B,1) or size(B) == size(A,2). ! On entry, the right hand side matrix B. ! On exit, if EQUED = 'N', B is not modified; if EQUED = 'Y', ! B is overwritten by diag(S) * B. ! INFO = -2 if SIZE(B,1) /= SIZE(AB,2) or SIZE(B,2) < 0 ! and if shape of B is (:,:) or ! if SIZE(B) /= SIZE(AB,2) and if shape of B is (:) ! ! X (output) either REAL or COMPLEX rectangular array, ! shape either (:,:) or (:), size(X,1) or size(X) == size(A,2). ! If INFO = 0 or INFO = N+1, the solution matrix/vector X to ! the original system of equations. Note that if EQUED = 'Y', ! A and B are modified on exit, and the solution to the ! equilibrated system is inv(diag(S))*X. ! INFO = -3 if SIZE(X,1) /= SIZE(AB,2) or SIZE(X,2) /= SIZE(B,2) ! and if shape of X is (:,:) or ! if SIZE(X) /= SIZE(AB,2) and if shape of X is (:) ! ! UPLO Optional (input) CHARACTER*1 ! = 'U': Upper triangle of A is stored; ! = 'L': Lower triangle of A is stored. ! If UPLO is not present then UPLO = 'U' is assumed. ! INFO = -4 if UPLO /= 'U' nor 'L' ! ! ABF Optional (input/output) either REAL or COMPLEX square array, ! shape (:,:), SIZE(ABF,1) == SIZE(AB,1), SIZE(ABF,2) == SIZE(A,2). ! If FACT = 'F', then AFB is an input argument and on entry ! contains the triangular factor U or L from the Cholesky ! factorization A = U**T*U or A = L*L**T of the band matrix ! A, in the same storage format as A (see AB). If EQUED = 'Y', ! then AFB is the factored form of the equilibrated matrix A. ! If FACT = 'N', then AFB is an output argument and on exit ! returns the triangular factor U or L from the Cholesky ! factorization A = U**T*U or A = L*L**T. ! If FACT = 'E', then AFB is an output argument and on exit ! returns the triangular factor U or L from the Cholesky ! factorization A = U**T*U or A = L*L**T of the equilibrated ! matrix A (see the description of A for the form of the ! equilibrated matrix). ! INFO = -5 if SIZE(ABF,1) /= SIZE(AB,1) or SIZE(ABF,2) /= SIZE(AB,2) ! ! FACT Optional (input) 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, AFB contains the factored form of A. ! If EQUED = 'Y', the matrix A has been equilibrated ! with scaling factors given by S. AB and AFB will not ! be modified. ! = 'N': The matrix A will be copied to AFB and factored. ! = 'E': The matrix A will be equilibrated if necessary, then ! copied to AFB and factored. ! If FACT is not present FACT = 'N' is assumed. ! INFO = -6 if ( FACT /= 'F' nor 'N' nor 'E' ) or ! if FACT ='F' and ABF is not present. ! ! EQUED Optional (input/output) CHARACTER*1 ! Specifies the form of equilibration that was done. ! = 'N': No equilibration (always true if FACT = 'N'). ! = 'Y': Equilibration was done, 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. ! If FACT is not present EQUED = 'N' is assumed. ! INFO = -7 if EQUED /= 'N' nor 'Y' ! ! S Optional (input or output) REAL array, shape (:), ! SIZE(S) == SIZE(A,2). ! The scale factors for A; not accessed if EQUED = 'N'. 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. ! INFO = -8 if SIZE(S) /= SIZE(AB,2) or ! if S <= 0 and S in an input argument. ! ! FERR Optional (output) eithe REAL array, shape (:) or REAL scalar. ! If it is an array, SIZE(FERR) == SIZE(B,2). ! 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 = -9 if SIZE(FERR) /= SIZE(B,2) and if FERR is a vector. ! ! BERR Optional (output) eithe REAL array, shape (:) or REAL scalar. ! If it is an array, SIZE(BERR) == SIZE(B,2). ! 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 = -10 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 after equilibration (if done). 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. ! ! Further Details ! =============== ! ! The band storage scheme is illustrated by the following example, when ! N = 6, KD = 2, and UPLO = 'U': ! ! Two-dimensional storage of the Hermitian matrix A: ! ! a11 a12 a13 ! a22 a23 a24 ! a33 a34 a35 ! a44 a45 a46 ! a55 a56 ! (aij=conjg(aji)) a66 ! ! Band storage of the upper triangle of A: ! ! * * a13 a24 a35 a46 ! * a12 a23 a34 a45 a56 ! a11 a22 a33 a44 a55 a66 ! ! Similarly, if UPLO = 'L' the format of A is as follows: ! ! a11 a22 a33 a44 a55 a66 ! a21 a32 a43 a54 a65 * ! a31 a42 a53 a64 * * ! ! Array elements marked * are not used by the routine. !-------------------------------------- .