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