140
  141
  142
  143
  144
  145
  146      CHARACTER          UPLO
  147      INTEGER            INFO, KD, LDAB, N
  148
  149
  150      DOUBLE PRECISION   AB( LDAB, * )
  151
  152
  153
  154
  155
  156      DOUBLE PRECISION   ONE, ZERO
  157      parameter( one = 1.0d+0, zero = 0.0d+0 )
  158      INTEGER            NBMAX, LDWORK
  159      parameter( nbmax = 32, ldwork = nbmax+1 )
  160
  161
  162      INTEGER            I, I2, I3, IB, II, J, JJ, NB
  163
  164
  165      DOUBLE PRECISION   WORK( LDWORK, NBMAX )
  166
  167
  168      LOGICAL            LSAME
  169      INTEGER            ILAENV
  171
  172
  175
  176
  177      INTRINSIC          min
  178
  179
  180
  181
  182
  183      info = 0
  184      IF( ( .NOT.
lsame( uplo, 
'U' ) ) .AND.
 
  185     $    ( .NOT.
lsame( uplo, 
'L' ) ) ) 
THEN 
  186         info = -1
  187      ELSE IF( n.LT.0 ) THEN
  188         info = -2
  189      ELSE IF( kd.LT.0 ) THEN
  190         info = -3
  191      ELSE IF( ldab.LT.kd+1 ) THEN
  192         info = -5
  193      END IF
  194      IF( info.NE.0 ) THEN
  195         CALL xerbla( 
'DPBTRF', -info )
 
  196         RETURN
  197      END IF
  198
  199
  200
  201      IF( n.EQ.0 )
  202     $   RETURN
  203
  204
  205
  206      nb = 
ilaenv( 1, 
'DPBTRF', uplo, n, kd, -1, -1 )
 
  207
  208
  209
  210
  211      nb = min( nb, nbmax )
  212
  213      IF( nb.LE.1 .OR. nb.GT.kd ) THEN
  214
  215
  216
  217         CALL dpbtf2( uplo, n, kd, ab, ldab, info )
 
  218      ELSE
  219
  220
  221
  222         IF( 
lsame( uplo, 
'U' ) ) 
THEN 
  223
  224
  225
  226
  227
  228
  229
  230            DO 20 j = 1, nb
  231               DO 10 i = 1, j - 1
  232                  work( i, j ) = zero
  233   10          CONTINUE
  234   20       CONTINUE
  235
  236
  237
  238            DO 70 i = 1, n, nb
  239               ib = min( nb, n-i+1 )
  240
  241
  242
  243               CALL dpotf2( uplo, ib, ab( kd+1, i ), ldab-1, ii )
 
  244               IF( ii.NE.0 ) THEN
  245                  info = i + ii - 1
  246                  GO TO 150
  247               END IF
  248               IF( i+ib.LE.n ) THEN
  249
  250
  251
  252
  253
  254
  255
  256
  257
  258
  259
  260
  261
  262
  263
  264                  i2 = min( kd-ib, n-i-ib+1 )
  265                  i3 = min( ib, n-i-kd+1 )
  266
  267                  IF( i2.GT.0 ) THEN
  268
  269
  270
  271                     CALL dtrsm( 
'Left', 
'Upper', 
'Transpose',
 
  272     $                           'Non-unit', ib, i2, one, ab( kd+1, i ),
  273     $                           ldab-1, ab( kd+1-ib, i+ib ), ldab-1 )
  274
  275
  276
  277                     CALL dsyrk( 
'Upper', 
'Transpose', i2, ib, -one,
 
  278     $                           ab( kd+1-ib, i+ib ), ldab-1, one,
  279     $                           ab( kd+1, i+ib ), ldab-1 )
  280                  END IF
  281
  282                  IF( i3.GT.0 ) THEN
  283
  284
  285
  286                     DO 40 jj = 1, i3
  287                        DO 30 ii = jj, ib
  288                           work( ii, jj ) = ab( ii-jj+1, jj+i+kd-1 )
  289   30                   CONTINUE
  290   40                CONTINUE
  291
  292
  293
  294                     CALL dtrsm( 
'Left', 
'Upper', 
'Transpose',
 
  295     $                           'Non-unit', ib, i3, one, ab( kd+1, i ),
  296     $                           ldab-1, work, ldwork )
  297
  298
  299
  300                     IF( i2.GT.0 )
  301     $                  
CALL dgemm( 
'Transpose', 
'No Transpose', i2,
 
  302     $                              i3,
  303     $                              ib, -one, ab( kd+1-ib, i+ib ),
  304     $                              ldab-1, work, ldwork, one,
  305     $                              ab( 1+ib, i+kd ), ldab-1 )
  306
  307
  308
  309                     CALL dsyrk( 
'Upper', 
'Transpose', i3, ib, -one,
 
  310     $                           work, ldwork, one, ab( kd+1, i+kd ),
  311     $                           ldab-1 )
  312
  313
  314
  315                     DO 60 jj = 1, i3
  316                        DO 50 ii = jj, ib
  317                           ab( ii-jj+1, jj+i+kd-1 ) = work( ii, jj )
  318   50                   CONTINUE
  319   60                CONTINUE
  320                  END IF
  321               END IF
  322   70       CONTINUE
  323         ELSE
  324
  325
  326
  327
  328
  329
  330
  331            DO 90 j = 1, nb
  332               DO 80 i = j + 1, nb
  333                  work( i, j ) = zero
  334   80          CONTINUE
  335   90       CONTINUE
  336
  337
  338
  339            DO 140 i = 1, n, nb
  340               ib = min( nb, n-i+1 )
  341
  342
  343
  344               CALL dpotf2( uplo, ib, ab( 1, i ), ldab-1, ii )
 
  345               IF( ii.NE.0 ) THEN
  346                  info = i + ii - 1
  347                  GO TO 150
  348               END IF
  349               IF( i+ib.LE.n ) THEN
  350
  351
  352
  353
  354
  355
  356
  357
  358
  359
  360
  361
  362
  363
  364
  365                  i2 = min( kd-ib, n-i-ib+1 )
  366                  i3 = min( ib, n-i-kd+1 )
  367
  368                  IF( i2.GT.0 ) THEN
  369
  370
  371
  372                     CALL dtrsm( 
'Right', 
'Lower', 
'Transpose',
 
  373     $                           'Non-unit', i2, ib, one, ab( 1, i ),
  374     $                           ldab-1, ab( 1+ib, i ), ldab-1 )
  375
  376
  377
  378                     CALL dsyrk( 
'Lower', 
'No Transpose', i2, ib,
 
  379     $                           -one,
  380     $                           ab( 1+ib, i ), ldab-1, one,
  381     $                           ab( 1, i+ib ), ldab-1 )
  382                  END IF
  383
  384                  IF( i3.GT.0 ) THEN
  385
  386
  387
  388                     DO 110 jj = 1, ib
  389                        DO 100 ii = 1, min( jj, i3 )
  390                           work( ii, jj ) = ab( kd+1-jj+ii, jj+i-1 )
  391  100                   CONTINUE
  392  110                CONTINUE
  393
  394
  395
  396                     CALL dtrsm( 
'Right', 
'Lower', 
'Transpose',
 
  397     $                           'Non-unit', i3, ib, one, ab( 1, i ),
  398     $                           ldab-1, work, ldwork )
  399
  400
  401
  402                     IF( i2.GT.0 )
  403     $                  
CALL dgemm( 
'No transpose', 
'Transpose', i3,
 
  404     $                              i2,
  405     $                              ib, -one, work, ldwork,
  406     $                              ab( 1+ib, i ), ldab-1, one,
  407     $                              ab( 1+kd-ib, i+ib ), ldab-1 )
  408
  409
  410
  411                     CALL dsyrk( 
'Lower', 
'No Transpose', i3, ib,
 
  412     $                           -one,
  413     $                           work, ldwork, one, ab( 1, i+kd ),
  414     $                           ldab-1 )
  415
  416
  417
  418                     DO 130 jj = 1, ib
  419                        DO 120 ii = 1, min( jj, i3 )
  420                           ab( kd+1-jj+ii, jj+i-1 ) = work( ii, jj )
  421  120                   CONTINUE
  422  130                CONTINUE
  423                  END IF
  424               END IF
  425  140       CONTINUE
  426         END IF
  427      END IF
  428      RETURN
  429
  430  150 CONTINUE
  431      RETURN
  432
  433
  434
subroutine xerbla(srname, info)
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
DSYRK
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
logical function lsame(ca, cb)
LSAME
subroutine dpbtf2(uplo, n, kd, ab, ldab, info)
DPBTF2 computes the Cholesky factorization of a symmetric/Hermitian positive definite band matrix (un...
subroutine dpotf2(uplo, n, a, lda, info)
DPOTF2 computes the Cholesky factorization of a symmetric/Hermitian positive definite matrix (unblock...
subroutine dtrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
DTRSM