142
  143
  144
  145
  146
  147      IMPLICIT NONE
  148
  149
  150      CHARACTER    UPLO
  151      INTEGER      M, NB, J1, LDA, LDH
  152
  153
  154      INTEGER      IPIV( * )
  155      COMPLEX*16   A( LDA, * ), H( LDH, * ), WORK( * )
  156
  157
  158
  159
  160      COMPLEX*16   ZERO, ONE
  161      parameter( zero = (0.0d+0, 0.0d+0), one = (1.0d+0, 0.0d+0) )
  162
  163
  164      INTEGER      J, K, K1, I1, I2, MJ
  165      COMPLEX*16   PIV, ALPHA
  166
  167
  168      LOGICAL      LSAME
  169      INTEGER      IZAMAX, ILAENV
  171
  172
  175
  176
  177      INTRINSIC    dble, dconjg, max
  178
  179
  180
  181      j = 1
  182
  183
  184
  185
  186      k1 = (2-j1)+1
  187
  188      IF( 
lsame( uplo, 
'U' ) ) 
THEN 
  189
  190
  191
  192
  193
  194 10      CONTINUE
  195         IF ( j.GT.min(m, nb) )
  196     $      GO TO 20
  197
  198
  199
  200
  201
  202
  203         k = j1+j-1
  204         IF( j.EQ.m ) THEN
  205
  206
  207
  208             mj = 1
  209         ELSE
  210             mj = m-j+1
  211         END IF
  212
  213
  214
  215
  216         IF( k.GT.2 ) THEN
  217
  218
  219
  220
  221
  222
  223
  224            CALL zlacgv( j-k1, a( 1, j ), 1 )
 
  225            CALL zgemv( 
'No transpose', mj, j-k1,
 
  226     $                 -one, h( j, k1 ), ldh,
  227     $                       a( 1, j ), 1,
  228     $                  one, h( j, j ), 1 )
  229            CALL zlacgv( j-k1, a( 1, j ), 1 )
 
  230         END IF
  231
  232
  233
  234         CALL zcopy( mj, h( j, j ), 1, work( 1 ), 1 )
 
  235
  236         IF( j.GT.k1 ) THEN
  237
  238
  239
  240
  241            alpha = -dconjg( a( k-1, j ) )
  242            CALL zaxpy( mj, alpha, a( k-2, j ), lda, work( 1 ), 1 )
 
  243         END IF
  244
  245
  246
  247         a( k, j ) = dble( work( 1 ) )
  248
  249         IF( j.LT.m ) THEN
  250
  251
  252
  253
  254            IF( k.GT.1 ) THEN
  255               alpha = -a( k, j )
  256               CALL zaxpy( m-j, alpha, a( k-1, j+1 ), lda,
 
  257     $                                 work( 2 ), 1 )
  258            ENDIF
  259
  260
  261
  262            i2 = 
izamax( m-j, work( 2 ), 1 ) + 1
 
  263            piv = work( i2 )
  264
  265
  266
  267            IF( (i2.NE.2) .AND. (piv.NE.0) ) THEN
  268
  269
  270
  271               i1 = 2
  272               work( i2 ) = work( i1 )
  273               work( i1 ) = piv
  274
  275
  276
  277               i1 = i1+j-1
  278               i2 = i2+j-1
  279               CALL zswap( i2-i1-1, a( j1+i1-1, i1+1 ), lda,
 
  280     $                              a( j1+i1, i2 ), 1 )
  281               CALL zlacgv( i2-i1, a( j1+i1-1, i1+1 ), lda )
 
  282               CALL zlacgv( i2-i1-1, a( j1+i1, i2 ), 1 )
 
  283
  284
  285
  286               IF( i2.LT.m )
  287     $            
CALL zswap( m-i2, a( j1+i1-1, i2+1 ), lda,
 
  288     $                              a( j1+i2-1, i2+1 ), lda )
  289
  290
  291
  292               piv = a( i1+j1-1, i1 )
  293               a( j1+i1-1, i1 ) = a( j1+i2-1, i2 )
  294               a( j1+i2-1, i2 ) = piv
  295
  296
  297
  298               CALL zswap( i1-1, h( i1, 1 ), ldh, h( i2, 1 ), ldh )
 
  299               ipiv( i1 ) = i2
  300
  301               IF( i1.GT.(k1-1) ) THEN
  302
  303
  304
  305
  306                  CALL zswap( i1-k1+1, a( 1, i1 ), 1,
 
  307     $                                 a( 1, i2 ), 1 )
  308               END IF
  309            ELSE
  310               ipiv( j+1 ) = j+1
  311            ENDIF
  312
  313
  314
  315            a( k, j+1 ) = work( 2 )
  316
  317            IF( j.LT.nb ) THEN
  318
  319
  320
  321               CALL zcopy( m-j, a( k+1, j+1 ), lda,
 
  322     $                          h( j+1, j+1 ), 1 )
  323            END IF
  324
  325
  326
  327
  328            IF( j.LT.(m-1) ) THEN
  329               IF( a( k, j+1 ).NE.zero ) THEN
  330                  alpha = one / a( k, j+1 )
  331                  CALL zcopy( m-j-1, work( 3 ), 1, a( k, j+2 ), lda )
 
  332                  CALL zscal( m-j-1, alpha, a( k, j+2 ), lda )
 
  333               ELSE
  334                  CALL zlaset( 
'Full', 1, m-j-1, zero, zero,
 
  335     $                         a( k, j+2 ), lda)
  336               END IF
  337            END IF
  338         END IF
  339         j = j + 1
  340         GO TO 10
  341 20      CONTINUE
  342
  343      ELSE
  344
  345
  346
  347
  348
  349 30      CONTINUE
  350         IF( j.GT.min( m, nb ) )
  351     $      GO TO 40
  352
  353
  354
  355
  356
  357
  358         k = j1+j-1
  359         IF( j.EQ.m ) THEN
  360
  361
  362
  363             mj = 1
  364         ELSE
  365             mj = m-j+1
  366         END IF
  367
  368
  369
  370
  371         IF( k.GT.2 ) THEN
  372
  373
  374
  375
  376
  377
  378
  379            CALL zlacgv( j-k1, a( j, 1 ), lda )
 
  380            CALL zgemv( 
'No transpose', mj, j-k1,
 
  381     $                 -one, h( j, k1 ), ldh,
  382     $                       a( j, 1 ), lda,
  383     $                  one, h( j, j ), 1 )
  384            CALL zlacgv( j-k1, a( j, 1 ), lda )
 
  385         END IF
  386
  387
  388
  389         CALL zcopy( mj, h( j, j ), 1, work( 1 ), 1 )
 
  390
  391         IF( j.GT.k1 ) THEN
  392
  393
  394
  395
  396            alpha = -dconjg( a( j, k-1 ) )
  397            CALL zaxpy( mj, alpha, a( j, k-2 ), 1, work( 1 ), 1 )
 
  398         END IF
  399
  400
  401
  402         a( j, k ) = dble( work( 1 ) )
  403
  404         IF( j.LT.m ) THEN
  405
  406
  407
  408
  409            IF( k.GT.1 ) THEN
  410               alpha = -a( j, k )
  411               CALL zaxpy( m-j, alpha, a( j+1, k-1 ), 1,
 
  412     $                                 work( 2 ), 1 )
  413            ENDIF
  414
  415
  416
  417            i2 = 
izamax( m-j, work( 2 ), 1 ) + 1
 
  418            piv = work( i2 )
  419
  420
  421
  422            IF( (i2.NE.2) .AND. (piv.NE.0) ) THEN
  423
  424
  425
  426               i1 = 2
  427               work( i2 ) = work( i1 )
  428               work( i1 ) = piv
  429
  430
  431
  432               i1 = i1+j-1
  433               i2 = i2+j-1
  434               CALL zswap( i2-i1-1, a( i1+1, j1+i1-1 ), 1,
 
  435     $                              a( i2, j1+i1 ), lda )
  436               CALL zlacgv( i2-i1, a( i1+1, j1+i1-1 ), 1 )
 
  437               CALL zlacgv( i2-i1-1, a( i2, j1+i1 ), lda )
 
  438
  439
  440
  441               IF( i2.LT.m )
  442     $            
CALL zswap( m-i2, a( i2+1, j1+i1-1 ), 1,
 
  443     $                              a( i2+1, j1+i2-1 ), 1 )
  444
  445
  446
  447               piv = a( i1, j1+i1-1 )
  448               a( i1, j1+i1-1 ) = a( i2, j1+i2-1 )
  449               a( i2, j1+i2-1 ) = piv
  450
  451
  452
  453               CALL zswap( i1-1, h( i1, 1 ), ldh, h( i2, 1 ), ldh )
 
  454               ipiv( i1 ) = i2
  455
  456               IF( i1.GT.(k1-1) ) THEN
  457
  458
  459
  460
  461                  CALL zswap( i1-k1+1, a( i1, 1 ), lda,
 
  462     $                                 a( i2, 1 ), lda )
  463               END IF
  464            ELSE
  465               ipiv( j+1 ) = j+1
  466            ENDIF
  467
  468
  469
  470            a( j+1, k ) = work( 2 )
  471
  472            IF( j.LT.nb ) THEN
  473
  474
  475
  476               CALL zcopy( m-j, a( j+1, k+1 ), 1,
 
  477     $                          h( j+1, j+1 ), 1 )
  478            END IF
  479
  480
  481
  482
  483            IF( j.LT.(m-1) ) THEN
  484               IF( a( j+1, k ).NE.zero ) THEN
  485                  alpha = one / a( j+1, k )
  486                  CALL zcopy( m-j-1, work( 3 ), 1, a( j+2, k ), 1 )
 
  487                  CALL zscal( m-j-1, alpha, a( j+2, k ), 1 )
 
  488               ELSE
  489                  CALL zlaset( 
'Full', m-j-1, 1, zero, zero,
 
  490     $                         a( j+2, k ), lda )
  491               END IF
  492            END IF
  493         END IF
  494         j = j + 1
  495         GO TO 30
  496 40      CONTINUE
  497      END IF
  498      RETURN
  499
  500
  501
subroutine xerbla(srname, info)
subroutine zaxpy(n, za, zx, incx, zy, incy)
ZAXPY
subroutine zcopy(n, zx, incx, zy, incy)
ZCOPY
subroutine zgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
ZGEMM
subroutine zgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
ZGEMV
integer function izamax(n, zx, incx)
IZAMAX
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
subroutine zlacgv(n, x, incx)
ZLACGV conjugates a complex vector.
subroutine zlaset(uplo, m, n, alpha, beta, a, lda)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
logical function lsame(ca, cb)
LSAME
subroutine zscal(n, za, zx, incx)
ZSCAL
subroutine zswap(n, zx, incx, zy, incy)
ZSWAP