2
    3
    4
    5
    6
    7
    8
    9      INTEGER            INDX, INCX, IX, JX, N
   10      COMPLEX            AMAX
   11
   12
   13      INTEGER            DESCX( * )
   14      COMPLEX            X( * )
   15
   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      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  149     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  150      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  151     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  152     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  153      COMPLEX            ZERO
  154      parameter( zero = ( 0.0e+0, 0.0e+0 ) )
  155
  156
  157      CHARACTER          CBTOP, CCTOP, RBTOP, RCTOP
  158      INTEGER            ICOFF, ICTXT, IDUMM, IIX, IROFF, IXCOL, IXROW,
  159     $                   JJX, LCINDX, LDX, MAXPOS, MYCOL, MYROW, NP,
  160     $                   NPCOL, NPROW, NQ
  161
  162
  163      COMPLEX            WORK( 2 )
  164
  165
  168     $                   pb_topget
  169
  170
  171      LOGICAL            LSAME
  172      INTEGER            ICMAX1, INDXL2G, NUMROC
  174
  175
  176      INTRINSIC          abs, 
cmplx, mod, nint, real
 
  177
  178
  179
  180
  181
  182      ictxt = descx( ctxt_ )
  183      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  184
  185
  186
  187      indx = 0
  188      amax = zero
  189      IF( n.LE.0 )
  190     $   RETURN
  191
  192
  193
  194      ldx = descx( lld_ )
  195      CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
 
  196     $              ixrow, ixcol )
  197
  198      IF( incx.EQ.1 .AND. descx( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
  199         indx = jx
  200         amax = x( iix+(jjx-1)*ldx )
  201         RETURN
  202      END IF
  203
  204
  205
  206      IF( incx.EQ.descx( m_ ) ) THEN
  207
  208         IF( myrow.EQ.ixrow ) THEN
  209
  210            icoff = mod( jx-1, descx( nb_ ) )
  211            nq = 
numroc( n+icoff, descx( nb_ ), mycol, ixcol, npcol )
 
  212            IF( mycol.EQ.ixcol )
  213     $         nq = nq-icoff
  214
  215            CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rbtop )
  216
  217            IF( 
lsame( rbtop, 
' ' ) ) 
THEN 
  218
  219               IF( nq.GT.0 ) THEN
  220                  lcindx = jjx-1+icmax1( nq, x( iix+(jjx-1)*ldx ), ldx )
  221                  work( 1 ) = x( iix+(lcindx-1)*ldx )
  223     $              descx( nb_ ), mycol, descx( csrc_ ), npcol ) ) )
  224               ELSE
  225                  work( 1 ) = zero
  226                  work( 2 ) = zero
  227               END IF
  228
  229               CALL pctreecomb( ictxt, 
'Row', 2, work, -1, mycol,
 
  231
  232               amax = work( 1 )
  233               IF( amax.EQ.zero ) THEN
  234                  indx = jx
  235               ELSE
  236                  indx = nint( real( work( 2 ) ) )
  237               END IF
  238
  239            ELSE
  240
  241               CALL pb_topget( ictxt, 'Combine', 'Rowwise', rctop )
  242
  243               IF( nq.GT.0 ) THEN
  244                  lcindx = jjx-1+icmax1( nq, x( iix+(jjx-1)*ldx ), ldx )
  245                  amax = x( iix + (lcindx-1)*ldx )
  246               ELSE
  247                  amax = zero
  248               END IF
  249
  250
  251
  252               CALL cgamx2d( ictxt, 'Rowwise', rctop, 1, 1, amax, 1,
  253     $                       idumm, maxpos, 1, -1, myrow )
  254
  255               IF( amax.NE.zero ) THEN
  256
  257
  258
  259                  IF( mycol.EQ.maxpos ) THEN
  260                     indx = 
indxl2g( lcindx, descx( nb_ ), mycol,
 
  261     $                               descx( csrc_ ), npcol )
  262                     CALL igebs2d( ictxt, 'Rowwise', rbtop, 1, 1, indx,
  263     $                             1 )
  264                  ELSE
  265                     CALL igebr2d( ictxt, 'Rowwise', rbtop, 1, 1, indx,
  266     $                             1, myrow, maxpos )
  267                  END IF
  268
  269               ELSE
  270
  271                  indx = jx
  272
  273               END IF
  274
  275            END IF
  276
  277         END IF
  278
  279      ELSE
  280
  281         IF( mycol.EQ.ixcol ) THEN
  282
  283            iroff = mod( ix-1, descx( mb_ ) )
  284            np = 
numroc( n+iroff, descx( mb_ ), myrow, ixrow, nprow )
 
  285            IF( myrow.EQ.ixrow )
  286     $         np = np-iroff
  287
  288            CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', cbtop )
  289
  290            IF( 
lsame( cbtop, 
' ' ) ) 
THEN 
  291
  292               IF( np.GT.0 ) THEN
  293                  lcindx = iix-1+icmax1( np, x( iix+(jjx-1)*ldx ), 1 )
  294                  work( 1 ) = x( lcindx + (jjx-1)*ldx )
  296     $              descx( mb_ ), myrow, descx( rsrc_ ), nprow ) ) )
  297               ELSE
  298                  work( 1 ) = zero
  299                  work( 2 ) = zero
  300               END IF
  301
  302               CALL pctreecomb( ictxt, 
'Column', 2, work, -1, mycol,
 
  304
  305               amax = work( 1 )
  306               IF( amax.EQ.zero ) THEN
  307                  indx = ix
  308               ELSE
  309                  indx = nint( real( work( 2 ) ) )
  310               END IF
  311
  312            ELSE
  313
  314               CALL pb_topget( ictxt, 'Combine', 'Columnwise', cctop )
  315
  316               IF( np.GT.0 ) THEN
  317                  lcindx = iix-1+icmax1( np, x( iix+(jjx-1)*ldx ), 1 )
  318                  amax = x( lcindx + (jjx-1)*ldx )
  319               ELSE
  320                  amax = zero
  321               END IF
  322
  323
  324
  325               CALL cgamx2d( ictxt, 'Columnwise', cctop, 1, 1, amax, 1,
  326     $                       maxpos, idumm, 1, -1, mycol )
  327
  328               IF( amax.NE.zero ) THEN
  329
  330
  331
  332                  IF( myrow.EQ.maxpos ) THEN
  333                     indx = 
indxl2g( lcindx, descx( mb_ ), myrow,
 
  334     $                               descx( rsrc_ ), nprow )
  335                     CALL igebs2d( ictxt, 'Columnwise', cbtop, 1, 1,
  336     $                             indx, 1 )
  337                  ELSE
  338                     CALL igebr2d( ictxt, 'Columnwise', cbtop, 1, 1,
  339     $                             indx, 1, maxpos, mycol )
  340                  END IF
  341
  342               ELSE
  343
  344                  indx = ix
  345
  346               END IF
  347
  348            END IF
  349
  350         END IF
  351
  352      END IF
  353
  354      RETURN
  355
  356
  357
integer function indxl2g(indxloc, nb, iproc, isrcproc, nprocs)
 
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)
 
subroutine ccombamax1(v1, v2)
 
subroutine pctreecomb(ictxt, scope, n, mine, rdest0, cdest0, subptr)