2
    3
    4
    5
    6
    7
    8
    9      CHARACTER          UPLO
   10      INTEGER            IA, JA, M, N
   11      COMPLEX*16         ALPHA, BETA
   12
   13
   14      INTEGER            DESCA( * )
   15      COMPLEX*16         A( * )
   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      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  134     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  135      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  136     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  137     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  138
  139
  140      INTEGER            HEIGHT, IACOL, IAROW, IBASE, ICOFFA, II, IIA,
  141     $                   IIBEG, IIEND, IINXT, ILEFT, IRIGHT, IROFFA,
  142     $                   ITOP, JJ, JJA, JJBEG, JJEND, JJNXT, LDA, MBA,
  143     $                   MP, MPA, MYCOL, MYDIST, MYROW, NBA, NPCOL,
  144     $                   NPROW, NQ, NQA, WIDE
  145
  146
  147      EXTERNAL           blacs_gridinfo, 
infog2l, zlaset
 
  148
  149
  150      LOGICAL            LSAME
  151      INTEGER            ICEIL, NUMROC
  153
  154
  156
  157
  158
  159      IF( m.EQ.0 .OR. n.EQ.0 )
  160     $   RETURN
  161
  162
  163
  164      CALL blacs_gridinfo( desca( ctxt_ ), nprow, npcol, myrow, mycol )
  165
  166      CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
 
  167     $              iarow, iacol )
  168      mba = desca( mb_ )
  169      nba = desca( nb_ )
  170      lda = desca( lld_ )
  171      iroffa = mod( ia-1, mba )
  172      icoffa = mod( ja-1, nba )
  173
  174      IF( n.LE.( nba-icoffa ) ) THEN
  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         IF( mycol.EQ.iacol ) THEN
  213
  214            mpa = 
numroc( m+iroffa, mba, myrow, iarow, nprow )
 
  215            IF( mpa.LE.0 )
  216     $         RETURN
  217            IF( myrow.EQ.iarow )
  218     $         mpa = mpa - iroffa
  219            mydist = mod( myrow-iarow+nprow, nprow )
  220            itop = mydist * mba - iroffa
  221
  222            IF( 
lsame( uplo, 
'U' ) ) 
THEN 
  223
  224               itop = 
max( 0, itop )
 
  225               iibeg = iia
  226               iiend = iia + mpa - 1
  227               iinxt = 
min( 
iceil( iibeg, mba ) * mba, iiend )
 
  228
  229   10          CONTINUE
  230               IF( ( n-itop ).GT.0 ) THEN
  231                  CALL zlaset( uplo, iinxt-iibeg+1, n-itop, alpha, beta,
  232     $                         a( iibeg+(jja+itop-1)*lda ), lda )
  233                  mydist = mydist + nprow
  234                  itop = mydist * mba - iroffa
  235                  iibeg = iinxt +1
  236                  iinxt = 
min( iinxt+mba, iiend )
 
  237                  GO TO 10
  238               END IF
  239
  240            ELSE IF( 
lsame( uplo, 
'L' ) ) 
THEN 
  241
  242               ii = iia
  243               jj = jja
  244               mp = mpa
  245               ibase = 
min( itop+mba, n )
 
  246               itop = 
min( 
max( 0, itop ), n )
 
  247
  248   20          CONTINUE
  249               IF( jj.LE.( jja+n-1 ) ) THEN
  250                  height = ibase - itop
  251                  CALL zlaset( 'All', mp, itop-jj+jja, alpha, alpha,
  252     $                         a( ii+(jj-1)*lda ), lda )
  253                  CALL zlaset( uplo, mp, height, alpha, beta,
  254     $                         a( ii+(jja+itop-1)*lda ), lda )
  255                  mp = 
max( 0, mp - height )
 
  256                  ii = ii + height
  257                  jj = jja + ibase
  258                  mydist = mydist + nprow
  259                  itop = mydist * mba - iroffa
  260                  ibase = 
min( itop + mba, n )
 
  261                  itop = 
min( itop, n )
 
  262                  GO TO 20
  263               END IF
  264
  265            ELSE
  266
  267               ii = iia
  268               jj = jja
  269               mp = mpa
  270               ibase = 
min( itop+mba, n )
 
  271               itop = 
min( 
max( 0, itop ), n )
 
  272
  273   30          CONTINUE
  274               IF( jj.LE.( jja+n-1 ) ) THEN
  275                  height = ibase - itop
  276                  CALL zlaset( 'All', mpa, itop-jj+jja, alpha, alpha,
  277     $                         a( iia+(jj-1)*lda ), lda )
  278                  CALL zlaset( 'All', mpa-mp, height, alpha, alpha,
  279     $                         a( iia+(jja+itop-1)*lda ), lda )
  280                  CALL zlaset( 'All', mp, height, alpha, beta,
  281     $                         a( ii+(jja+itop-1)*lda ), lda )
  282                  mp = 
max( 0, mp - height )
 
  283                  ii = ii + height
  284                  jj = jja + ibase
  285                  mydist = mydist + nprow
  286                  itop = mydist * mba - iroffa
  287                  ibase = 
min( itop + mba, n )
 
  288                  itop = 
min( itop, n )
 
  289                  GO TO 30
  290               END IF
  291
  292            END IF
  293
  294         END IF
  295
  296      ELSE IF( m.LE.( mba-iroffa ) ) THEN
  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         IF( myrow.EQ.iarow ) THEN
  322
  323            nqa = 
numroc( n+icoffa, nba, mycol, iacol, npcol )
 
  324            IF( nqa.LE.0 )
  325     $         RETURN
  326            IF( mycol.EQ.iacol )
  327     $         nqa = nqa - icoffa
  328            mydist = mod( mycol-iacol+npcol, npcol )
  329            ileft = mydist * nba - icoffa
  330
  331            IF( 
lsame( uplo, 
'L' ) ) 
THEN 
  332
  333               ileft = 
max( 0, ileft )
 
  334               jjbeg = jja
  335               jjend = jja + nqa - 1
  336               jjnxt = 
min( 
iceil( jjbeg, nba ) * nba, jjend )
 
  337
  338   40          CONTINUE
  339               IF( ( m-ileft ).GT.0 ) THEN
  340                  CALL zlaset( uplo, m-ileft, jjnxt-jjbeg+1, alpha,
  341     $                         beta, a( iia+ileft+(jjbeg-1)*lda ), lda )
  342                  mydist = mydist + npcol
  343                  ileft = mydist * nba - icoffa
  344                  jjbeg = jjnxt +1
  345                  jjnxt = 
min( jjnxt+nba, jjend )
 
  346                  GO TO 40
  347               END IF
  348
  349            ELSE IF( 
lsame( uplo, 
'U' ) ) 
THEN 
  350
  351               ii = iia
  352               jj = jja
  353               nq = nqa
  354               iright = 
min( ileft+nba, m )
 
  355               ileft = 
min( 
max( 0, ileft ), m )
 
  356
  357   50          CONTINUE
  358               IF( ii.LE.( iia+m-1 ) ) THEN
  359                  wide = iright - ileft
  360                  CALL zlaset( 'All', ileft-ii+iia, nq, alpha, alpha,
  361     $                         a( ii+(jj-1)*lda ), lda )
  362                  CALL zlaset( uplo, wide, nq, alpha, beta,
  363     $                         a( iia+ileft+(jj-1)*lda ), lda )
  364                  nq = 
max( 0, nq - wide )
 
  365                  ii = iia + iright
  366                  jj = jj + wide
  367                  mydist = mydist + npcol
  368                  ileft = mydist * nba - icoffa
  369                  iright = 
min( ileft + nba, m )
 
  370                  ileft = 
min( ileft, m )
 
  371                  GO TO 50
  372               END IF
  373
  374            ELSE
  375
  376               ii = iia
  377               jj = jja
  378               nq = nqa
  379               iright = 
min( ileft+nba, m )
 
  380               ileft = 
min( 
max( 0, ileft ), m )
 
  381
  382   60          CONTINUE
  383               IF( ii.LE.( iia+m-1 ) ) THEN
  384                  wide = iright - ileft
  385                  CALL zlaset( 'All', ileft-ii+iia, nqa, alpha, alpha,
  386     $                         a( ii+(jja-1)*lda ), lda )
  387                  CALL zlaset( 'All', wide, nqa-nq, alpha, alpha,
  388     $                         a( iia+ileft+(jja-1)*lda ), lda )
  389                  CALL zlaset( 'All', wide, nq, alpha, beta,
  390     $                         a( iia+ileft+(jj-1)*lda ), lda )
  391                  nq = 
max( 0, nq - wide )
 
  392                  ii = iia + iright
  393                  jj = jj + wide
  394                  mydist = mydist + npcol
  395                  ileft = mydist * nba - icoffa
  396                  iright = 
min( ileft + nba, m )
 
  397                  ileft = 
min( ileft, m )
 
  398                  GO TO 60
  399               END IF
  400
  401            END IF
  402
  403         END IF
  404
  405      END IF
  406
  407      RETURN
  408
  409
  410
integer function iceil(inum, idenom)
 
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)