00001 SUBROUTINE STRTRI( UPLO, DIAG, N, A, LDA, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER DIAG, UPLO
00010 INTEGER INFO, LDA, N
00011
00012
00013 REAL A( LDA, * )
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 REAL ONE, ZERO
00064 PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
00065
00066
00067 LOGICAL NOUNIT, UPPER
00068 INTEGER J, JB, NB, NN
00069
00070
00071 LOGICAL LSAME
00072 INTEGER ILAENV
00073 EXTERNAL LSAME, ILAENV
00074
00075
00076 EXTERNAL STRMM, STRSM, STRTI2, XERBLA
00077
00078
00079 INTRINSIC MAX, MIN
00080
00081
00082
00083
00084
00085 INFO = 0
00086 UPPER = LSAME( UPLO, 'U' )
00087 NOUNIT = LSAME( DIAG, 'N' )
00088 IF( .NOT.UPPER .AND. .NOT.LSAME( UPLO, 'L' ) ) THEN
00089 INFO = -1
00090 ELSE IF( .NOT.NOUNIT .AND. .NOT.LSAME( DIAG, 'U' ) ) THEN
00091 INFO = -2
00092 ELSE IF( N.LT.0 ) THEN
00093 INFO = -3
00094 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
00095 INFO = -5
00096 END IF
00097 IF( INFO.NE.0 ) THEN
00098 CALL XERBLA( 'STRTRI', -INFO )
00099 RETURN
00100 END IF
00101
00102
00103
00104 IF( N.EQ.0 )
00105 $ RETURN
00106
00107
00108
00109 IF( NOUNIT ) THEN
00110 DO 10 INFO = 1, N
00111 IF( A( INFO, INFO ).EQ.ZERO )
00112 $ RETURN
00113 10 CONTINUE
00114 INFO = 0
00115 END IF
00116
00117
00118
00119 NB = ILAENV( 1, 'STRTRI', UPLO // DIAG, N, -1, -1, -1 )
00120 IF( NB.LE.1 .OR. NB.GE.N ) THEN
00121
00122
00123
00124 CALL STRTI2( UPLO, DIAG, N, A, LDA, INFO )
00125 ELSE
00126
00127
00128
00129 IF( UPPER ) THEN
00130
00131
00132
00133 DO 20 J = 1, N, NB
00134 JB = MIN( NB, N-J+1 )
00135
00136
00137
00138 CALL STRMM( 'Left', 'Upper', 'No transpose', DIAG, J-1,
00139 $ JB, ONE, A, LDA, A( 1, J ), LDA )
00140 CALL STRSM( 'Right', 'Upper', 'No transpose', DIAG, J-1,
00141 $ JB, -ONE, A( J, J ), LDA, A( 1, J ), LDA )
00142
00143
00144
00145 CALL STRTI2( 'Upper', DIAG, JB, A( J, J ), LDA, INFO )
00146 20 CONTINUE
00147 ELSE
00148
00149
00150
00151 NN = ( ( N-1 ) / NB )*NB + 1
00152 DO 30 J = NN, 1, -NB
00153 JB = MIN( NB, N-J+1 )
00154 IF( J+JB.LE.N ) THEN
00155
00156
00157
00158 CALL STRMM( 'Left', 'Lower', 'No transpose', DIAG,
00159 $ N-J-JB+1, JB, ONE, A( J+JB, J+JB ), LDA,
00160 $ A( J+JB, J ), LDA )
00161 CALL STRSM( 'Right', 'Lower', 'No transpose', DIAG,
00162 $ N-J-JB+1, JB, -ONE, A( J, J ), LDA,
00163 $ A( J+JB, J ), LDA )
00164 END IF
00165
00166
00167
00168 CALL STRTI2( 'Lower', DIAG, JB, A( J, J ), LDA, INFO )
00169 30 CONTINUE
00170 END IF
00171 END IF
00172
00173 RETURN
00174
00175
00176
00177 END