2
    3
    4
    5
    6
    7
    8
    9      CHARACTER*1        TYPE
   10      INTEGER            IA, JA, M, N
   11      COMPLEX            ALPHA
   12
   13
   14      INTEGER            DESCA( * )
   15      COMPLEX            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
  134
  135
  136      INTEGER            BLOCK_CYCLIC_2D_INB, CSRC_, CTXT_, DLEN_,
  137     $                   DTYPE_, IMB_, INB_, LLD_, MB_, M_, NB_, N_,
  138     $                   RSRC_
  139      parameter( block_cyclic_2d_inb = 2, dlen_ = 11,
  140     $                   dtype_ = 1, ctxt_ = 2, m_ = 3, n_ = 4,
  141     $                   imb_ = 5, inb_ = 6, mb_ = 7, nb_ = 8,
  142     $                   rsrc_ = 9, csrc_ = 10, lld_ = 11 )
  143
  144
  145      CHARACTER*1        UPLO
  146      LOGICAL            GODOWN, GOLEFT, LOWER, UPPER
  147      INTEGER            IACOL, IAROW, ICTXT, IIA, IIMAX, ILOW, IMB1,
  148     $                   IMBLOC, INB1, INBLOC, IOFFA, IOFFD, ITYPE,
  149     $                   IUPP, JJA, JJMAX, JOFFA, JOFFD, LCMT, LCMT00,
  150     $                   LDA, LMBLOC, LNBLOC, LOW, M1, MB, MBLKD, MBLKS,
  151     $                   MBLOC, MP, MRCOL, MRROW, MYCOL, MYROW, N1, NB,
  152     $                   NBLKD, NBLKS, NBLOC, NPCOL, NPROW, NQ, PMB,
  153     $                   QNB, TMP1, UPP
  154
  155
  156      INTEGER            DESCA2( DLEN_ )
  157
  158
  161
  162
  163      LOGICAL            LSAME
  164      INTEGER            PB_NUMROC
  166
  167
  169
  170
  171
  172
  173
  175
  176
  177
  178      ictxt = desca2( ctxt_ )
  179      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  180
  181
  182
  183      IF( m.EQ.0 .OR. n.EQ.0 )
  184     $   RETURN
  185
  186      IF( 
lsame( 
TYPE, 
'L' ) ) THEN
 
  187         itype = 1
  188         uplo  = TYPE
  189         upper = .false.
  190         lower = .true.
  191         ioffd = 0
  192      ELSE IF( 
lsame( 
TYPE, 
'U' ) ) THEN
 
  193         itype = 2
  194         uplo  = TYPE
  195         upper = .true.
  196         lower = .false.
  197         ioffd = 0
  198      ELSE IF( 
lsame( 
TYPE, 
'H' ) ) THEN
 
  199         itype = 3
  200         uplo  = 'U'
  201         upper = .true.
  202         lower = .false.
  203         ioffd = 1
  204      ELSE
  205         itype = 0
  206         uplo  = 'A'
  207         upper = .true.
  208         lower = .true.
  209         ioffd = 0
  210      END IF
  211
  212
  213
  214      IF( itype.EQ.0 ) THEN
  215
  216
  217
  218         CALL pb_infog2l( ia, ja, desca2, nprow, npcol, myrow, mycol,
 
  219     $                    iia, jja, iarow, iacol )
  220         mp = 
pb_numroc( m, ia, desca2( imb_ ), desca2( mb_ ), myrow,
 
  221     $                   desca2( rsrc_ ), nprow )
  222         nq = 
pb_numroc( n, ja, desca2( inb_ ), desca2( nb_ ), mycol,
 
  223     $                   desca2( csrc_ ), npcol )
  224
  225         IF( mp.LE.0 .OR. nq.LE.0 )
  226     $      RETURN
  227
  228         lda   = desca2( lld_ )
  229         ioffa = iia + ( jja - 1 ) * lda
  230
  231         CALL pb_clascal( 
'All', mp, nq, 0, alpha, a( ioffa ), lda )
 
  232
  233      ELSE
  234
  235
  236
  237         CALL pb_ainfog2l( m, n, ia, ja, desca2, nprow, npcol, myrow,
 
  238     $                     mycol, imb1, inb1, mp, nq, iia, jja, iarow,
  239     $                     iacol, mrrow, mrcol )
  240
  241         IF( mp.LE.0 .OR. nq.LE.0 )
  242     $      RETURN
  243
  244
  245
  246
  247         mb  = desca2( mb_ )
  248         nb  = desca2( nb_ )
  249         lda = desca2( lld_ )
  250
  251         CALL pb_binfo( ioffd, mp, nq, imb1, inb1, mb, nb, mrrow,
 
  252     $                  mrcol, lcmt00, mblks, nblks, imbloc, inbloc,
  253     $                  lmbloc, lnbloc, ilow, low, iupp, upp )
  254
  255         m1    = mp
  256         n1    = nq
  257         ioffa = iia - 1
  258         joffa = jja - 1
  259         iimax = ioffa + mp
  260         jjmax = joffa + nq
  261
  262         IF( desca2( rsrc_ ).LT.0 ) THEN
  263            pmb = mb
  264         ELSE
  265            pmb = nprow * mb
  266         END IF
  267         IF( desca2( csrc_ ).LT.0 ) THEN
  268            qnb = nb
  269         ELSE
  270            qnb = npcol * nb
  271         END IF
  272
  273
  274
  275
  276         godown = ( lcmt00.GT.iupp )
  277         goleft = ( lcmt00.LT.ilow )
  278
  279         IF( .NOT.godown .AND. .NOT.goleft ) THEN
  280
  281
  282
  283            goleft = ( ( lcmt00 - ( iupp - upp + pmb ) ).LT.ilow )
  284            godown = .NOT.goleft
  285
  286            CALL pb_clascal( uplo, imbloc, inbloc, lcmt00, alpha,
 
  287     $                       a( iia+joffa*lda ), lda )
  288            IF( godown ) THEN
  289               IF( upper .AND. nq.GT.inbloc )
  290     $            
CALL pb_clascal( 
'All', imbloc, nq-inbloc, 0, alpha,
 
  291     $                             a( iia+(joffa+inbloc)*lda ), lda )
  292               iia = iia + imbloc
  293               m1  = m1 - imbloc
  294            ELSE
  295               IF( lower .AND. mp.GT.imbloc )
  296     $            
CALL pb_clascal( 
'All', mp-imbloc, inbloc, 0, alpha,
 
  297     $                             a( iia+imbloc+joffa*lda ), lda )
  298               jja = jja + inbloc
  299               n1  = n1 - inbloc
  300            END IF
  301
  302         END IF
  303
  304         IF( godown ) THEN
  305
  306            lcmt00 = lcmt00 - ( iupp - upp + pmb )
  307            mblks  = mblks - 1
  308            ioffa  = ioffa + imbloc
  309
  310   10       CONTINUE
  311            IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
  312               lcmt00 = lcmt00 - pmb
  313               mblks  = mblks - 1
  314               ioffa  = ioffa + mb
  315               GO TO 10
  316            END IF
  317
  318            tmp1 = 
min( ioffa, iimax ) - iia + 1
 
  319            IF( upper .AND. tmp1.GT.0 ) THEN
  321     $                          a( iia+joffa*lda ), lda )
  322               iia = iia + tmp1
  323               m1  = m1 - tmp1
  324            END IF
  325
  326            IF( mblks.LE.0 )
  327     $         RETURN
  328
  329            lcmt  = lcmt00
  330            mblkd = mblks
  331            ioffd = ioffa
  332
  333            mbloc = mb
  334   20       CONTINUE
  335            IF( mblkd.GT.0 .AND. lcmt.GE.ilow ) THEN
  336               IF( mblkd.EQ.1 )
  337     $            mbloc = lmbloc
  338               CALL pb_clascal( uplo, mbloc, inbloc, lcmt, alpha,
 
  339     $                          a( ioffd+1+joffa*lda ), lda )
  340               lcmt00 = lcmt
  341               lcmt   = lcmt - pmb
  342               mblks  = mblkd
  343               mblkd  = mblkd - 1
  344               ioffa  = ioffd
  345               ioffd  = ioffd + mbloc
  346               GO TO 20
  347            END IF
  348
  349            tmp1 = m1 - ioffd + iia - 1
  350            IF( lower .AND. tmp1.GT.0 )
  351     $         
CALL pb_clascal( 
'All', tmp1, inbloc, 0, alpha,
 
  352     $                          a( ioffd+1+joffa*lda ), lda )
  353
  354            tmp1   = ioffa - iia + 1
  355            m1     = m1 - tmp1
  356            n1     = n1 - inbloc
  357            lcmt00 = lcmt00 + low - ilow + qnb
  358            nblks  = nblks - 1
  359            joffa  = joffa + inbloc
  360
  361            IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
  363     $                          a( iia+joffa*lda ), lda )
  364
  365            iia = ioffa + 1
  366            jja = joffa + 1
  367
  368         ELSE IF( goleft ) THEN
  369
  370            lcmt00 = lcmt00 + low - ilow + qnb
  371            nblks  = nblks - 1
  372            joffa  = joffa + inbloc
  373
  374   30       CONTINUE
  375            IF( nblks.GT.0 .AND. lcmt00.LT.low ) THEN
  376               lcmt00 = lcmt00 + qnb
  377               nblks  = nblks - 1
  378               joffa  = joffa + nb
  379               GO TO 30
  380            END IF
  381
  382            tmp1 = 
min( joffa, jjmax ) - jja + 1
 
  383            IF( lower .AND. tmp1.GT.0 ) THEN
  385     $                          a( iia+(jja-1)*lda ), lda )
  386               jja = jja + tmp1
  387               n1  = n1 - tmp1
  388            END IF
  389
  390            IF( nblks.LE.0 )
  391     $         RETURN
  392
  393            lcmt  = lcmt00
  394            nblkd = nblks
  395            joffd = joffa
  396
  397            nbloc = nb
  398   40       CONTINUE
  399            IF( nblkd.GT.0 .AND. lcmt.LE.iupp ) THEN
  400               IF( nblkd.EQ.1 )
  401     $            nbloc = lnbloc
  402               CALL pb_clascal( uplo, imbloc, nbloc, lcmt, alpha,
 
  403     $                          a( iia+joffd*lda ), lda )
  404               lcmt00 = lcmt
  405               lcmt   = lcmt + qnb
  406               nblks  = nblkd
  407               nblkd  = nblkd - 1
  408               joffa  = joffd
  409               joffd  = joffd + nbloc
  410               GO TO 40
  411            END IF
  412
  413            tmp1 = n1 - joffd + jja - 1
  414            IF( upper .AND. tmp1.GT.0 )
  415     $         
CALL pb_clascal( 
'All', imbloc, tmp1, 0, alpha,
 
  416     $                          a( iia+joffd*lda ), lda )
  417
  418            tmp1   = joffa - jja + 1
  419            m1     = m1 - imbloc
  420            n1     = n1 - tmp1
  421            lcmt00 = lcmt00 - ( iupp - upp + pmb )
  422            mblks  = mblks - 1
  423            ioffa  = ioffa + imbloc
  424
  425            IF( lower .AND. m1.GT.0 .AND. tmp1.GT.0 )
  427     $                          a( ioffa+1+(jja-1)*lda ), lda )
  428
  429            iia = ioffa + 1
  430            jja = joffa + 1
  431
  432         END IF
  433
  434         nbloc = nb
  435   50    CONTINUE
  436         IF( nblks.GT.0 ) THEN
  437            IF( nblks.EQ.1 )
  438     $         nbloc = lnbloc
  439   60       CONTINUE
  440            IF( mblks.GT.0 .AND. lcmt00.GT.upp ) THEN
  441               lcmt00 = lcmt00 - pmb
  442               mblks  = mblks - 1
  443               ioffa  = ioffa + mb
  444               GO TO 60
  445            END IF
  446
  447            tmp1 = 
min( ioffa, iimax ) - iia + 1
 
  448            IF( upper .AND. tmp1.GT.0 ) THEN
  450     $                          a( iia+joffa*lda ), lda )
  451               iia = iia + tmp1
  452               m1  = m1 - tmp1
  453            END IF
  454
  455            IF( mblks.LE.0 )
  456     $         RETURN
  457
  458            lcmt  = lcmt00
  459            mblkd = mblks
  460            ioffd = ioffa
  461
  462            mbloc = mb
  463   70       CONTINUE
  464            IF( mblkd.GT.0 .AND. lcmt.GE.low ) THEN
  465               IF( mblkd.EQ.1 )
  466     $            mbloc = lmbloc
  467               CALL pb_clascal( uplo, mbloc, nbloc, lcmt, alpha,
 
  468     $                          a( ioffd+1+joffa*lda ), lda )
  469               lcmt00 = lcmt
  470               lcmt   = lcmt - pmb
  471               mblks  = mblkd
  472               mblkd  = mblkd - 1
  473               ioffa  = ioffd
  474               ioffd  = ioffd + mbloc
  475               GO TO 70
  476            END IF
  477
  478            tmp1 = m1 - ioffd + iia - 1
  479            IF( lower .AND. tmp1.GT.0 )
  480     $         
CALL pb_clascal( 
'All', tmp1, nbloc, 0, alpha,
 
  481     $                          a( ioffd+1+joffa*lda ), lda )
  482
  483            tmp1   = 
min( ioffa, iimax )  - iia + 1
 
  484            m1     = m1 - tmp1
  485            n1     = n1 - nbloc
  486            lcmt00 = lcmt00 + qnb
  487            nblks  = nblks - 1
  488            joffa  = joffa + nbloc
  489
  490            IF( upper .AND. tmp1.GT.0 .AND. n1.GT.0 )
  492     $                          a( iia+joffa*lda ), lda )
  493
  494            iia = ioffa + 1
  495            jja = joffa + 1
  496
  497            GO TO 50
  498
  499         END IF
  500
  501      END IF
  502
  503      RETURN
  504
  505
  506
subroutine pb_ainfog2l(m, n, i, j, desc, nprow, npcol, myrow, mycol, imb1, inb1, mp, nq, ii, jj, prow, pcol, rprow, rpcol)
 
subroutine pb_binfo(offd, m, n, imb1, inb1, mb, nb, mrrow, mrcol, lcmt00, mblks, nblks, imbloc, inbloc, lmbloc, lnbloc, ilow, low, iupp, upp)
 
subroutine pb_infog2l(i, j, desc, nprow, npcol, myrow, mycol, ii, jj, prow, pcol)
 
subroutine pb_desctrans(descin, descout)
 
integer function pb_numroc(n, i, inb, nb, proc, srcproc, nprocs)
 
subroutine pb_clascal(uplo, m, n, ioffd, alpha, a, lda)