3
    4
    5
    6
    7
    8
    9
   10      CHARACTER          SIDE
   11      INTEGER            IC, INCV, IV, JC, JV, L, M, N
   12
   13
   14      INTEGER            DESCC( * ), DESCV( * )
   15      COMPLEX            C( * ), TAU( * ), V( * ), 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      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  237     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  238      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  239     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  240     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  241      COMPLEX            ONE, ZERO
  242      parameter( one  = ( 1.0e+0, 0.0e+0 ),
  243     $                     zero = ( 0.0e+0, 0.0e+0 ) )
  244
  245
  246      LOGICAL            CCBLCK, CRBLCK, LEFT
  247      CHARACTER          COLBTOP, ROWBTOP
  248      INTEGER            ICCOL1, ICCOL2, ICOFFC1, ICOFFC2, ICOFFV,
  249     $                   ICROW1, ICROW2, ICTXT, IIC1, IIC2, IIV, IOFFC1,
  250     $                   IOFFC2, IOFFV, IPW, IROFFC1, IROFFC2, IROFFV,
  251     $                   IVCOL, IVROW, JJC1, JJC2, JJV, LDC, LDV, MPC2,
  252     $                   MPV, MYCOL, MYROW, NCC, NCV, NPCOL, NPROW,
  253     $                   NQC2, NQV, RDEST
  254      COMPLEX            TAULOC( 1 )
  255
  256
  257      EXTERNAL           blacs_gridinfo, caxpy, ccopy, cgebr2d,
  258     $                   cgebs2d, cgemv, cgerc, cgerv2d,
  259     $                   cgesd2d, cgsum2d, claset, 
infog2l,
 
  261
  262
  263      LOGICAL            LSAME
  264      INTEGER            NUMROC
  266
  267
  269
  270
  271
  272
  273
  274      IF( m.LE.0 .OR. n.LE.0 )
  275     $   RETURN
  276
  277
  278
  279      ictxt = descc( ctxt_ )
  280      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  281
  282
  283
  284      left = 
lsame( side, 
'L' )
 
  285      CALL infog2l( iv, jv, descv, nprow, npcol, myrow, mycol, iiv, jjv,
 
  286     $              ivrow, ivcol )
  287      iroffv = mod( iv-1, descv( nb_ ) )
  288      mpv = 
numroc( l+iroffv, descv( mb_ ), myrow, ivrow, nprow )
 
  289      IF( myrow.EQ.ivrow )
  290     $   mpv = mpv - iroffv
  291      icoffv = mod( jv-1, descv( nb_ ) )
  292      nqv = 
numroc( l+icoffv, descv( nb_ ), mycol, ivcol, npcol )
 
  293      IF( mycol.EQ.ivcol )
  294     $   nqv = nqv - icoffv
  295      ldv = descv( lld_ )
  296      ncv = 
numroc( descv( n_ ), descv( nb_ ), mycol, descv( csrc_ ),
 
  297     $              npcol )
  298      ldv = descv( lld_ )
  299      iiv = 
min( iiv, ldv )
 
  300      jjv = 
min( jjv, ncv )
 
  301      ioffv = iiv+(jjv-1)*ldv
  302      ncc = 
numroc( descc( n_ ), descc( nb_ ), mycol, descc( csrc_ ),
 
  303     $              npcol )
  304      CALL infog2l( ic, jc, descc, nprow, npcol, myrow, mycol,
 
  305     $              iic1, jjc1, icrow1, iccol1 )
  306      iroffc1 = mod( ic-1, descc( mb_ ) )
  307      icoffc1 = mod( jc-1, descc( nb_ ) )
  308      ldc = descc( lld_ )
  309      iic1 = 
min( iic1, ldc )
 
  310      jjc1 = 
min( jjc1, 
max( 1, ncc ) )
 
  311      ioffc1 = iic1 + ( jjc1-1 ) * ldc
  312
  313      IF( left ) THEN
  314         CALL infog2l( ic+m-l, jc, descc, nprow, npcol, myrow, mycol,
 
  315     $                 iic2, jjc2, icrow2, iccol2 )
  316         iroffc2 = mod( ic+m-l-1, descc( mb_ ) )
  317         icoffc2 = mod( jc-1, descc( nb_ ) )
  318         nqc2 = 
numroc( n+icoffc2, descc( nb_ ), mycol, iccol2, npcol )
 
  319         IF( mycol.EQ.iccol2 )
  320     $      nqc2 = nqc2 - icoffc2
  321      ELSE
  322         CALL infog2l( ic, jc+n-l, descc, nprow, npcol, myrow, mycol,
 
  323     $                 iic2, jjc2, icrow2, iccol2 )
  324         iroffc2 = mod( ic-1, descc( mb_ ) )
  325         mpc2 = 
numroc( m+iroffc2, descc( mb_ ), myrow, icrow2, nprow )
 
  326         IF( myrow.EQ.icrow2 )
  327     $      mpc2 = mpc2 - iroffc2
  328         icoffc2 = mod( jc+n-l-1, descc( nb_ ) )
  329      END IF
  330      iic2 = 
min( iic2, ldc )
 
  331      jjc2 = 
min( jjc2, ncc )
 
  332      ioffc2 = iic2 + ( jjc2-1 ) * ldc
  333
  334
  335
  336      crblck = ( m.LE.(descc( mb_ )-iroffc1) )
  337
  338
  339
  340      ccblck = ( n.LE.(descc( nb_ )-icoffc1) )
  341
  342      IF( left ) THEN
  343
  344         IF( crblck ) THEN
  345            rdest = icrow2
  346         ELSE
  347            rdest = -1
  348         END IF
  349
  350         IF( ccblck ) THEN
  351
  352
  353
  354            IF( descv( m_ ).EQ.incv ) THEN
  355
  356
  357
  358               ipw = mpv+1
  359               CALL pbctrnv( ictxt, 
'Rowwise', 
'Transpose', m,
 
  360     $                       descv( nb_ ), iroffc2, v( ioffv ), ldv,
  361     $                       zero,
  362     $                       work, 1, ivrow, ivcol, icrow2, iccol2,
  363     $                       work( ipw ) )
  364
  365
  366
  367               IF( mycol.EQ.iccol2 ) THEN
  368
  369                  IF( myrow.EQ.ivrow ) THEN
  370
  371                     CALL cgebs2d( ictxt, 'Columnwise', ' ', 1, 1,
  372     $                             tau( iiv ), 1 )
  373                     tauloc( 1 ) = conjg( tau( iiv ) )
  374
  375                  ELSE
  376
  377                     CALL cgebr2d( ictxt, 'Columnwise', ' ', 1, 1,
  378     $                             tauloc, 1, ivrow, mycol )
  379                     tauloc( 1 ) = conjg( tauloc( 1 ) )
  380
  381                  END IF
  382
  383                  IF( tauloc( 1 ).NE.zero ) THEN
  384
  385
  386
  387                     IF( mpv.GT.0 ) THEN
  388                        CALL cgemv( 'Conjugate transpose', mpv, nqc2,
  389     $                              one, c( ioffc2 ), ldc, work, 1,
  390     $                              zero, work( ipw ), 1 )
  391                     ELSE
  392                        CALL claset( 'All', nqc2, 1, zero, zero,
  393     $                               work( ipw ), 
max( 1, nqc2 ) )
 
  394                     END IF
  395                     IF( myrow.EQ.icrow1 )
  396     $                  CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
  397     $                              work( ipw ), 
max( 1, nqc2 ) )
 
  398
  399                     CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
  400     $                             work( ipw ), 
max( 1, nqc2 ), rdest,
 
  401     $                             mycol )
  402
  403
  404
  405                     IF( myrow.EQ.icrow1 )
  406     $                  CALL caxpy( nqc2, -tauloc( 1 ), work( ipw ),
  407     $                              
max( 1, nqc2 ), c( ioffc1 ), ldc )
 
  408                     CALL cgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
  409     $                           work( ipw ), 1, c( ioffc2 ), ldc )
  410                  END IF
  411
  412               END IF
  413
  414            ELSE
  415
  416
  417
  418               IF( ivcol.EQ.iccol2 ) THEN
  419
  420
  421
  422                  IF( mycol.EQ.iccol2 ) THEN
  423
  424                     tauloc( 1 ) = conjg( tau( jjv ) )
  425
  426                     IF( tauloc( 1 ).NE.zero ) THEN
  427
  428
  429
  430                        IF( mpv.GT.0 ) THEN
  431                           CALL cgemv( 'Conjugate transpose', mpv, nqc2,
  432     $                              one, c( ioffc2 ), ldc, v( ioffv ),
  433     $                              1, zero, work, 1 )
  434                        ELSE
  435                           CALL claset( 'All', nqc2, 1, zero, zero,
  436     $                                  work, 
max( 1, nqc2 ) )
 
  437                        END IF
  438                        IF( myrow.EQ.icrow1 )
  439     $                     CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
  440     $                                 work, 
max( 1, nqc2 ) )
 
  441
  442                        CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
  443     $                                work, 
max( 1, nqc2 ), rdest,
 
  444     $                                mycol )
  445
  446
  447
  448                        IF( myrow.EQ.icrow1 )
  449     $                     CALL caxpy( nqc2, -tauloc( 1 ), work,
  450     $                                 
max( 1, nqc2 ), c( ioffc1 ),
 
  451     $                                 ldc )
  452                        CALL cgerc( mpv, nqc2, -tauloc( 1 ), v( ioffv ),
  453     $                              1, work, 1, c( ioffc2 ), ldc )
  454                     END IF
  455
  456                  END IF
  457
  458               ELSE
  459
  460
  461
  462                  IF( mycol.EQ.ivcol ) THEN
  463
  464                     ipw = mpv+1
  465                     CALL ccopy( mpv, v( ioffv ), 1, work, 1 )
  466                     work( ipw ) = tau( jjv )
  467                     CALL cgesd2d( ictxt, ipw, 1, work, ipw, myrow,
  468     $                             iccol2 )
  469
  470                  ELSE IF( mycol.EQ.iccol2 ) THEN
  471
  472                     ipw = mpv+1
  473                     CALL cgerv2d( ictxt, ipw, 1, work, ipw, myrow,
  474     $                             ivcol )
  475                     tauloc( 1 ) = conjg( work( ipw ) )
  476
  477                     IF( tauloc( 1 ).NE.zero ) THEN
  478
  479
  480
  481                        IF( mpv.GT.0 ) THEN
  482                           CALL cgemv( 'Conjugate transpose', mpv, nqc2,
  483     $                                 one, c( ioffc2 ), ldc, work, 1,
  484     $                                 zero, work( ipw ), 1 )
  485                        ELSE
  486                           CALL claset( 'All', nqc2, 1, zero, zero,
  487     $                                  work( ipw ), 
max( 1, nqc2 ) )
 
  488                        END IF
  489                        IF( myrow.EQ.icrow1 )
  490     $                     CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
  491     $                                 work( ipw ), 
max( 1, nqc2 ) )
 
  492
  493                        CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
  494     $                                work( ipw ), 
max( 1, nqc2 ),
 
  495     $                                rdest, mycol )
  496
  497
  498
  499                        IF( myrow.EQ.icrow1 )
  500     $                     CALL caxpy( nqc2, -tauloc( 1 ), work( ipw ),
  501     $                                 
max( 1, nqc2 ), c( ioffc1 ),
 
  502     $                                 ldc )
  503                        CALL cgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
  504     $                              work( ipw ), 1, c( ioffc2 ), ldc )
  505                     END IF
  506
  507                  END IF
  508
  509               END IF
  510
  511            END IF
  512
  513         ELSE
  514
  515
  516
  517            IF( descv( m_ ).EQ.incv ) THEN
  518
  519
  520
  521               ipw = mpv+1
  522               CALL pbctrnv( ictxt, 
'Rowwise', 
'Transpose', m,
 
  523     $                       descv( nb_ ), iroffc2, v( ioffv ), ldv,
  524     $                       zero,
  525     $                       work, 1, ivrow, ivcol, icrow2, -1,
  526     $                       work( ipw ) )
  527
  528
  529
  530               IF( myrow.EQ.ivrow ) THEN
  531
  532                  CALL cgebs2d( ictxt, 'Columnwise', ' ', 1, 1,
  533     $                          tau( iiv ), 1 )
  534                  tauloc( 1 ) = conjg( tau( iiv ) )
  535
  536               ELSE
  537
  538                  CALL cgebr2d( ictxt, 'Columnwise', ' ', 1, 1, tauloc,
  539     $                          1, ivrow, mycol )
  540                  tauloc( 1 ) = conjg( tauloc( 1 ) )
  541
  542               END IF
  543
  544               IF( tauloc( 1 ).NE.zero ) THEN
  545
  546
  547
  548                  IF( mpv.GT.0 ) THEN
  549                     CALL cgemv( 'Conjugate transpose', mpv, nqc2, one,
  550     $                           c( ioffc2 ), ldc, work, 1, zero,
  551     $                           work( ipw ), 1 )
  552                  ELSE
  553                     CALL claset( 'All', nqc2, 1, zero, zero,
  554     $                            work( ipw ), 
max( 1, nqc2 ) )
 
  555                  END IF
  556                  IF( myrow.EQ.icrow1 )
  557     $               CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
  558     $                           work( ipw ), 
max( 1, nqc2 ) )
 
  559
  560                  CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
  561     $                          work( ipw ), 
max( 1, nqc2 ), rdest,
 
  562     $                          mycol )
  563
  564
  565
  566                  IF( myrow.EQ.icrow1 )
  567     $               CALL caxpy( nqc2, -tauloc( 1 ), work( ipw ),
  568     $                           
max( 1, nqc2 ), c( ioffc1 ), ldc )
 
  569                  CALL cgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
  570     $                        work( ipw ), 1, c( ioffc2 ), ldc )
  571               END IF
  572
  573            ELSE
  574
  575
  576
  577               CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  578               IF( mycol.EQ.ivcol ) THEN
  579
  580                  ipw = mpv+1
  581                  CALL ccopy( mpv, v( ioffv ), 1, work, 1 )
  582                  work( ipw ) = tau( jjv )
  583                  CALL cgebs2d( ictxt, 'Rowwise', rowbtop, ipw, 1,
  584     $                          work, ipw )
  585                  tauloc( 1 ) = conjg( tau( jjv ) )
  586
  587               ELSE
  588
  589                  ipw = mpv+1
  590                  CALL cgebr2d( ictxt, 'Rowwise', rowbtop, ipw, 1, work,
  591     $                          ipw, myrow, ivcol )
  592                  tauloc( 1 ) = conjg( work( ipw ) )
  593
  594               END IF
  595
  596               IF( tauloc( 1 ).NE.zero ) THEN
  597
  598
  599
  600                  IF( mpv.GT.0 ) THEN
  601                     CALL cgemv( 'Conjugate transpose', mpv, nqc2, one,
  602     $                           c( ioffc2 ), ldc, work, 1, zero,
  603     $                           work( ipw ), 1 )
  604                  ELSE
  605                     CALL claset( 'All', nqc2, 1, zero, zero,
  606     $                            work( ipw ), 
max( 1, nqc2 ) )
 
  607                  END IF
  608                  IF( myrow.EQ.icrow1 )
  609     $               CALL caxpy( nqc2, one, c( ioffc1 ), ldc,
  610     $                           work( ipw ), 
max( 1, nqc2 ) )
 
  611
  612                  CALL cgsum2d( ictxt, 'Columnwise', ' ', nqc2, 1,
  613     $                          work( ipw ), 
max( 1, nqc2 ), rdest,
 
  614     $                          mycol )
  615
  616
  617
  618                  IF( myrow.EQ.icrow1 )
  619     $               CALL caxpy( nqc2, -tauloc( 1 ), work( ipw ),
  620     $                           
max( 1, nqc2 ), c( ioffc1 ), ldc )
 
  621                  CALL cgerc( mpv, nqc2, -tauloc( 1 ), work, 1,
  622     $                        work( ipw ), 1, c( ioffc2 ), ldc )
  623               END IF
  624
  625            END IF
  626
  627         END IF
  628
  629      ELSE
  630
  631         IF( ccblck ) THEN
  632            rdest = myrow
  633         ELSE
  634            rdest = -1
  635         END IF
  636
  637         IF( crblck ) THEN
  638
  639
  640
  641            IF( descv( m_ ).EQ.incv ) THEN
  642
  643
  644
  645               IF( ivrow.EQ.icrow2 ) THEN
  646
  647
  648
  649                  IF( myrow.EQ.icrow2 ) THEN
  650
  651                     tauloc( 1 ) = conjg( tau( iiv ) )
  652
  653                     IF( tauloc( 1 ).NE.zero ) THEN
  654
  655
  656
  657                        IF( nqv.GT.0 ) THEN
  658                           CALL cgemv( 'No transpose', mpc2, nqv, one,
  659     $                                 c( ioffc2 ), ldc, v( ioffv ),
  660     $                                 ldv, zero, work, 1 )
  661                        ELSE
  662                           CALL claset( 'All', mpc2, 1, zero, zero,
  663     $                                  work, 
max( 1, mpc2 ) )
 
  664                        END IF
  665                        IF( mycol.EQ.iccol1 )
  666     $                     CALL caxpy( mpc2, one, c( ioffc1 ), 1,
  667     $                                   work, 1 )
  668
  669                        CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
  670     $                                work, 
max( 1, mpc2 ), rdest,
 
  671     $                               iccol2 )
  672
  673                        IF( mycol.EQ.iccol1 )
  674     $                     CALL caxpy( mpc2, -tauloc( 1 ), work, 1,
  675     $                                 c( ioffc1 ), 1 )
  676
  677
  678
  679                        CALL cgerc( mpc2, nqv, -tauloc( 1 ), work, 1,
  680     $                              v( ioffv ), ldv, c( ioffc2 ), ldc )
  681                     END IF
  682
  683                  END IF
  684
  685               ELSE
  686
  687
  688
  689                  IF( myrow.EQ.ivrow ) THEN
  690
  691                     ipw = nqv+1
  692                     CALL ccopy( nqv, v( ioffv ), ldv, work, 1 )
  693                     work( ipw ) = tau( iiv )
  694                     CALL cgesd2d( ictxt, ipw, 1, work, ipw, icrow2,
  695     $                             mycol )
  696
  697                  ELSE IF( myrow.EQ.icrow2 ) THEN
  698
  699                     ipw = nqv+1
  700                     CALL cgerv2d( ictxt, ipw, 1, work, ipw, ivrow,
  701     $                             mycol )
  702                     tauloc( 1 ) = conjg( work( ipw ) )
  703
  704                     IF( tauloc( 1 ).NE.zero ) THEN
  705
  706
  707
  708                        IF( nqv.GT.0 ) THEN
  709                           CALL cgemv( 'No transpose', mpc2, nqv, one,
  710     $                                 c( ioffc2 ), ldc, work, 1, zero,
  711     $                                 work( ipw ), 1 )
  712                        ELSE
  713                           CALL claset( 'All', mpc2, 1, zero, zero,
  714     $                                  work( ipw ), 
max( 1, mpc2 ) )
 
  715                        END IF
  716                        IF( mycol.EQ.iccol1 )
  717     $                     CALL caxpy( mpc2, one, c( ioffc1 ), 1,
  718     $                                   work( ipw ), 1 )
  719                        CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
  720     $                                work( ipw ), 
max( 1, mpc2 ),
 
  721     $                                rdest, iccol2 )
  722                        IF( mycol.EQ.iccol1 )
  723     $                     CALL caxpy( mpc2, -tauloc( 1 ), work( ipw ),
  724     $                                 1, c( ioffc1 ), 1 )
  725
  726
  727
  728                        CALL cgerc( mpc2, nqv, -tauloc( 1 ),
  729     $                              work( ipw ), 1, work, 1,
  730     $                              c( ioffc2 ), ldc )
  731                     END IF
  732
  733                  END IF
  734
  735               END IF
  736
  737            ELSE
  738
  739
  740
  741               ipw = nqv+1
  742               CALL pbctrnv( ictxt, 
'Columnwise', 
'Transpose', n,
 
  743     $                       descv( mb_ ), icoffc2, v( ioffv ), 1, zero,
  744     $                       work, 1, ivrow, ivcol, icrow2, iccol2,
  745     $                       work( ipw ) )
  746
  747
  748
  749               IF( myrow.EQ.icrow2 ) THEN
  750
  751                  IF( mycol.EQ.ivcol ) THEN
  752
  753                     CALL cgebs2d( ictxt, 'Rowwise', ' ', 1, 1,
  754     $                             tau( jjv ), 1 )
  755                     tauloc( 1 ) = conjg( tau( jjv ) )
  756
  757                  ELSE
  758
  759                     CALL cgebr2d( ictxt, 'Rowwise', ' ', 1, 1, tauloc,
  760     $                             1, myrow, ivcol )
  761                     tauloc( 1 ) = conjg( tauloc( 1 ) )
  762
  763                  END IF
  764
  765                  IF( tauloc( 1 ).NE.zero ) THEN
  766
  767
  768
  769                     IF( nqv.GT.0 ) THEN
  770                        CALL cgemv( 'No transpose', mpc2, nqv, one,
  771     $                              c( ioffc2 ), ldc, work, 1, zero,
  772     $                              work( ipw ), 1 )
  773                     ELSE
  774                        CALL claset( 'All', mpc2, 1, zero, zero,
  775     $                               work( ipw ), 
max( 1, mpc2 ) )
 
  776                     END IF
  777                     IF( mycol.EQ.iccol1 )
  778     $                  CALL caxpy( mpc2, one, c( ioffc1 ), 1,
  779     $                              work( ipw ), 1 )
  780                     CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
  781     $                             work( ipw ), 
max( 1, mpc2 ), rdest,
 
  782     $                             iccol2 )
  783                     IF( mycol.EQ.iccol1 )
  784     $                  CALL caxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
  785     $                              c( ioffc1 ), 1 )
  786
  787
  788
  789                     CALL cgerc( mpc2, nqv, -tauloc( 1 ), work( ipw ),
  790     $                           1, work, 1, c( ioffc2 ), ldc )
  791                  END IF
  792
  793               END IF
  794
  795            END IF
  796
  797         ELSE
  798
  799
  800
  801            IF( descv( m_ ).EQ.incv ) THEN
  802
  803
  804
  805               CALL pb_topget( ictxt, 'Broadcast', 'Columnwise',
  806     $                         colbtop )
  807               IF( myrow.EQ.ivrow ) THEN
  808
  809                  ipw = nqv+1
  810                  CALL ccopy( nqv, v( ioffv ), ldv, work, 1 )
  811                  work( ipw ) = tau( iiv )
  812                  CALL cgebs2d( ictxt, 'Columnwise', colbtop, ipw, 1,
  813     $                          work, ipw )
  814                  tauloc( 1 ) = conjg( tau( iiv ) )
  815
  816               ELSE
  817
  818                  ipw = nqv+1
  819                  CALL cgebr2d( ictxt, 'Columnwise', colbtop, ipw, 1,
  820     $                          work, ipw, ivrow, mycol )
  821                  tauloc( 1 ) = conjg( work( ipw ) )
  822
  823               END IF
  824
  825               IF( tauloc( 1 ).NE.zero ) THEN
  826
  827
  828
  829                  IF( nqv.GT.0 ) THEN
  830                     CALL cgemv( 'No Transpose', mpc2, nqv, one,
  831     $                           c( ioffc2 ), ldc, work, 1, zero,
  832     $                           work( ipw ), 1 )
  833                  ELSE
  834                     CALL claset( 'All', mpc2, 1, zero, zero,
  835     $                            work( ipw ), 
max( 1, mpc2 ) )
 
  836                  END IF
  837                  IF( mycol.EQ.iccol1 )
  838     $               CALL caxpy( mpc2, one, c( ioffc1 ), 1,
  839     $                           work( ipw ), 1 )
  840
  841                  CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
  842     $                          work( ipw ), 
max( 1, mpc2 ), rdest,
 
  843     $                          iccol2 )
  844                  IF( mycol.EQ.iccol1 )
  845     $               CALL caxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
  846     $                           c( ioffc1 ), 1 )
  847
  848
  849
  850                  CALL cgerc( mpc2, nqv, -tauloc( 1 ), work( ipw ), 1,
  851     $                        work, 1, c( ioffc2 ), ldc )
  852               END IF
  853
  854            ELSE
  855
  856
  857
  858               ipw = nqv+1
  859               CALL pbctrnv( ictxt, 
'Columnwise', 
'Transpose', n,
 
  860     $                       descv( mb_ ), icoffc2, v( ioffv ), 1, zero,
  861     $                       work, 1, ivrow, ivcol, -1, iccol2,
  862     $                       work( ipw ) )
  863
  864
  865
  866               IF( mycol.EQ.ivcol ) THEN
  867
  868                  CALL cgebs2d( ictxt, 'Rowwise', ' ', 1, 1, tau( jjv ),
  869     $                          1 )
  870                  tauloc( 1 ) = conjg( tau( jjv ) )
  871
  872               ELSE
  873
  874                  CALL cgebr2d( ictxt, 'Rowwise', ' ', 1, 1,
  875     $                          tauloc( 1 ), 1, myrow, ivcol )
  876                  tauloc( 1 ) = conjg( tauloc( 1 ) )
  877
  878               END IF
  879
  880               IF( tauloc( 1 ).NE.zero ) THEN
  881
  882
  883
  884                  IF( nqv.GT.0 ) THEN
  885                     CALL cgemv( 'No transpose', mpc2, nqv, one,
  886     $                           c( ioffc2 ), ldc, work, 1, zero,
  887     $                           work( ipw ), 1 )
  888                  ELSE
  889                     CALL claset( 'All', mpc2, 1, zero, zero,
  890     $                            work( ipw ), 
max( 1, mpc2 ) )
 
  891                  END IF
  892                  IF( mycol.EQ.iccol1 )
  893     $               CALL caxpy( mpc2, one, c( ioffc1 ), 1,
  894     $                           work( ipw ), 1 )
  895                  CALL cgsum2d( ictxt, 'Rowwise', ' ', mpc2, 1,
  896     $                          work( ipw ), 
max( 1, mpc2 ), rdest,
 
  897     $                          iccol2 )
  898                  IF( mycol.EQ.iccol1 )
  899     $               CALL caxpy( mpc2, -tauloc( 1 ), work( ipw ), 1,
  900     $                           c( ioffc1 ), 1 )
  901
  902
  903
  904                  CALL cgerc( mpc2, nqv, -tauloc( 1 ), work( ipw ), 1,
  905     $                        work, 1, c( ioffc2 ), ldc )
  906               END IF
  907
  908            END IF
  909
  910         END IF
  911
  912      END IF
  913
  914      RETURN
  915
  916
  917
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)
 
subroutine pbctrnv(icontxt, xdist, trans, n, nb, nz, x, incx, beta, y, incy, ixrow, ixcol, iyrow, iycol, work)