00001 SUBROUTINE ZPBTRF( UPLO, N, KD, AB, LDAB, INFO )
00002
00003
00004
00005
00006
00007
00008
00009 CHARACTER UPLO
00010 INTEGER INFO, KD, LDAB, N
00011
00012
00013 COMPLEX*16 AB( LDAB, * )
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
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 DOUBLE PRECISION ONE, ZERO
00092 PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
00093 COMPLEX*16 CONE
00094 PARAMETER ( CONE = ( 1.0D+0, 0.0D+0 ) )
00095 INTEGER NBMAX, LDWORK
00096 PARAMETER ( NBMAX = 32, LDWORK = NBMAX+1 )
00097
00098
00099 INTEGER I, I2, I3, IB, II, J, JJ, NB
00100
00101
00102 COMPLEX*16 WORK( LDWORK, NBMAX )
00103
00104
00105 LOGICAL LSAME
00106 INTEGER ILAENV
00107 EXTERNAL LSAME, ILAENV
00108
00109
00110 EXTERNAL XERBLA, ZGEMM, ZHERK, ZPBTF2, ZPOTF2, ZTRSM
00111
00112
00113 INTRINSIC MIN
00114
00115
00116
00117
00118
00119 INFO = 0
00120 IF( ( .NOT.LSAME( UPLO, 'U' ) ) .AND.
00121 $ ( .NOT.LSAME( UPLO, 'L' ) ) ) THEN
00122 INFO = -1
00123 ELSE IF( N.LT.0 ) THEN
00124 INFO = -2
00125 ELSE IF( KD.LT.0 ) THEN
00126 INFO = -3
00127 ELSE IF( LDAB.LT.KD+1 ) THEN
00128 INFO = -5
00129 END IF
00130 IF( INFO.NE.0 ) THEN
00131 CALL XERBLA( 'ZPBTRF', -INFO )
00132 RETURN
00133 END IF
00134
00135
00136
00137 IF( N.EQ.0 )
00138 $ RETURN
00139
00140
00141
00142 NB = ILAENV( 1, 'ZPBTRF', UPLO, N, KD, -1, -1 )
00143
00144
00145
00146
00147 NB = MIN( NB, NBMAX )
00148
00149 IF( NB.LE.1 .OR. NB.GT.KD ) THEN
00150
00151
00152
00153 CALL ZPBTF2( UPLO, N, KD, AB, LDAB, INFO )
00154 ELSE
00155
00156
00157
00158 IF( LSAME( UPLO, 'U' ) ) THEN
00159
00160
00161
00162
00163
00164
00165
00166 DO 20 J = 1, NB
00167 DO 10 I = 1, J - 1
00168 WORK( I, J ) = ZERO
00169 10 CONTINUE
00170 20 CONTINUE
00171
00172
00173
00174 DO 70 I = 1, N, NB
00175 IB = MIN( NB, N-I+1 )
00176
00177
00178
00179 CALL ZPOTF2( UPLO, IB, AB( KD+1, I ), LDAB-1, II )
00180 IF( II.NE.0 ) THEN
00181 INFO = I + II - 1
00182 GO TO 150
00183 END IF
00184 IF( I+IB.LE.N ) THEN
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200 I2 = MIN( KD-IB, N-I-IB+1 )
00201 I3 = MIN( IB, N-I-KD+1 )
00202
00203 IF( I2.GT.0 ) THEN
00204
00205
00206
00207 CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
00208 $ 'Non-unit', IB, I2, CONE,
00209 $ AB( KD+1, I ), LDAB-1,
00210 $ AB( KD+1-IB, I+IB ), LDAB-1 )
00211
00212
00213
00214 CALL ZHERK( 'Upper', 'Conjugate transpose', I2, IB,
00215 $ -ONE, AB( KD+1-IB, I+IB ), LDAB-1, ONE,
00216 $ AB( KD+1, I+IB ), LDAB-1 )
00217 END IF
00218
00219 IF( I3.GT.0 ) THEN
00220
00221
00222
00223 DO 40 JJ = 1, I3
00224 DO 30 II = JJ, IB
00225 WORK( II, JJ ) = AB( II-JJ+1, JJ+I+KD-1 )
00226 30 CONTINUE
00227 40 CONTINUE
00228
00229
00230
00231 CALL ZTRSM( 'Left', 'Upper', 'Conjugate transpose',
00232 $ 'Non-unit', IB, I3, CONE,
00233 $ AB( KD+1, I ), LDAB-1, WORK, LDWORK )
00234
00235
00236
00237 IF( I2.GT.0 )
00238 $ CALL ZGEMM( 'Conjugate transpose',
00239 $ 'No transpose', I2, I3, IB, -CONE,
00240 $ AB( KD+1-IB, I+IB ), LDAB-1, WORK,
00241 $ LDWORK, CONE, AB( 1+IB, I+KD ),
00242 $ LDAB-1 )
00243
00244
00245
00246 CALL ZHERK( 'Upper', 'Conjugate transpose', I3, IB,
00247 $ -ONE, WORK, LDWORK, ONE,
00248 $ AB( KD+1, I+KD ), LDAB-1 )
00249
00250
00251
00252 DO 60 JJ = 1, I3
00253 DO 50 II = JJ, IB
00254 AB( II-JJ+1, JJ+I+KD-1 ) = WORK( II, JJ )
00255 50 CONTINUE
00256 60 CONTINUE
00257 END IF
00258 END IF
00259 70 CONTINUE
00260 ELSE
00261
00262
00263
00264
00265
00266
00267
00268 DO 90 J = 1, NB
00269 DO 80 I = J + 1, NB
00270 WORK( I, J ) = ZERO
00271 80 CONTINUE
00272 90 CONTINUE
00273
00274
00275
00276 DO 140 I = 1, N, NB
00277 IB = MIN( NB, N-I+1 )
00278
00279
00280
00281 CALL ZPOTF2( UPLO, IB, AB( 1, I ), LDAB-1, II )
00282 IF( II.NE.0 ) THEN
00283 INFO = I + II - 1
00284 GO TO 150
00285 END IF
00286 IF( I+IB.LE.N ) THEN
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302 I2 = MIN( KD-IB, N-I-IB+1 )
00303 I3 = MIN( IB, N-I-KD+1 )
00304
00305 IF( I2.GT.0 ) THEN
00306
00307
00308
00309 CALL ZTRSM( 'Right', 'Lower',
00310 $ 'Conjugate transpose', 'Non-unit', I2,
00311 $ IB, CONE, AB( 1, I ), LDAB-1,
00312 $ AB( 1+IB, I ), LDAB-1 )
00313
00314
00315
00316 CALL ZHERK( 'Lower', 'No transpose', I2, IB, -ONE,
00317 $ AB( 1+IB, I ), LDAB-1, ONE,
00318 $ AB( 1, I+IB ), LDAB-1 )
00319 END IF
00320
00321 IF( I3.GT.0 ) THEN
00322
00323
00324
00325 DO 110 JJ = 1, IB
00326 DO 100 II = 1, MIN( JJ, I3 )
00327 WORK( II, JJ ) = AB( KD+1-JJ+II, JJ+I-1 )
00328 100 CONTINUE
00329 110 CONTINUE
00330
00331
00332
00333 CALL ZTRSM( 'Right', 'Lower',
00334 $ 'Conjugate transpose', 'Non-unit', I3,
00335 $ IB, CONE, AB( 1, I ), LDAB-1, WORK,
00336 $ LDWORK )
00337
00338
00339
00340 IF( I2.GT.0 )
00341 $ CALL ZGEMM( 'No transpose',
00342 $ 'Conjugate transpose', I3, I2, IB,
00343 $ -CONE, WORK, LDWORK, AB( 1+IB, I ),
00344 $ LDAB-1, CONE, AB( 1+KD-IB, I+IB ),
00345 $ LDAB-1 )
00346
00347
00348
00349 CALL ZHERK( 'Lower', 'No transpose', I3, IB, -ONE,
00350 $ WORK, LDWORK, ONE, AB( 1, I+KD ),
00351 $ LDAB-1 )
00352
00353
00354
00355 DO 130 JJ = 1, IB
00356 DO 120 II = 1, MIN( JJ, I3 )
00357 AB( KD+1-JJ+II, JJ+I-1 ) = WORK( II, JJ )
00358 120 CONTINUE
00359 130 CONTINUE
00360 END IF
00361 END IF
00362 140 CONTINUE
00363 END IF
00364 END IF
00365 RETURN
00366
00367 150 CONTINUE
00368 RETURN
00369
00370
00371
00372 END