00001 SUBROUTINE STFTRI( TRANSR, UPLO, DIAG, N, A, INFO )
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 CHARACTER TRANSR, UPLO, DIAG
00013 INTEGER INFO, N
00014
00015
00016 REAL A( 0: * )
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
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 REAL ONE
00156 PARAMETER ( ONE = 1.0E+0 )
00157
00158
00159 LOGICAL LOWER, NISODD, NORMALTRANSR
00160 INTEGER N1, N2, K
00161
00162
00163 LOGICAL LSAME
00164 EXTERNAL LSAME
00165
00166
00167 EXTERNAL XERBLA, STRMM, STRTRI
00168
00169
00170 INTRINSIC MOD
00171
00172
00173
00174
00175
00176 INFO = 0
00177 NORMALTRANSR = LSAME( TRANSR, 'N' )
00178 LOWER = LSAME( UPLO, 'L' )
00179 IF( .NOT.NORMALTRANSR .AND. .NOT.LSAME( TRANSR, 'T' ) ) THEN
00180 INFO = -1
00181 ELSE IF( .NOT.LOWER .AND. .NOT.LSAME( UPLO, 'U' ) ) THEN
00182 INFO = -2
00183 ELSE IF( .NOT.LSAME( DIAG, 'N' ) .AND. .NOT.LSAME( DIAG, 'U' ) )
00184 + THEN
00185 INFO = -3
00186 ELSE IF( N.LT.0 ) THEN
00187 INFO = -4
00188 END IF
00189 IF( INFO.NE.0 ) THEN
00190 CALL XERBLA( 'STFTRI', -INFO )
00191 RETURN
00192 END IF
00193
00194
00195
00196 IF( N.EQ.0 )
00197 + RETURN
00198
00199
00200
00201
00202 IF( MOD( N, 2 ).EQ.0 ) THEN
00203 K = N / 2
00204 NISODD = .FALSE.
00205 ELSE
00206 NISODD = .TRUE.
00207 END IF
00208
00209
00210
00211 IF( LOWER ) THEN
00212 N2 = N / 2
00213 N1 = N - N2
00214 ELSE
00215 N1 = N / 2
00216 N2 = N - N1
00217 END IF
00218
00219
00220
00221
00222 IF( NISODD ) THEN
00223
00224
00225
00226 IF( NORMALTRANSR ) THEN
00227
00228
00229
00230 IF( LOWER ) THEN
00231
00232
00233
00234
00235
00236 CALL STRTRI( 'L', DIAG, N1, A( 0 ), N, INFO )
00237 IF( INFO.GT.0 )
00238 + RETURN
00239 CALL STRMM( 'R', 'L', 'N', DIAG, N2, N1, -ONE, A( 0 ),
00240 + N, A( N1 ), N )
00241 CALL STRTRI( 'U', DIAG, N2, A( N ), N, INFO )
00242 IF( INFO.GT.0 )
00243 + INFO = INFO + N1
00244 IF( INFO.GT.0 )
00245 + RETURN
00246 CALL STRMM( 'L', 'U', 'T', DIAG, N2, N1, ONE, A( N ), N,
00247 + A( N1 ), N )
00248
00249 ELSE
00250
00251
00252
00253
00254
00255 CALL STRTRI( 'L', DIAG, N1, A( N2 ), N, INFO )
00256 IF( INFO.GT.0 )
00257 + RETURN
00258 CALL STRMM( 'L', 'L', 'T', DIAG, N1, N2, -ONE, A( N2 ),
00259 + N, A( 0 ), N )
00260 CALL STRTRI( 'U', DIAG, N2, A( N1 ), N, INFO )
00261 IF( INFO.GT.0 )
00262 + INFO = INFO + N1
00263 IF( INFO.GT.0 )
00264 + RETURN
00265 CALL STRMM( 'R', 'U', 'N', DIAG, N1, N2, ONE, A( N1 ),
00266 + N, A( 0 ), N )
00267
00268 END IF
00269
00270 ELSE
00271
00272
00273
00274 IF( LOWER ) THEN
00275
00276
00277
00278
00279 CALL STRTRI( 'U', DIAG, N1, A( 0 ), N1, INFO )
00280 IF( INFO.GT.0 )
00281 + RETURN
00282 CALL STRMM( 'L', 'U', 'N', DIAG, N1, N2, -ONE, A( 0 ),
00283 + N1, A( N1*N1 ), N1 )
00284 CALL STRTRI( 'L', DIAG, N2, A( 1 ), N1, INFO )
00285 IF( INFO.GT.0 )
00286 + INFO = INFO + N1
00287 IF( INFO.GT.0 )
00288 + RETURN
00289 CALL STRMM( 'R', 'L', 'T', DIAG, N1, N2, ONE, A( 1 ),
00290 + N1, A( N1*N1 ), N1 )
00291
00292 ELSE
00293
00294
00295
00296
00297 CALL STRTRI( 'U', DIAG, N1, A( N2*N2 ), N2, INFO )
00298 IF( INFO.GT.0 )
00299 + RETURN
00300 CALL STRMM( 'R', 'U', 'T', DIAG, N2, N1, -ONE,
00301 + A( N2*N2 ), N2, A( 0 ), N2 )
00302 CALL STRTRI( 'L', DIAG, N2, A( N1*N2 ), N2, INFO )
00303 IF( INFO.GT.0 )
00304 + INFO = INFO + N1
00305 IF( INFO.GT.0 )
00306 + RETURN
00307 CALL STRMM( 'L', 'L', 'N', DIAG, N2, N1, ONE,
00308 + A( N1*N2 ), N2, A( 0 ), N2 )
00309 END IF
00310
00311 END IF
00312
00313 ELSE
00314
00315
00316
00317 IF( NORMALTRANSR ) THEN
00318
00319
00320
00321 IF( LOWER ) THEN
00322
00323
00324
00325
00326
00327 CALL STRTRI( 'L', DIAG, K, A( 1 ), N+1, INFO )
00328 IF( INFO.GT.0 )
00329 + RETURN
00330 CALL STRMM( 'R', 'L', 'N', DIAG, K, K, -ONE, A( 1 ),
00331 + N+1, A( K+1 ), N+1 )
00332 CALL STRTRI( 'U', DIAG, K, A( 0 ), N+1, INFO )
00333 IF( INFO.GT.0 )
00334 + INFO = INFO + K
00335 IF( INFO.GT.0 )
00336 + RETURN
00337 CALL STRMM( 'L', 'U', 'T', DIAG, K, K, ONE, A( 0 ), N+1,
00338 + A( K+1 ), N+1 )
00339
00340 ELSE
00341
00342
00343
00344
00345
00346 CALL STRTRI( 'L', DIAG, K, A( K+1 ), N+1, INFO )
00347 IF( INFO.GT.0 )
00348 + RETURN
00349 CALL STRMM( 'L', 'L', 'T', DIAG, K, K, -ONE, A( K+1 ),
00350 + N+1, A( 0 ), N+1 )
00351 CALL STRTRI( 'U', DIAG, K, A( K ), N+1, INFO )
00352 IF( INFO.GT.0 )
00353 + INFO = INFO + K
00354 IF( INFO.GT.0 )
00355 + RETURN
00356 CALL STRMM( 'R', 'U', 'N', DIAG, K, K, ONE, A( K ), N+1,
00357 + A( 0 ), N+1 )
00358 END IF
00359 ELSE
00360
00361
00362
00363 IF( LOWER ) THEN
00364
00365
00366
00367
00368
00369 CALL STRTRI( 'U', DIAG, K, A( K ), K, INFO )
00370 IF( INFO.GT.0 )
00371 + RETURN
00372 CALL STRMM( 'L', 'U', 'N', DIAG, K, K, -ONE, A( K ), K,
00373 + A( K*( K+1 ) ), K )
00374 CALL STRTRI( 'L', DIAG, K, A( 0 ), K, INFO )
00375 IF( INFO.GT.0 )
00376 + INFO = INFO + K
00377 IF( INFO.GT.0 )
00378 + RETURN
00379 CALL STRMM( 'R', 'L', 'T', DIAG, K, K, ONE, A( 0 ), K,
00380 + A( K*( K+1 ) ), K )
00381 ELSE
00382
00383
00384
00385
00386
00387 CALL STRTRI( 'U', DIAG, K, A( K*( K+1 ) ), K, INFO )
00388 IF( INFO.GT.0 )
00389 + RETURN
00390 CALL STRMM( 'R', 'U', 'T', DIAG, K, K, -ONE,
00391 + A( K*( K+1 ) ), K, A( 0 ), K )
00392 CALL STRTRI( 'L', DIAG, K, A( K*K ), K, INFO )
00393 IF( INFO.GT.0 )
00394 + INFO = INFO + K
00395 IF( INFO.GT.0 )
00396 + RETURN
00397 CALL STRMM( 'L', 'L', 'N', DIAG, K, K, ONE, A( K*K ), K,
00398 + A( 0 ), K )
00399 END IF
00400 END IF
00401 END IF
00402
00403 RETURN
00404
00405
00406
00407 END