1 SUBROUTINE SGTTRS( TRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB, 2 $ INFO ) 3* 4* -- LAPACK routine (version 3.0) -- 5* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., 6* Courant Institute, Argonne National Lab, and Rice University 7* June 30, 1999 8* 9* .. Scalar Arguments .. 10 CHARACTER TRANS 11 INTEGER INFO, LDB, N, NRHS 12* .. 13* .. Array Arguments .. 14 INTEGER IPIV( * ) 15 REAL B( LDB, * ), D( * ), DL( * ), DU( * ), DU2( * ) 16* .. 17* 18* Purpose 19* ======= 20* 21* SGTTRS solves one of the systems of equations 22* A*X = B or A'*X = B, 23* with a tridiagonal matrix A using the LU factorization computed 24* by SGTTRF. 25* 26* Arguments 27* ========= 28* 29* TRANS (input) CHARACTER 30* Specifies the form of the system of equations. 31* = 'N': A * X = B (No transpose) 32* = 'T': A'* X = B (Transpose) 33* = 'C': A'* X = B (Conjugate transpose = Transpose) 34* 35* N (input) INTEGER 36* The order of the matrix A. 37* 38* NRHS (input) INTEGER 39* The number of right hand sides, i.e., the number of columns 40* of the matrix B. NRHS >= 0. 41* 42* DL (input) REAL array, dimension (N-1) 43* The (n-1) multipliers that define the matrix L from the 44* LU factorization of A. 45* 46* D (input) REAL array, dimension (N) 47* The n diagonal elements of the upper triangular matrix U from 48* the LU factorization of A. 49* 50* DU (input) REAL array, dimension (N-1) 51* The (n-1) elements of the first super-diagonal of U. 52* 53* DU2 (input) REAL array, dimension (N-2) 54* The (n-2) elements of the second super-diagonal of U. 55* 56* IPIV (input) INTEGER array, dimension (N) 57* The pivot indices; for 1 <= i <= n, row i of the matrix was 58* interchanged with row IPIV(i). IPIV(i) will always be either 59* i or i+1; IPIV(i) = i indicates a row interchange was not 60* required. 61* 62* B (input/output) REAL array, dimension (LDB,NRHS) 63* On entry, the matrix of right hand side vectors B. 64* On exit, B is overwritten by the solution vectors X. 65* 66* LDB (input) INTEGER 67* The leading dimension of the array B. LDB >= max(1,N). 68* 69* INFO (output) INTEGER 70* = 0: successful exit 71* < 0: if INFO = -i, the i-th argument had an illegal value 72* 73* ===================================================================== 74* 75* .. Local Scalars .. 76 LOGICAL NOTRAN 77 INTEGER ITRANS, J, JB, NB 78* .. 79* .. External Functions .. 80 INTEGER ILAENV 81 EXTERNAL ILAENV 82* .. 83* .. External Subroutines .. 84 EXTERNAL SGTTS2, XERBLA 85* .. 86* .. Intrinsic Functions .. 87 INTRINSIC MAX, MIN 88* .. 89* .. Executable Statements .. 90* 91 INFO = 0 92 NOTRAN = ( TRANS.EQ.'N' .OR. TRANS.EQ.'n' ) 93 IF( .NOT.NOTRAN .AND. .NOT.( TRANS.EQ.'T' .OR. TRANS.EQ. 94 $ 't' ) .AND. .NOT.( TRANS.EQ.'C' .OR. TRANS.EQ.'c' ) ) THEN 95 INFO = -1 96 ELSE IF( N.LT.0 ) THEN 97 INFO = -2 98 ELSE IF( NRHS.LT.0 ) THEN 99 INFO = -3 100 ELSE IF( LDB.LT.MAX( N, 1 ) ) THEN 101 INFO = -10 102 END IF 103 IF( INFO.NE.0 ) THEN 104 CALL XERBLA( 'SGTTRS', -INFO ) 105 RETURN 106 END IF 107* 108* Quick return if possible 109* 110 IF( N.EQ.0 .OR. NRHS.EQ.0 ) 111 $ RETURN 112* 113* Decode TRANS 114* 115 IF( NOTRAN ) THEN 116 ITRANS = 0 117 ELSE 118 ITRANS = 1 119 END IF 120* 121* Determine the number of right-hand sides to solve at a time. 122* 123 IF( NRHS.EQ.1 ) THEN 124 NB = 1 125 ELSE 126 NB = MAX( 1, ILAENV( 1, 'SGTTRS', TRANS, N, NRHS, -1, -1 ) ) 127 END IF 128* 129 IF( NB.GE.NRHS ) THEN 130 CALL SGTTS2( ITRANS, N, NRHS, DL, D, DU, DU2, IPIV, B, LDB ) 131 ELSE 132 DO 10 J = 1, NRHS, NB 133 JB = MIN( NRHS-J+1, NB ) 134 CALL SGTTS2( ITRANS, N, JB, DL, D, DU, DU2, IPIV, B( 1, J ), 135 $ LDB ) 136 10 CONTINUE 137 END IF 138* 139* End of SGTTRS 140* 141 END 142