MODULE CPTSV_MODULE INTERFACE CPTSV MODULE PROCEDURE CPTSV_ORIGINAL MODULE PROCEDURE CPTSV_EXTENDED END INTERFACE CONTAINS SUBROUTINE CPTSV_ORIGINAL( N, NRHS, D, E, B, LDB, INFO ) ! ! -- LAPACK routine (version 3.0) -- ! Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., ! Courant Institute, Argonne National Lab, and Rice University ! February 25, 1997 ! ! .. Scalar Arguments .. INTEGER INFO, LDB, N, NRHS ! .. ! .. Array Arguments .. REAL D( * ) COMPLEX B( LDB, * ), E( * ) ! .. ! ! Purpose ! ======= ! ! CPTSV computes the solution to a complex system of linear equations ! A*X = B, where A is an N-by-N Hermitian positive definite tridiagonal ! matrix, and X and B are N-by-NRHS matrices. ! ! A is factored as A = L*D*L**H, and the factored form of A is then ! used to solve the system of equations. ! ! Arguments ! ========= ! ! N (input) INTEGER ! The order of the matrix A. N >= 0. ! ! NRHS (input) INTEGER ! The number of right hand sides, i.e., the number of columns ! of the matrix B. NRHS >= 0. ! ! D (input/output) REAL array, dimension (N) ! On entry, the n diagonal elements of the tridiagonal matrix ! A. On exit, the n diagonal elements of the diagonal matrix ! D from the factorization A = L*D*L**H. ! ! E (input/output) COMPLEX array, dimension (N-1) ! On entry, the (n-1) subdiagonal elements of the tridiagonal ! matrix A. On exit, the (n-1) subdiagonal elements of the ! unit bidiagonal factor L from the L*D*L**H factorization of ! A. E can also be regarded as the superdiagonal of the unit ! bidiagonal factor U from the U**H*D*U factorization of A. ! ! B (input/output) COMPLEX 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 (input) INTEGER ! The leading dimension of the array B. LDB >= max(1,N). ! ! INFO (output) INTEGER ! = 0: successful exit ! < 0: if INFO = -i, the i-th argument had an illegal value ! > 0: if INFO = i, the leading minor of order i is not ! positive definite, and the solution has not been ! computed. The factorization has not been completed ! unless i = N. ! ! ===================================================================== ! ! .. External Subroutines .. EXTERNAL CPTTRF, CPTTRS, XERBLA ! .. ! .. Intrinsic Functions .. INTRINSIC MAX ! .. ! .. Executable Statements .. ! ! Test the input parameters. ! INFO = 0 IF( N.LT.0 ) THEN INFO = -1 ELSE IF( NRHS.LT.0 ) THEN INFO = -2 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN INFO = -6 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'CPTSV ', -INFO ) RETURN END IF ! ! Compute the L*D*L' (or U'*D*U) factorization of A. ! CALL CPTTRF( N, D, E, INFO ) IF( INFO.EQ.0 ) THEN ! ! Solve the system A*X = B, overwriting B with X. ! CALL CPTTRS( 'Lower', N, NRHS, D, E, B, LDB, INFO ) END IF RETURN ! ! End of CPTSV_ORIGINAL ! END SUBROUTINE CPTSV_ORIGINAL SUBROUTINE CPTSV_EXTENDED( UPLO, N, NRHS, D, E, B, LDB, INFO ) ! ! -- LAPACK routine (version 3.0) -- ! Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., ! Courant Institute, Argonne National Lab, and Rice University ! February 25, 1997 ! ! .. Scalar Arguments .. CHARACTER UPLO INTEGER INFO, LDB, N, NRHS ! .. ! .. Array Arguments .. REAL D( * ) COMPLEX B( LDB, * ), E( * ) ! .. ! ! Purpose ! ======= ! ! CPTSV_EXTENDED computes the solution to a complex system of linear ! equations A*X = B, where A is an N-by-N Hermitian positive definite ! tridiagonal matrix, and X and B are N-by-NRHS matrices. ! ! The form of the factorization is ! A = L*D*L', if UPLO = 'L', or ! A = U'*D*U, if UPLO = 'U', ! where D is diagonal, L is a unit lower bidiagonal matrix, U is a unit ! upper bidiagonal matrix, and ' indicates conjugate transpose. ! ! CPTSV_EXTENDED differs from CPTSV_ORIGINAL through the addition of ! the UPLO parameter. ! ! Arguments ! ========= ! ! UPLO (input) CHARACTER ! Specifies whether the subdiagonal or the superdiagonal of the ! tridiagonal matrix A is stored and the form of the ! factorization. ! = 'L': E is the subdiagonal of A, form is A = L*D*L' ! = 'U': E is the superdiagonal of A, form is A = U'*D*U ! ! N (input) INTEGER ! The order of the matrix A. N >= 0. ! ! NRHS (input) INTEGER ! The number of right hand sides, i.e., the number of columns ! of the matrix B. NRHS >= 0. ! ! D (input/output) REAL array, dimension (N) ! On entry, the n diagonal elements of the tridiagonal matrix ! A. On exit, the n diagonal elements of the diagonal matrix ! D from the factorization A = L*D*L' or A = U'*D*U. ! ! E (input/output) COMPLEX array, dimension (N-1) ! On entry, if UPLO = 'L' or 'l', the (N-1) subdiagonal elements ! of the tridiagonal matrix A; if UPLO = 'U' or 'u', the (N-1) ! superdiagonal elements of A. ! ! On exit, if UPLO = 'L' or 'l', the (N-1) subdiagonal elements ! of the unit bidiagonal factor L from the factorization A = ! L*D*L'; if UPLO = 'U' or 'u', the (N-1) superdiagonal elements ! of the unit bidiagonal factor U from the factorization A = ! U'*D*U. ! ! B (input/output) COMPLEX 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 (input) INTEGER ! The leading dimension of the array B. LDB >= max(1,N). ! ! INFO (output) INTEGER ! = 0: successful exit ! < 0: if INFO = -i, the i-th argument had an illegal value ! > 0: if INFO = i, the leading minor of order i is not ! positive definite, and the solution has not been ! computed. The factorization has not been completed ! unless i = N. ! ! ===================================================================== ! ! .. External Functions .. LOGICAL LSAME EXTERNAL LSAME ! .. ! .. External Subroutines .. EXTERNAL CPTTRF, CPTTRS, XERBLA ! .. ! .. Intrinsic Functions .. INTRINSIC MAX ! .. ! .. Executable Statements .. ! ! Test the input parameters. ! INFO = 0 IF( .NOT.LSAME( UPLO, 'U' ) .AND. .NOT.LSAME( FACT, 'L' ) ) THEN INFO = -1 ELSE IF( N.LT.0 ) THEN INFO = -2 ELSE IF( NRHS.LT.0 ) THEN INFO = -3 ELSE IF( LDB.LT.MAX( 1, N ) ) THEN INFO = -7 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'CPTSV ', -INFO ) RETURN END IF ! ! Compute the L*D*L' (or U'*D*U) factorization of A. ! CALL CPTTRF( N, D, E, INFO ) IF( INFO.EQ.0 ) THEN ! ! Solve the system A*X = B or A'*X = B, overwriting B with X. ! CALL CPTTRS( UPLO, N, NRHS, D, E, B, LDB, INFO ) END IF RETURN ! ! End of CPTSV_EXTENDED ! END SUBROUTINE CPTSV_EXTENDED END MODULE CPTSV_MODULE