5
    6
    7
    8
    9
   10
   11
   12      INTEGER            IZ, JZ, LDZI, LRWORK, N
   13
   14
   15      INTEGER            DESCZ( * ), KEY( * ), NVS( * )
   16      REAL               RWORK( * ), ZIN( LDZI, * )
   17      COMPLEX            Z( * )
   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      INTEGER            BLOCK_CYCLIC_2D, DLEN_, DTYPE_, CTXT_, M_, N_,
  135     $                   MB_, NB_, RSRC_, CSRC_, LLD_
  136      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  137     $                   ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  138     $                   rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  139
  140
  141      INTEGER            CYCLIC_I, CYCLIC_J, DIST, I, IAM, II, INCII, J,
  142     $                   MAXI, MAXII, MINI, MINII, MYCOL, MYROW, NB,
  143     $                   NBUFSIZE, NPCOL, NPROCS, NPROW, PCOL, RECVCOL,
  144     $                   RECVFROM, RECVROW, SENDCOL, SENDROW, SENDTO
  145
  146
  147      INTEGER            INDXG2L, INDXG2P
  149
  150
  151      EXTERNAL           blacs_gridinfo, sgerv2d, sgesd2d
  152
  153
  155
  156
  157
  158      IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
  159     $    rsrc_.LT.0 )RETURN
  160      CALL blacs_gridinfo( descz( ctxt_ ), nprow, npcol, myrow, mycol )
  161      iam = myrow + mycol*nprow
  162      iam = myrow*npcol + mycol
  163
  164      nb = descz( mb_ )
  165
  166      nprocs = nprow*npcol
  167
  168
  169
  170
  171
  172
  173
  174
  175      DO 10 j = descz( n_ ), 1, -1
  176         key( j ) = key( j-jz+1 ) + ( jz-1 )
  177   10 CONTINUE
  178
  179      DO 110 dist = 0, nprocs - 1
  180
  181         sendto = mod( iam+dist, nprocs )
  182         recvfrom = mod( nprocs+iam-dist, nprocs )
  183
  184         sendrow = mod( sendto, nprow )
  185         sendcol = sendto / nprow
  186         recvrow = mod( recvfrom, nprow )
  187         recvcol = recvfrom / nprow
  188
  189         sendrow = sendto / npcol
  190         sendcol = mod( sendto, npcol )
  191         recvrow = recvfrom / npcol
  192         recvcol = mod( recvfrom, npcol )
  193
  194
  195
  196         nbufsize = 0
  197
  198
  199
  200         DO 40 j = nvs( 1+iam ) + jz, nvs( 1+iam+1 ) + jz - 1
  201            pcol = 
indxg2p( key( j ), descz( nb_ ), -1, descz( csrc_ ),
 
  202     $             npcol )
  203            IF( sendcol.EQ.pcol ) THEN
  204               minii = mod( sendrow+descz( rsrc_ ), nprow )*
  205     $                 descz( mb_ ) + 1
  206               maxii = descz( m_ )
  207               incii = descz( mb_ )*nprow
  208               DO 30 ii = minii, maxii, incii
  210                  maxi = 
min( ii+descz( mb_ )-1, n+iz-1 )
 
  211                  DO 20 i = mini, maxi, 1
  212                     nbufsize = nbufsize + 1
  213                     rwork( nbufsize ) = zin( i+1-iz,
  214     $                                   j-nvs( 1+iam )+1-jz )
  215   20             CONTINUE
  216   30          CONTINUE
  217            END IF
  218   40    CONTINUE
  219
  220
  221         IF( myrow.NE.sendrow .OR. mycol.NE.sendcol )
  222     $      CALL sgesd2d( descz( ctxt_ ), nbufsize, 1, rwork, nbufsize,
  223     $                    sendrow, sendcol )
  224
  225
  226
  227
  228         nbufsize = 0
  229         DO 70 j = nvs( 1+recvfrom ) + jz,
  230     $           nvs( 1+recvfrom+1 ) + jz - 1, 1
  231            pcol = 
indxg2p( key( j ), descz( nb_ ), -1, descz( csrc_ ),
 
  232     $             npcol )
  233            IF( mycol.EQ.pcol ) THEN
  234               minii = mod( myrow+descz( rsrc_ ), nprow )*descz( mb_ ) +
  235     $                 1
  236               maxii = descz( m_ )
  237               incii = descz( mb_ )*nprow
  238               DO 60 ii = minii, maxii, incii
  240                  maxi = 
min( ii+nb-1, n+iz-1 )
 
  241                  DO 50 i = mini, maxi, 1
  242                     nbufsize = nbufsize + 1
  243   50             CONTINUE
  244   60          CONTINUE
  245            END IF
  246   70    CONTINUE
  247
  248
  249
  250         IF( myrow.NE.recvrow .OR. mycol.NE.recvcol )
  251     $      CALL sgerv2d( descz( ctxt_ ), 1, nbufsize, rwork, 1,
  252     $                    recvrow, recvcol )
  253
  254         nbufsize = 0
  255         DO 100 j = nvs( 1+recvfrom ) + jz,
  256     $           nvs( 1+recvfrom+1 ) + jz - 1, 1
  257            pcol = 
indxg2p( key( j ), descz( nb_ ), -1, descz( csrc_ ),
 
  258     $             npcol )
  259            IF( mycol.EQ.pcol ) THEN
  260               cyclic_j = 
indxg2l( key( j ), descz( mb_ ), -1, -1,
 
  261     $                    npcol )
  262               cyclic_i = 1
  263               minii = mod( myrow+descz( rsrc_ ), nprow )*descz( mb_ ) +
  264     $                 1
  265               maxii = descz( m_ )
  266               incii = descz( mb_ )*nprow
  267               DO 90 ii = minii, maxii, incii
  269                  cyclic_i = 
indxg2l( mini, descz( mb_ ), -1, -1,
 
  270     $                       nprow )
  271                  maxi = 
min( ii+nb-1, n+iz-1 )
 
  272                  DO 80 i = mini, maxi, 1
  273                     nbufsize = nbufsize + 1
  274                     z( cyclic_i+( cyclic_j-1 )*descz( lld_ ) )
  275     $                  = 
cmplx( rwork( nbufsize ) )
 
  276                     cyclic_i = cyclic_i + 1
  277   80             CONTINUE
  278   90          CONTINUE
  279            END IF
  280  100    CONTINUE
  281
  282  110 CONTINUE
  283      RETURN
  284
  285
  286
integer function indxg2l(indxglob, nb, iproc, isrcproc, nprocs)
 
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)