001:       SUBROUTINE CTRTI2( UPLO, DIAG, N, A, LDA, INFO )
002: *
003: *  -- LAPACK routine (version 3.2) --
004: *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
005: *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
006: *     November 2006
007: *
008: *     .. Scalar Arguments ..
009:       CHARACTER          DIAG, UPLO
010:       INTEGER            INFO, LDA, N
011: *     ..
012: *     .. Array Arguments ..
013:       COMPLEX            A( LDA, * )
014: *     ..
015: *
016: *  Purpose
017: *  =======
018: *
019: *  CTRTI2 computes the inverse of a complex upper or lower triangular
020: *  matrix.
021: *
022: *  This is the Level 2 BLAS version of the algorithm.
023: *
024: *  Arguments
025: *  =========
026: *
027: *  UPLO    (input) CHARACTER*1
028: *          Specifies whether the matrix A is upper or lower triangular.
029: *          = 'U':  Upper triangular
030: *          = 'L':  Lower triangular
031: *
032: *  DIAG    (input) CHARACTER*1
033: *          Specifies whether or not the matrix A is unit triangular.
034: *          = 'N':  Non-unit triangular
035: *          = 'U':  Unit triangular
036: *
037: *  N       (input) INTEGER
038: *          The order of the matrix A.  N >= 0.
039: *
040: *  A       (input/output) COMPLEX array, dimension (LDA,N)
041: *          On entry, the triangular matrix A.  If UPLO = 'U', the
042: *          leading n by n upper triangular part of the array A contains
043: *          the upper triangular matrix, and the strictly lower
044: *          triangular part of A is not referenced.  If UPLO = 'L', the
045: *          leading n by n lower triangular part of the array A contains
046: *          the lower triangular matrix, and the strictly upper
047: *          triangular part of A is not referenced.  If DIAG = 'U', the
048: *          diagonal elements of A are also not referenced and are
049: *          assumed to be 1.
050: *
051: *          On exit, the (triangular) inverse of the original matrix, in
052: *          the same storage format.
053: *
054: *  LDA     (input) INTEGER
055: *          The leading dimension of the array A.  LDA >= max(1,N).
056: *
057: *  INFO    (output) INTEGER
058: *          = 0: successful exit
059: *          < 0: if INFO = -k, the k-th argument had an illegal value
060: *
061: *  =====================================================================
062: *
063: *     .. Parameters ..
064:       COMPLEX            ONE
065:       PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
066: *     ..
067: *     .. Local Scalars ..
068:       LOGICAL            NOUNIT, UPPER
069:       INTEGER            J
070:       COMPLEX            AJJ
071: *     ..
072: *     .. External Functions ..
073:       LOGICAL            LSAME
074:       EXTERNAL           LSAME
075: *     ..
076: *     .. External Subroutines ..
077:       EXTERNAL           CSCAL, CTRMV, XERBLA
078: *     ..
079: *     .. Intrinsic Functions ..
080:       INTRINSIC          MAX
081: *     ..
082: *     .. Executable Statements ..
083: *
084: *     Test the input parameters.
085: *
086:       INFO = 0
087:       UPPER = LSAME( UPLO, 'U' )
088:       NOUNIT = LSAME( DIAG, 'N' )
089:       IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
090:          INFO = -1
091:       ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
092:          INFO = -2
093:       ELSE IF( N.LT.0 ) THEN
094:          INFO = -3
095:       ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
096:          INFO = -5
097:       END IF
098:       IF( INFO.NE.0 ) THEN
099:          CALL XERBLA( 'CTRTI2', -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 CTRMV( 'Upper', 'No transpose', DIAG, J-1, A, LDA,
118:      $                  A( 1, J ), 1 )
119:             CALL CSCAL( 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 CTRMV( 'Lower', 'No transpose', DIAG, N-J,
137:      $                     A( J+1, J+1 ), LDA, A( J+1, J ), 1 )
138:                CALL CSCAL( N-J, AJJ, A( J+1, J ), 1 )
139:             END IF
140:    20    CONTINUE
141:       END IF
142: *
143:       RETURN
144: *
145: *     End of CTRTI2
146: *
147:       END
148: