1*> \brief \b DTRTI2 computes the inverse of a triangular matrix (unblocked algorithm).
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download DTRTI2 + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dtrti2.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dtrti2.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dtrti2.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18*  Definition:
19*  ===========
20*
21*       SUBROUTINE DTRTI2( UPLO, DIAG, N, A, LDA, INFO )
22*
23*       .. Scalar Arguments ..
24*       CHARACTER          DIAG, UPLO
25*       INTEGER            INFO, LDA, N
26*       ..
27*       .. Array Arguments ..
28*       DOUBLE PRECISION   A( LDA, * )
29*       ..
30*
31*
32*> \par Purpose:
33*  =============
34*>
35*> \verbatim
36*>
37*> DTRTI2 computes the inverse of a real upper or lower triangular
38*> matrix.
39*>
40*> This is the Level 2 BLAS version of the algorithm.
41*> \endverbatim
42*
43*  Arguments:
44*  ==========
45*
46*> \param[in] UPLO
47*> \verbatim
48*>          UPLO is CHARACTER*1
49*>          Specifies whether the matrix A is upper or lower triangular.
50*>          = 'U':  Upper triangular
51*>          = 'L':  Lower triangular
52*> \endverbatim
53*>
54*> \param[in] DIAG
55*> \verbatim
56*>          DIAG is CHARACTER*1
57*>          Specifies whether or not the matrix A is unit triangular.
58*>          = 'N':  Non-unit triangular
59*>          = 'U':  Unit triangular
60*> \endverbatim
61*>
62*> \param[in] N
63*> \verbatim
64*>          N is INTEGER
65*>          The order of the matrix A.  N >= 0.
66*> \endverbatim
67*>
68*> \param[in,out] A
69*> \verbatim
70*>          A is DOUBLE PRECISION array, dimension (LDA,N)
71*>          On entry, the triangular matrix A.  If UPLO = 'U', the
72*>          leading n by n upper triangular part of the array A contains
73*>          the upper triangular matrix, and the strictly lower
74*>          triangular part of A is not referenced.  If UPLO = 'L', the
75*>          leading n by n lower triangular part of the array A contains
76*>          the lower triangular matrix, and the strictly upper
77*>          triangular part of A is not referenced.  If DIAG = 'U', the
78*>          diagonal elements of A are also not referenced and are
79*>          assumed to be 1.
80*>
81*>          On exit, the (triangular) inverse of the original matrix, in
82*>          the same storage format.
83*> \endverbatim
84*>
85*> \param[in] LDA
86*> \verbatim
87*>          LDA is INTEGER
88*>          The leading dimension of the array A.  LDA >= max(1,N).
89*> \endverbatim
90*>
91*> \param[out] INFO
92*> \verbatim
93*>          INFO is INTEGER
94*>          = 0: successful exit
95*>          < 0: if INFO = -k, the k-th argument had an illegal value
96*> \endverbatim
97*
98*  Authors:
99*  ========
100*
101*> \author Univ. of Tennessee
102*> \author Univ. of California Berkeley
103*> \author Univ. of Colorado Denver
104*> \author NAG Ltd.
105*
106*> \date September 2012
107*
108*> \ingroup doubleOTHERcomputational
109*
110*  =====================================================================
111      SUBROUTINE DTRTI2( UPLO, DIAG, N, A, LDA, INFO )
112*
113*  -- LAPACK computational routine (version 3.4.2) --
114*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
115*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
116*     September 2012
117*
118*     .. Scalar Arguments ..
119      CHARACTER          DIAG, UPLO
120      INTEGER            INFO, LDA, N
121*     ..
122*     .. Array Arguments ..
123      DOUBLE PRECISION   A( LDA, * )
124*     ..
125*
126*  =====================================================================
127*
128*     .. Parameters ..
129      DOUBLE PRECISION   ONE
130      PARAMETER          ( ONE = 1.0D+0 )
131*     ..
132*     .. Local Scalars ..
133      LOGICAL            NOUNIT, UPPER
134      INTEGER            J
135      DOUBLE PRECISION   AJJ
136*     ..
137*     .. External Functions ..
138      LOGICAL            LSAME
139      EXTERNAL           LSAME
140*     ..
141*     .. External Subroutines ..
142      EXTERNAL           DSCAL, DTRMV, XERBLA
143*     ..
144*     .. Intrinsic Functions ..
145      INTRINSIC          MAX
146*     ..
147*     .. Executable Statements ..
148*
149*     Test the input parameters.
150*
151      INFO = 0
152      UPPER = LSAME( UPLO, 'U' )
153      NOUNIT = LSAME( DIAG, 'N' )
154      IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
155         INFO = -1
156      ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
157         INFO = -2
158      ELSE IF( N.LT.0 ) THEN
159         INFO = -3
160      ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
161         INFO = -5
162      END IF
163      IF( INFO.NE.0 ) THEN
164         CALL XERBLA( 'DTRTI2', -INFO )
165         RETURN
166      END IF
167*
168      IF( UPPER ) THEN
169*
170*        Compute inverse of upper triangular matrix.
171*
172         DO 10 J = 1, N
173            IF( NOUNIT ) THEN
174               A( J, J ) = ONE / A( J, J )
175               AJJ = -A( J, J )
176            ELSE
177               AJJ = -ONE
178            END IF
179*
180*           Compute elements 1:j-1 of j-th column.
181*
182            CALL DTRMV( 'Upper', 'No transpose', DIAG, J-1, A, LDA,
183     $                  A( 1, J ), 1 )
184            CALL DSCAL( J-1, AJJ, A( 1, J ), 1 )
185   10    CONTINUE
186      ELSE
187*
188*        Compute inverse of lower triangular matrix.
189*
190         DO 20 J = N, 1, -1
191            IF( NOUNIT ) THEN
192               A( J, J ) = ONE / A( J, J )
193               AJJ = -A( J, J )
194            ELSE
195               AJJ = -ONE
196            END IF
197            IF( J.LT.N ) THEN
198*
199*              Compute elements j+1:n of j-th column.
200*
201               CALL DTRMV( 'Lower', 'No transpose', DIAG, N-J,
202     $                     A( J+1, J+1 ), LDA, A( J+1, J ), 1 )
203               CALL DSCAL( N-J, AJJ, A( J+1, J ), 1 )
204            END IF
205   20    CONTINUE
206      END IF
207*
208      RETURN
209*
210*     End of DTRTI2
211*
212      END
213