00001 SUBROUTINE DTRTTF( TRANSR, UPLO, N, A, LDA, ARF, INFO )
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 CHARACTER TRANSR, UPLO
00013 INTEGER INFO, N, LDA
00014
00015
00016 DOUBLE PRECISION A( 0: LDA-1, 0: * ), ARF( 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 LOGICAL LOWER, NISODD, NORMALTRANSR
00150 INTEGER I, IJ, J, K, L, N1, N2, NT, NX2, NP1X2
00151
00152
00153 LOGICAL LSAME
00154 EXTERNAL LSAME
00155
00156
00157 EXTERNAL XERBLA
00158
00159
00160 INTRINSIC MAX, MOD
00161
00162
00163
00164
00165
00166 INFO = 0
00167 NORMALTRANSR = LSAME( TRANSR, 'N' )
00168 LOWER = LSAME( UPLO, 'L' )
00169 IF( .NOT.NORMALTRANSR .AND. .NOT.LSAME( TRANSR, 'T' ) ) THEN
00170 INFO = -1
00171 ELSE IF( .NOT.LOWER .AND. .NOT.LSAME( UPLO, 'U' ) ) THEN
00172 INFO = -2
00173 ELSE IF( N.LT.0 ) THEN
00174 INFO = -3
00175 ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
00176 INFO = -5
00177 END IF
00178 IF( INFO.NE.0 ) THEN
00179 CALL XERBLA( 'DTRTTF', -INFO )
00180 RETURN
00181 END IF
00182
00183
00184
00185 IF( N.LE.1 ) THEN
00186 IF( N.EQ.1 ) THEN
00187 ARF( 0 ) = A( 0, 0 )
00188 END IF
00189 RETURN
00190 END IF
00191
00192
00193
00194 NT = N*( N+1 ) / 2
00195
00196
00197
00198 IF( LOWER ) THEN
00199 N2 = N / 2
00200 N1 = N - N2
00201 ELSE
00202 N1 = N / 2
00203 N2 = N - N1
00204 END IF
00205
00206
00207
00208
00209
00210 IF( MOD( N, 2 ).EQ.0 ) THEN
00211 K = N / 2
00212 NISODD = .FALSE.
00213 IF( .NOT.LOWER )
00214 + NP1X2 = N + N + 2
00215 ELSE
00216 NISODD = .TRUE.
00217 IF( .NOT.LOWER )
00218 + NX2 = N + N
00219 END IF
00220
00221 IF( NISODD ) THEN
00222
00223
00224
00225 IF( NORMALTRANSR ) THEN
00226
00227
00228
00229 IF( LOWER ) THEN
00230
00231
00232
00233 IJ = 0
00234 DO J = 0, N2
00235 DO I = N1, N2 + J
00236 ARF( IJ ) = A( N2+J, I )
00237 IJ = IJ + 1
00238 END DO
00239 DO I = J, N - 1
00240 ARF( IJ ) = A( I, J )
00241 IJ = IJ + 1
00242 END DO
00243 END DO
00244
00245 ELSE
00246
00247
00248
00249 IJ = NT - N
00250 DO J = N - 1, N1, -1
00251 DO I = 0, J
00252 ARF( IJ ) = A( I, J )
00253 IJ = IJ + 1
00254 END DO
00255 DO L = J - N1, N1 - 1
00256 ARF( IJ ) = A( J-N1, L )
00257 IJ = IJ + 1
00258 END DO
00259 IJ = IJ - NX2
00260 END DO
00261
00262 END IF
00263
00264 ELSE
00265
00266
00267
00268 IF( LOWER ) THEN
00269
00270
00271
00272 IJ = 0
00273 DO J = 0, N2 - 1
00274 DO I = 0, J
00275 ARF( IJ ) = A( J, I )
00276 IJ = IJ + 1
00277 END DO
00278 DO I = N1 + J, N - 1
00279 ARF( IJ ) = A( I, N1+J )
00280 IJ = IJ + 1
00281 END DO
00282 END DO
00283 DO J = N2, N - 1
00284 DO I = 0, N1 - 1
00285 ARF( IJ ) = A( J, I )
00286 IJ = IJ + 1
00287 END DO
00288 END DO
00289
00290 ELSE
00291
00292
00293
00294 IJ = 0
00295 DO J = 0, N1
00296 DO I = N1, N - 1
00297 ARF( IJ ) = A( J, I )
00298 IJ = IJ + 1
00299 END DO
00300 END DO
00301 DO J = 0, N1 - 1
00302 DO I = 0, J
00303 ARF( IJ ) = A( I, J )
00304 IJ = IJ + 1
00305 END DO
00306 DO L = N2 + J, N - 1
00307 ARF( IJ ) = A( N2+J, L )
00308 IJ = IJ + 1
00309 END DO
00310 END DO
00311
00312 END IF
00313
00314 END IF
00315
00316 ELSE
00317
00318
00319
00320 IF( NORMALTRANSR ) THEN
00321
00322
00323
00324 IF( LOWER ) THEN
00325
00326
00327
00328 IJ = 0
00329 DO J = 0, K - 1
00330 DO I = K, K + J
00331 ARF( IJ ) = A( K+J, I )
00332 IJ = IJ + 1
00333 END DO
00334 DO I = J, N - 1
00335 ARF( IJ ) = A( I, J )
00336 IJ = IJ + 1
00337 END DO
00338 END DO
00339
00340 ELSE
00341
00342
00343
00344 IJ = NT - N - 1
00345 DO J = N - 1, K, -1
00346 DO I = 0, J
00347 ARF( IJ ) = A( I, J )
00348 IJ = IJ + 1
00349 END DO
00350 DO L = J - K, K - 1
00351 ARF( IJ ) = A( J-K, L )
00352 IJ = IJ + 1
00353 END DO
00354 IJ = IJ - NP1X2
00355 END DO
00356
00357 END IF
00358
00359 ELSE
00360
00361
00362
00363 IF( LOWER ) THEN
00364
00365
00366
00367 IJ = 0
00368 J = K
00369 DO I = K, N - 1
00370 ARF( IJ ) = A( I, J )
00371 IJ = IJ + 1
00372 END DO
00373 DO J = 0, K - 2
00374 DO I = 0, J
00375 ARF( IJ ) = A( J, I )
00376 IJ = IJ + 1
00377 END DO
00378 DO I = K + 1 + J, N - 1
00379 ARF( IJ ) = A( I, K+1+J )
00380 IJ = IJ + 1
00381 END DO
00382 END DO
00383 DO J = K - 1, N - 1
00384 DO I = 0, K - 1
00385 ARF( IJ ) = A( J, I )
00386 IJ = IJ + 1
00387 END DO
00388 END DO
00389
00390 ELSE
00391
00392
00393
00394 IJ = 0
00395 DO J = 0, K
00396 DO I = K, N - 1
00397 ARF( IJ ) = A( J, I )
00398 IJ = IJ + 1
00399 END DO
00400 END DO
00401 DO J = 0, K - 2
00402 DO I = 0, J
00403 ARF( IJ ) = A( I, J )
00404 IJ = IJ + 1
00405 END DO
00406 DO L = K + 1 + J, N - 1
00407 ARF( IJ ) = A( K+1+J, L )
00408 IJ = IJ + 1
00409 END DO
00410 END DO
00411
00412 DO I = 0, J
00413 ARF( IJ ) = A( I, J )
00414 IJ = IJ + 1
00415 END DO
00416
00417 END IF
00418
00419 END IF
00420
00421 END IF
00422
00423 RETURN
00424
00425
00426
00427 END