3
    4
    5
    6
    7
    8
    9      CHARACTER          UPLO
   10      INTEGER            IA, INFO, JA, LWORK, N
   11
   12
   13      INTEGER            DESCA( * )
   14      REAL               D( * ), E( * )
   15      COMPLEX            A( * ), TAU( * ), WORK( * )
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
  139
  140
  141
  142
  143
  144
  145
  146
  147
  148
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164
  165
  166
  167
  168
  169
  170
  171
  172
  173
  174
  175
  176
  177
  178
  179
  180
  181
  182
  183
  184
  185
  186
  187
  188
  189
  190
  191
  192
  193
  194
  195
  196
  197
  198
  199
  200
  201
  202
  203
  204
  205
  206
  207
  208
  209
  210
  211
  212
  213
  214
  215
  216
  217
  218
  219
  220
  221
  222
  223
  224
  225
  226
  227
  228
  229
  230
  231
  232
  233
  234
  235
  236
  237
  238
  239
  240
  241
  242
  243
  244
  245
  246
  247
  248
  249
  250
  251
  252
  253
  254
  255
  256
  257
  258
  259
  260
  261
  262
  263
  264
  265
  266
  267
  268
  269
  270
  271
  272
  273
  274
  275
  276
  277
  278
  279
  280
  281
  282
  283
  284
  285
  286
  287
  288
  289
  290
  291
  292
  293
  294
  295
  296
  297
  298
  299
  300
  301
  302
  303
  304
  305
  306
  307
  308
  309
  310
  311
  312
  313
  314
  315
  316
  317
  318
  319
  320
  321
  322
  323
  324
  325
  326
  327
  328
  329
  330
  331
  332
  333
  334
  335
  336
  337
  338
  339
  340
  341
  342
  343
  344
  345
  346
  347
  348
  349
  350
  351
  352
  353
  354
  355
  356
  357
  358
  359
  360
  361
  362
  363
  364
  365
  366
  367
  368
  369
  370
  371
  372
  373
  374
  375
  376
  377
  378
  379
  380
  381
  382
  383
  384
  385
  386
  387
  388
  389
  390
  391
  392
  393
  394
  395
  396
  397
  398
  399
  400
  401
  402      INTEGER            BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
  403     $                   MB_, NB_, RSRC_, CSRC_, LLD_
  404      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  405     $                   ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  406     $                   rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  407      REAL               ONE
  408      parameter( one = 1.0e0 )
  409      COMPLEX            Z_ONE, Z_NEGONE, Z_ZERO
  410      parameter( z_one = 1.0e0, z_negone = -1.0e0,
  411     $                   z_zero = 0.0e0 )
  412      REAL               ZERO
  413      parameter( zero = 0.0e+0 )
  414
  415
  416
  417
  418
  419
  420      LOGICAL            BALANCED, INTERLEAVE, TWOGEMMS, UPPER
  421      INTEGER            ANB, BINDEX, CURCOL, CURROW, I, ICTXT, INDEX,
  422     $                   INDEXA, INDEXINH, INDEXINV, INH, INHB, INHT,
  423     $                   INHTB, INTMP, INV, INVB, INVT, INVTB, J, LDA,
  424     $                   LDV, LDZG, LII, LIIB, LIIP1, LIJ, LIJB, LIJP1,
  425     $                   LTLIP1, LTNM1, LWMIN, MAXINDEX, MININDEX,
  426     $                   MYCOL, MYFIRSTROW, MYROW, MYSETNUM, NBZG, NP,
  427     $                   NPB, NPCOL, NPM0, NPM1, NPROW, NPS, NPSET, NQ,
  428     $                   NQB, NQM1, NUMROWS, NXTCOL, NXTROW, PBMAX,
  429     $                   PBMIN, PBSIZE, PNB, ROWSPERPROC
  430      REAL               NORM, SAFMAX, SAFMIN
  431      COMPLEX            ALPHA, BETA, C, ONEOVERBETA, TOPH, TOPNV,
  432     $                   TOPTAU, TOPV, TTOPH, TTOPV
  433
  434
  435
  436
  437
  438
  439      INTEGER            IDUM1( 1 ), IDUM2( 1 )
  440      REAL               DTMP( 5 )
  441      COMPLEX            CC( 3 )
  442
  443
  444      EXTERNAL           blacs_gridinfo, cgebr2d, cgebs2d, cgemm, cgemv,
  445     $                   cgerv2d, cgesd2d, cgsum2d, 
chk1mat, clamov,
 
  448
  449
  450
  451      LOGICAL            LSAME
  452      INTEGER            ICEIL, NUMROC, PJLAENV
  453      REAL               PSLAMCH, SCNRM2
  455
  456
  457      INTRINSIC          aimag, 
cmplx, conjg, ichar, 
max, 
min, mod,
 
  458     $                   real, sign, sqrt
  459
  460
  461
  462
  463
  464      IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
  465     $    rsrc_.LT.0 )RETURN
  466
  467
  468
  469
  470
  471
  472
  473
  474
  475
  476
  477
  478
  479
  480
  481
  482
  483
  484
  485
  486
  487      ictxt = desca( ctxt_ )
  488      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  489
  490      safmax = sqrt( 
pslamch( ictxt, 
'O' ) ) / n
 
  491      safmin = sqrt( 
pslamch( ictxt, 
'S' ) )
 
  492
  493
  494
  495      info = 0
  496      IF( nprow.EQ.-1 ) THEN
  497         info = -( 600+ctxt_ )
  498      ELSE
  499
  500
  501
  502         pnb = 
pjlaenv( ictxt, 2, 
'PCHETTRD', 
'L', 0, 0, 0, 0 )
 
  503         anb = 
pjlaenv( ictxt, 3, 
'PCHETTRD', 
'L', 0, 0, 0, 0 )
 
  504
  505         interleave = ( 
pjlaenv( ictxt, 4, 
'PCHETTRD', 
'L', 1, 0, 0,
 
  506     $                0 ).EQ.1 )
  507         twogemms = ( 
pjlaenv( ictxt, 4, 
'PCHETTRD', 
'L', 2, 0, 0,
 
  508     $              0 ).EQ.1 )
  509         balanced = ( 
pjlaenv( ictxt, 4, 
'PCHETTRD', 
'L', 3, 0, 0,
 
  510     $              0 ).EQ.1 )
  511
  512         CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
 
  513
  514
  515         upper = 
lsame( uplo, 
'U' )
 
  516         IF( info.EQ.0 .AND. desca( nb_ ).NE.1 )
  517     $      info = 600 + nb_
  518         IF( info.EQ.0 ) THEN
  519
  520
  521
  522
  523
  524
  525
  526
  527
  528
  529
  530
  531
  532
  533            nps = 
max( 
numroc( n, 1, 0, 0, nprow ), 2*anb )
 
  534            lwmin = 2*( anb+1 )*( 4*nps+2 ) + nps
  535
  536            work( 1 ) = 
cmplx( lwmin )
 
  537            IF( .NOT.
lsame( uplo, 
'L' ) ) 
THEN 
  538               info = -1
  539            ELSE IF( ia.NE.1 ) THEN
  540               info = -4
  541            ELSE IF( ja.NE.1 ) THEN
  542               info = -5
  543            ELSE IF( nprow.NE.npcol ) THEN
  544               info = -( 600+ctxt_ )
  545            ELSE IF( desca( dtype_ ).NE.1 ) THEN
  546               info = -( 600+dtype_ )
  547            ELSE IF( desca( mb_ ).NE.1 ) THEN
  548               info = -( 600+mb_ )
  549            ELSE IF( desca( nb_ ).NE.1 ) THEN
  550               info = -( 600+nb_ )
  551            ELSE IF( desca( rsrc_ ).NE.0 ) THEN
  552               info = -( 600+rsrc_ )
  553            ELSE IF( desca( csrc_ ).NE.0 ) THEN
  554               info = -( 600+csrc_ )
  555            ELSE IF( lwork.LT.lwmin ) THEN
  556               info = -11
  557            END IF
  558         END IF
  559         IF( upper ) THEN
  560            idum1( 1 ) = ichar( 'U' )
  561         ELSE
  562            idum1( 1 ) = ichar( 'L' )
  563         END IF
  564         idum2( 1 ) = 1
  565
  566         CALL pchk1mat( n, 2, n, 2, ia, ja, desca, 6, 1, idum1, idum2,
 
  567     $                  info )
  568      END IF
  569
  570      IF( info.NE.0 ) THEN
  571         CALL pxerbla( ictxt, 
'PCHETTRD', -info )
 
  572         RETURN
  573      END IF
  574
  575
  576
  577      IF( n.EQ.0 )
  578     $   RETURN
  579
  580
  581
  582
  583      np = 
numroc( n, 1, myrow, 0, nprow )
 
  584      nq = 
numroc( n, 1, mycol, 0, npcol )
 
  585
  586      nxtrow = 0
  587      nxtcol = 0
  588
  589      liip1 = 1
  590      lijp1 = 1
  591      npm1 = np
  592      nqm1 = nq
  593
  594      lda = desca( lld_ )
  595      ictxt = desca( ctxt_ )
  596
  597
  598
  599
  600
  601
  602
  603
  604
  605
  606
  607
  608
  609
  610
  611
  612
  613
  614      inh = 1
  615
  616      IF( interleave ) THEN
  617
  618
  619
  620
  621
  622
  623
  624
  625
  626
  627
  628
  629
  630
  631
  632         ldv = 4*( 
max( npm1, nqm1 ) ) + 2
 
  633
  634         inh = 1
  635
  636         inv = inh + ldv / 2
  637         invt = inh + ( anb+1 )*ldv
  638
  639         inht = invt + ldv / 2
  640         intmp = invt + ldv*( anb+1 )
  641
  642      ELSE
  643         ldv = 
max( npm1, nqm1 )
 
  644
  645         inht = inh + ldv*( anb+1 )
  646         inv = inht + ldv*( anb+1 )
  647
  648
  649
  650
  651
  652
  653
  654         invt = inv + ldv*( anb+1 ) + 1
  655         intmp = invt + ldv*( 2*anb )
  656
  657      END IF
  658
  659      IF( info.NE.0 ) THEN
  660         CALL pxerbla( ictxt, 
'PCHETTRD', -info )
 
  661         work( 1 ) = 
cmplx( lwmin )
 
  662         RETURN
  663      END IF
  664
  665
  666
  667
  668
  669
  670
  671
  672
  673
  674
  675
  676      DO 10 i = 1, np
  677         work( inh+i-1 ) = z_zero
  678         work( inv+i-1 ) = z_zero
  679   10 CONTINUE
  680      DO 20 i = 1, nq
  681         work( inht+i-1 ) = z_zero
  682   20 CONTINUE
  683
  684
  685
  686      topnv = z_zero
  687
  688      ltlip1 = lijp1
  689      ltnm1 = npm1
  690      IF( mycol.GT.myrow ) THEN
  691         ltlip1 = ltlip1 + 1
  692         ltnm1 = ltnm1 - 1
  693      END IF
  694
  695
  696      DO 210 minindex = 1, n - 1, anb
  697
  698
  699         maxindex = 
min( minindex+anb-1, n )
 
  700         lijb = 
numroc( maxindex, 1, mycol, 0, npcol ) + 1
 
  701         liib = 
numroc( maxindex, 1, myrow, 0, nprow ) + 1
 
  702
  703         nqb = nq - lijb + 1
  704         npb = np - liib + 1
  705         inhtb = inht + lijb - 1
  706         invtb = invt + lijb - 1
  707         inhb = inh + liib - 1
  708         invb = inv + liib - 1
  709
  710
  711
  712
  713         DO 160 index = minindex, 
min( maxindex, n-1 )
 
  714
  715            bindex = index - minindex
  716
  717            currow = nxtrow
  718            curcol = nxtcol
  719
  720            nxtrow = mod( currow+1, nprow )
  721            nxtcol = mod( curcol+1, npcol )
  722
  723            lii = liip1
  724            lij = lijp1
  725            npm0 = npm1
  726
  727            IF( myrow.EQ.currow ) THEN
  728               npm1 = npm1 - 1
  729               liip1 = liip1 + 1
  730            END IF
  731            IF( mycol.EQ.curcol ) THEN
  732               nqm1 = nqm1 - 1
  733               lijp1 = lijp1 + 1
  734               ltlip1 = ltlip1 + 1
  735               ltnm1 = ltnm1 - 1
  736            END IF
  737
  738
  739
  740
  741
  742
  743
  744
  745
  746
  747            IF( mycol.EQ.curcol ) THEN
  748
  749               indexa = lii + ( lij-1 )*lda
  750               indexinv = inv + lii - 1 + ( bindex-1 )*ldv
  751               indexinh = inh + lii - 1 + ( bindex-1 )*ldv
  752               ttoph = conjg( work( inht+lij-1+bindex*ldv ) )
  753               ttopv = conjg( topnv )
  754
  755               IF( index.GT.1 ) THEN
  756                  DO 30 i = 0, npm0 - 1
  757
  758                     a( indexa+i ) = a( indexa+i ) -
  759     $                               work( indexinv+ldv+i )*ttoph -
  760     $                               work( indexinh+ldv+i )*ttopv
  761   30             CONTINUE
  762               END IF
  763
  764
  765            END IF
  766
  767
  768            IF( mycol.EQ.curcol ) THEN
  769
  770
  771
  772               IF( myrow.EQ.currow ) THEN
  773                  dtmp( 2 ) = real( a( lii+( lij-1 )*lda ) )
  774               ELSE
  775                  dtmp( 2 ) = zero
  776               END IF
  777               IF( myrow.EQ.nxtrow ) THEN
  778                  dtmp( 3 ) = real( a( liip1+( lij-1 )*lda ) )
  779                  dtmp( 4 ) = aimag( a( liip1+( lij-1 )*lda ) )
  780               ELSE
  781                  dtmp( 3 ) = zero
  782                  dtmp( 4 ) = zero
  783               END IF
  784
  785               norm = scnrm2( npm1, a( liip1+( lij-1 )*lda ), 1 )
  786               dtmp( 1 ) = norm
  787
  788
  789
  790
  791
  792               dtmp( 5 ) = zero
  793               IF( dtmp( 1 ).GE.safmax .OR. dtmp( 1 ).LT.safmin ) THEN
  794                  dtmp( 5 ) = one
  795                  dtmp( 1 ) = zero
  796               END IF
  797
  798               dtmp( 1 ) = dtmp( 1 )*dtmp( 1 )
  799               CALL sgsum2d( ictxt, 'C', ' ', 5, 1, dtmp, 5, -1,
  800     $                       curcol )
  801               IF( dtmp( 5 ).EQ.zero ) THEN
  802                  dtmp( 1 ) = sqrt( dtmp( 1 ) )
  803               ELSE
  804                  dtmp( 1 ) = norm
  805                  CALL pstreecomb( ictxt, 
'C', 1, dtmp, -1, mycol,
 
  807               END IF
  808
  809               norm = dtmp( 1 )
  810
  811               d( lij ) = dtmp( 2 )
  812               IF( myrow.EQ.currow .AND. mycol.EQ.curcol ) THEN
  813                  a( lii+( lij-1 )*lda ) = 
cmplx( d( lij ), zero )
 
  814               END IF
  815
  816
  817               alpha = 
cmplx( dtmp( 3 ), dtmp( 4 ) )
 
  818
  819               norm = sign( norm, real( alpha ) )
  820
  821               IF( norm.EQ.zero ) THEN
  822                  toptau = zero
  823               ELSE
  824                  beta = norm + alpha
  825                  toptau = beta / norm
  826                  oneoverbeta = 1.0e0 / beta
  827
  828                  CALL cscal( npm1, oneoverbeta,
  829     $                        a( liip1+( lij-1 )*lda ), 1 )
  830               END IF
  831
  832               IF( myrow.EQ.nxtrow ) THEN
  833                  a( liip1+( lij-1 )*lda ) = z_one
  834               END IF
  835
  836               tau( lij ) = toptau
  837               e( lij ) = -norm
  838
  839            END IF
  840
  841
  842
  843
  844            DO 40 i = 0, npm1 - 1
  845               work( inv+liip1-1+bindex*ldv+npm1+i ) = a( liip1+i+
  846     $            ( lij-1 )*lda )
  847   40       CONTINUE
  848
  849            IF( mycol.EQ.curcol ) THEN
  850               work( inv+liip1-1+bindex*ldv+npm1+npm1 ) = toptau
  851               CALL cgebs2d( ictxt, 'R', ' ', npm1+npm1+1, 1,
  852     $                       work( inv+liip1-1+bindex*ldv ),
  853     $                       npm1+npm1+1 )
  854            ELSE
  855               CALL cgebr2d( ictxt, 'R', ' ', npm1+npm1+1, 1,
  856     $                       work( inv+liip1-1+bindex*ldv ),
  857     $                       npm1+npm1+1, myrow, curcol )
  858               toptau = work( inv+liip1-1+bindex*ldv+npm1+npm1 )
  859            END IF
  860            DO 50 i = 0, npm1 - 1
  861               work( inh+liip1-1+( bindex+1 )*ldv+i ) = work( inv+liip1-
  862     $            1+bindex*ldv+npm1+i )
  863   50       CONTINUE
  864
  865            IF( index.LT.n ) THEN
  866               IF( myrow.EQ.nxtrow .AND. mycol.EQ.curcol )
  867     $            a( liip1+( lij-1 )*lda ) = e( lij )
  868            END IF
  869
  870
  871
  872
  873            IF( myrow.EQ.mycol ) THEN
  874               DO 60 i = 0, npm1 + npm1
  875                  work( invt+lijp1-1+bindex*ldv+i ) = work( inv+liip1-1+
  876     $               bindex*ldv+i )
  877   60          CONTINUE
  878            ELSE
  879               CALL cgesd2d( ictxt, npm1+npm1, 1,
  880     $                       work( inv+liip1-1+bindex*ldv ), npm1+npm1,
  881     $                       mycol, myrow )
  882               CALL cgerv2d( ictxt, nqm1+nqm1, 1,
  883     $                       work( invt+lijp1-1+bindex*ldv ), nqm1+nqm1,
  884     $                       mycol, myrow )
  885            END IF
  886
  887            DO 70 i = 0, nqm1 - 1
  888               work( inht+lijp1-1+( bindex+1 )*ldv+i ) = work( invt+
  889     $            lijp1-1+bindex*ldv+nqm1+i )
  890   70       CONTINUE
  891
  892
  893
  894
  895            IF( index.GT.1 ) THEN
  896               DO 90 j = lijp1, lijb - 1
  897                  DO 80 i = 0, npm1 - 1
  898
  899                     a( liip1+i+( j-1 )*lda ) = a( liip1+i+( j-1 )*lda )
  900     $                   - work( inv+liip1-1+bindex*ldv+i )*
  901     $                  conjg( work( inht+j-1+bindex*ldv ) ) -
  902     $                  work( inh+liip1-1+bindex*ldv+i )*
  903     $                  conjg( work( invt+j-1+bindex*ldv ) )
  904   80             CONTINUE
  905   90          CONTINUE
  906            END IF
  907
  908
  909
  910
  911
  912
  913
  914
  915
  916
  917
  918
  919
  920            work( inv+liip1-1+( bindex+1 )*ldv ) = z_zero
  921            work( invt+lijp1-1+( bindex+1 )*ldv+nqm1-1 ) = z_zero
  922
  923
  924            IF( myrow.EQ.mycol ) THEN
  925               IF( ltnm1.GT.1 ) THEN
  926                  CALL ctrmvt( 
'L', ltnm1-1,
 
  927     $                         a( ltlip1+1+( lijp1-1 )*lda ), lda,
  928     $                         work( invt+lijp1-1+( bindex+1 )*ldv ), 1,
  929     $                         work( inh+ltlip1+1-1+( bindex+1 )*ldv ),
  930     $                         1, work( inv+ltlip1+1-1+( bindex+1 )*
  931     $                         ldv ), 1, work( inht+lijp1-1+( bindex+
  932     $                         1 )*ldv ), 1 )
  933               END IF
  934               DO 100 i = 1, ltnm1
  935                  work( invt+lijp1+i-1-1+( bindex+1 )*ldv )
  936     $               = work( invt+lijp1+i-1-1+( bindex+1 )*ldv ) +
  937     $               a( ltlip1+i-1+( lijp1+i-1-1 )*lda )*
  938     $               work( inh+ltlip1+i-1-1+( bindex+1 )*ldv )
  939  100          CONTINUE
  940            ELSE
  941               IF( ltnm1.GT.0 )
  942     $            
CALL ctrmvt( 
'L', ltnm1, a( ltlip1+( lijp1-1 )*lda ),
 
  943     $                         lda, work( invt+lijp1-1+( bindex+1 )*
  944     $                         ldv ), 1, work( inh+ltlip1-1+( bindex+
  945     $                         1 )*ldv ), 1, work( inv+ltlip1-1+
  946     $                         ( bindex+1 )*ldv ), 1,
  947     $                         work( inht+lijp1-1+( bindex+1 )*ldv ),
  948     $                         1 )
  949
  950            END IF
  951
  952
  953
  954
  955
  956
  957
  958
  959
  960
  961
  962
  963
  964
  965
  966            DO 110 i = 1, 2*( bindex+1 )
  967               work( intmp-1+i ) = 0
  968  110       CONTINUE
  969
  970            IF( balanced ) THEN
  971               npset = nprow
  972               mysetnum = myrow
  973               rowsperproc = 
iceil( nqb, npset )
 
  974               myfirstrow = 
min( nqb+1, 1+rowsperproc*mysetnum )
 
  975               numrows = 
min( rowsperproc, nqb-myfirstrow+1 )
 
  976
  977
  978
  979
  980               CALL cgemv( 'C', numrows, bindex+1, z_one,
  981     $                     work( inhtb+myfirstrow-1 ), ldv,
  982     $                     work( inhtb+myfirstrow-1+( bindex+1 )*ldv ),
  983     $                     1, z_zero, work( intmp ), 1 )
  984
  985               CALL cgemv( 'C', numrows, bindex+1, z_one,
  986     $                     work( invtb+myfirstrow-1 ), ldv,
  987     $                     work( inhtb+myfirstrow-1+( bindex+1 )*ldv ),
  988     $                     1, z_zero, work( intmp+bindex+1 ), 1 )
  989
  990
  991               CALL cgsum2d( ictxt, 'C', ' ', 2*( bindex+1 ), 1,
  992     $                       work( intmp ), 2*( bindex+1 ), -1, -1 )
  993            ELSE
  994
  995
  996               CALL cgemv( 'C', nqb, bindex+1, z_one, work( inhtb ),
  997     $                     ldv, work( inhtb+( bindex+1 )*ldv ), 1,
  998     $                     z_zero, work( intmp ), 1 )
  999
 1000               CALL cgemv( 'C', nqb, bindex+1, z_one, work( invtb ),
 1001     $                     ldv, work( inhtb+( bindex+1 )*ldv ), 1,
 1002     $                     z_zero, work( intmp+bindex+1 ), 1 )
 1003
 1004            END IF
 1005
 1006
 1007
 1008            IF( balanced ) THEN
 1009               mysetnum = mycol
 1010
 1011               rowsperproc = 
iceil( npb, npset )
 
 1012               myfirstrow = 
min( npb+1, 1+rowsperproc*mysetnum )
 
 1013               numrows = 
min( rowsperproc, npb-myfirstrow+1 )
 
 1014
 1015               CALL cgsum2d( ictxt, 'R', ' ', 2*( bindex+1 ), 1,
 1016     $                       work( intmp ), 2*( bindex+1 ), -1, -1 )
 1017
 1018
 1019
 1020               IF( index.GT.1. ) THEN
 1021                  CALL cgemv( 'N', numrows, bindex+1, z_negone,
 1022     $                        work( invb+myfirstrow-1 ), ldv,
 1023     $                        work( intmp ), 1, z_one,
 1024     $                        work( invb+myfirstrow-1+( bindex+1 )*
 1025     $                        ldv ), 1 )
 1026
 1027
 1028                  CALL cgemv( 'N', numrows, bindex+1, z_negone,
 1029     $                        work( inhb+myfirstrow-1 ), ldv,
 1030     $                        work( intmp+bindex+1 ), 1, z_one,
 1031     $                        work( invb+myfirstrow-1+( bindex+1 )*
 1032     $                        ldv ), 1 )
 1033               END IF
 1034
 1035            ELSE
 1036
 1037               CALL cgemv( 'N', npb, bindex+1, z_negone, work( invb ),
 1038     $                     ldv, work( intmp ), 1, z_one,
 1039     $                     work( invb+( bindex+1 )*ldv ), 1 )
 1040
 1041
 1042
 1043               CALL cgemv( 'N', npb, bindex+1, z_negone, work( inhb ),
 1044     $                     ldv, work( intmp+bindex+1 ), 1, z_one,
 1045     $                     work( invb+( bindex+1 )*ldv ), 1 )
 1046
 1047            END IF
 1048
 1049
 1050
 1051
 1052            IF( myrow.EQ.mycol ) THEN
 1053               DO 120 i = 0, nqm1 - 1
 1054                  work( intmp+i ) = work( invt+lijp1-1+( bindex+1 )*ldv+
 1055     $                              i )
 1056  120          CONTINUE
 1057            ELSE
 1058               CALL cgesd2d( ictxt, nqm1, 1,
 1059     $                       work( invt+lijp1-1+( bindex+1 )*ldv ),
 1060     $                       nqm1, mycol, myrow )
 1061               CALL cgerv2d( ictxt, npm1, 1, work( intmp ), npm1, mycol,
 1062     $                       myrow )
 1063
 1064            END IF
 1065            DO 130 i = 0, npm1 - 1
 1066               work( inv+liip1-1+( bindex+1 )*ldv+i ) = work( inv+liip1-
 1067     $            1+( bindex+1 )*ldv+i ) + work( intmp+i )
 1068  130       CONTINUE
 1069
 1070
 1071
 1072            CALL cgsum2d( ictxt, 'R', ' ', npm1, 1,
 1073     $                    work( inv+liip1-1+( bindex+1 )*ldv ), npm1,
 1074     $                    myrow, nxtcol )
 1075
 1076
 1077
 1078
 1079
 1080
 1081            IF( mycol.EQ.nxtcol ) THEN
 1082               cc( 1 ) = z_zero
 1083               DO 140 i = 0, npm1 - 1
 1084                  cc( 1 ) = cc( 1 ) + conjg( work( inv+liip1-1+( bindex+
 1085     $                      1 )*ldv+i ) )*work( inh+liip1-1+
 1086     $                      ( bindex+1 )*ldv+i )
 1087  140          CONTINUE
 1088               IF( myrow.EQ.nxtrow ) THEN
 1089                  cc( 2 ) = work( inv+liip1-1+( bindex+1 )*ldv )
 1090                  cc( 3 ) = work( inh+liip1-1+( bindex+1 )*ldv )
 1091               ELSE
 1092                  cc( 2 ) = z_zero
 1093                  cc( 3 ) = z_zero
 1094               END IF
 1095               CALL cgsum2d( ictxt, 'C', ' ', 3, 1, cc, 3, -1, nxtcol )
 1096
 1097               topv = cc( 2 )
 1098               c = cc( 1 )
 1099               toph = cc( 3 )
 1100
 1101               topnv = toptau*( topv-c*conjg( toptau ) / 2*toph )
 1102
 1103
 1104
 1105
 1106
 1107               DO 150 i = 0, npm1 - 1
 1108                  work( inv+liip1-1+( bindex+1 )*ldv+i ) = toptau*
 1109     $               ( work( inv+liip1-1+( bindex+1 )*ldv+i )-c*
 1110     $               conjg( toptau ) / 2*work( inh+liip1-1+( bindex+1 )*
 1111     $               ldv+i ) )
 1112  150          CONTINUE
 1113
 1114            END IF
 1115
 1116
 1117  160    CONTINUE
 1118
 1119
 1120
 1121
 1122         IF( maxindex.LT.n ) THEN
 1123
 1124            DO 170 i = 0, npm1 - 1
 1125               work( intmp+i ) = work( inh+liip1-1+anb*ldv+i )
 1126  170       CONTINUE
 1127
 1128
 1129
 1130            IF( .NOT.twogemms ) THEN
 1131               IF( interleave ) THEN
 1132                  ldzg = ldv / 2
 1133               ELSE
 1134                  CALL clamov( 'A', ltnm1, anb, work( inht+lijp1-1 ),
 1135     $                         ldv, work( invt+lijp1-1+anb*ldv ), ldv )
 1136
 1137                  CALL clamov( 'A', ltnm1, anb, work( inv+ltlip1-1 ),
 1138     $                         ldv, work( inh+ltlip1-1+anb*ldv ), ldv )
 1139                  ldzg = ldv
 1140               END IF
 1141               nbzg = anb*2
 1142            ELSE
 1143               ldzg = ldv
 1144               nbzg = anb
 1145            END IF
 1146
 1147
 1148            DO 180 pbmin = 1, ltnm1, pnb
 1149
 1150               pbsize = 
min( pnb, ltnm1-pbmin+1 )
 
 1151               pbmax = 
min( ltnm1, pbmin+pnb-1 )
 
 1152               CALL cgemm( 'N', 'C', pbsize, pbmax, nbzg, z_negone,
 1153     $                     work( inh+ltlip1-1+pbmin-1 ), ldzg,
 1154     $                     work( invt+lijp1-1 ), ldzg, z_one,
 1155     $                     a( ltlip1+pbmin-1+( lijp1-1 )*lda ), lda )
 1156               IF( twogemms ) THEN
 1157                  CALL cgemm( 'N', 'C', pbsize, pbmax, anb, z_negone,
 1158     $                        work( inv+ltlip1-1+pbmin-1 ), ldzg,
 1159     $                        work( inht+lijp1-1 ), ldzg, z_one,
 1160     $                        a( ltlip1+pbmin-1+( lijp1-1 )*lda ), lda )
 1161               END IF
 1162  180       CONTINUE
 1163
 1164
 1165
 1166            DO 190 i = 0, npm1 - 1
 1167               work( inv+liip1-1+i ) = work( inv+liip1-1+anb*ldv+i )
 1168               work( inh+liip1-1+i ) = work( intmp+i )
 1169  190       CONTINUE
 1170            DO 200 i = 0, nqm1 - 1
 1171               work( inht+lijp1-1+i ) = work( inht+lijp1-1+anb*ldv+i )
 1172  200       CONTINUE
 1173
 1174
 1175         END IF
 1176
 1177
 1178
 1179  210 CONTINUE
 1180
 1181      IF( mycol.EQ.nxtcol ) THEN
 1182         IF( myrow.EQ.nxtrow ) THEN
 1183
 1184            d( nq ) = real( a( np+( nq-1 )*lda ) )
 1185            a( np+( nq-1 )*lda ) = d( nq )
 1186
 1187            CALL sgebs2d( ictxt, 'C', ' ', 1, 1, d( nq ), 1 )
 1188         ELSE
 1189            CALL sgebr2d( ictxt, 'C', ' ', 1, 1, d( nq ), 1, nxtrow,
 1190     $                    nxtcol )
 1191         END IF
 1192      END IF
 1193
 1194
 1195
 1196
 1197      work( 1 ) = 
cmplx( lwmin )
 
 1198      RETURN
 1199
 1200
 1201
 1202
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
 
subroutine ctrmvt(uplo, n, t, ldt, x, incx, y, incy, w, incw, z, incz)
 
integer function iceil(inum, idenom)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)
 
real function pslamch(ictxt, cmach)
 
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
 
integer function pjlaenv(ictxt, ispec, name, opts, n1, n2, n3, n4)
 
subroutine scombnrm2(x, y)
 
subroutine pstreecomb(ictxt, scope, n, mine, rdest0, cdest0, subptr)
 
subroutine pxerbla(ictxt, srname, info)