1 SUBROUTINE DTRTI2( UPLO, DIAG, N, A, LDA, INFO ) 2* 3* -- LAPACK routine (version 3.0) -- 4* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., 5* Courant Institute, Argonne National Lab, and Rice University 6* February 29, 1992 7* 8* .. Scalar Arguments .. 9 CHARACTER DIAG, UPLO 10 INTEGER INFO, LDA, N 11* .. 12* .. Array Arguments .. 13 DOUBLE PRECISION A( LDA, * ) 14* .. 15* 16* Purpose 17* ======= 18* 19* DTRTI2 computes the inverse of a real upper or lower triangular 20* matrix. 21* 22* This is the Level 2 BLAS version of the algorithm. 23* 24* Arguments 25* ========= 26* 27* UPLO (input) CHARACTER*1 28* Specifies whether the matrix A is upper or lower triangular. 29* = 'U': Upper triangular 30* = 'L': Lower triangular 31* 32* DIAG (input) CHARACTER*1 33* Specifies whether or not the matrix A is unit triangular. 34* = 'N': Non-unit triangular 35* = 'U': Unit triangular 36* 37* N (input) INTEGER 38* The order of the matrix A. N >= 0. 39* 40* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) 41* On entry, the triangular matrix A. If UPLO = 'U', the 42* leading n by n upper triangular part of the array A contains 43* the upper triangular matrix, and the strictly lower 44* triangular part of A is not referenced. If UPLO = 'L', the 45* leading n by n lower triangular part of the array A contains 46* the lower triangular matrix, and the strictly upper 47* triangular part of A is not referenced. If DIAG = 'U', the 48* diagonal elements of A are also not referenced and are 49* assumed to be 1. 50* 51* On exit, the (triangular) inverse of the original matrix, in 52* the same storage format. 53* 54* LDA (input) INTEGER 55* The leading dimension of the array A. LDA >= max(1,N). 56* 57* INFO (output) INTEGER 58* = 0: successful exit 59* < 0: if INFO = -k, the k-th argument had an illegal value 60* 61* ===================================================================== 62* 63* .. Parameters .. 64 DOUBLE PRECISION ONE 65 PARAMETER ( ONE = 1.0D+0 ) 66* .. 67* .. Local Scalars .. 68 LOGICAL NOUNIT, UPPER 69 INTEGER J 70 DOUBLE PRECISION AJJ 71* .. 72* .. External Functions .. 73 LOGICAL LSAME 74 EXTERNAL LSAME 75* .. 76* .. External Subroutines .. 77 EXTERNAL DSCAL, DTRMV, XERBLA 78* .. 79* .. Intrinsic Functions .. 80 INTRINSIC MAX 81* .. 82* .. Executable Statements .. 83* 84* Test the input parameters. 85* 86 INFO = 0 87 UPPER = LSAME( UPLO, 'U' ) 88 NOUNIT = LSAME( DIAG, 'N' ) 89 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN 90 INFO = -1 91 ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN 92 INFO = -2 93 ELSE IF( N.LT.0 ) THEN 94 INFO = -3 95 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN 96 INFO = -5 97 END IF 98 IF( INFO.NE.0 ) THEN 99 CALL XERBLA( 'DTRTI2', -INFO ) 100 RETURN 101 END IF 102* 103 IF( UPPER ) THEN 104* 105* Compute inverse of upper triangular matrix. 106* 107 DO 10 J = 1, N 108 IF( NOUNIT ) THEN 109 A( J, J ) = ONE / A( J, J ) 110 AJJ = -A( J, J ) 111 ELSE 112 AJJ = -ONE 113 END IF 114* 115* Compute elements 1:j-1 of j-th column. 116* 117 CALL DTRMV( 'Upper', 'No transpose', DIAG, J-1, A, LDA, 118 $ A( 1, J ), 1 ) 119 CALL DSCAL( J-1, AJJ, A( 1, J ), 1 ) 120 10 CONTINUE 121 ELSE 122* 123* Compute inverse of lower triangular matrix. 124* 125 DO 20 J = N, 1, -1 126 IF( NOUNIT ) THEN 127 A( J, J ) = ONE / A( J, J ) 128 AJJ = -A( J, J ) 129 ELSE 130 AJJ = -ONE 131 END IF 132 IF( J.LT.N ) THEN 133* 134* Compute elements j+1:n of j-th column. 135* 136 CALL DTRMV( 'Lower', 'No transpose', DIAG, N-J, 137 $ A( J+1, J+1 ), LDA, A( J+1, J ), 1 ) 138 CALL DSCAL( N-J, AJJ, A( J+1, J ), 1 ) 139 END IF 140 20 CONTINUE 141 END IF 142* 143 RETURN 144* 145* End of DTRTI2 146* 147 END 148