3
    4
    5
    6
    7
    8
    9
   10      INTEGER            IA, INFO, JA, LWORK, M, N
   11
   12
   13      INTEGER            DESCA( * )
   14      COMPLEX            A( * ), TAU( * ), WORK( * )
   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
  149
  150
  151
  152
  153
  154
  155
  156
  157
  158
  159
  160
  161
  162
  163
  164      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  165     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  166      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  167     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  168     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  169      COMPLEX            ONE
  170      parameter( one = 1.0e+0 )
  171
  172
  173      LOGICAL            LQUERY
  174      CHARACTER          COLBTOP, ROWBTOP
  175      INTEGER            IACOL, IAROW, I, ICTXT, J, K, LWMIN, MP, MYCOL,
  176     $                   MYROW, NPCOL, NPROW, NQ
  177      COMPLEX            AII
  178
  179
  180      EXTERNAL           blacs_abort, blacs_gridinfo, 
chk1mat,
 
  182     $                   pb_topget, pb_topset, 
pxerbla 
  183
  184
  185      INTEGER            INDXG2P, NUMROC
  187
  188
  190
  191
  192
  193
  194
  195      ictxt = desca( ctxt_ )
  196      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  197
  198
  199
  200      info = 0
  201      IF( nprow.EQ.-1 ) THEN
  202         info = -(600+ctxt_)
  203      ELSE
  204         CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
 
  205         IF( info.EQ.0 ) THEN
  206            iarow = 
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
 
  207     $                       nprow )
  208            iacol = 
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
 
  209     $                       npcol )
  210            mp = 
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
 
  211     $                   myrow, iarow, nprow )
  212            nq = 
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
 
  213     $                   mycol, iacol, npcol )
  214            lwmin = nq + 
max( 1, mp )
 
  215
  216            work( 1 ) = 
cmplx( real( lwmin ) )
 
  217            lquery = ( lwork.EQ.-1 )
  218            IF( lwork.LT.lwmin .AND. .NOT.lquery )
  219     $         info = -9
  220         END IF
  221      END IF
  222
  223      IF( info.NE.0 ) THEN
  224         CALL pxerbla( ictxt, 
'PCGERQ2', -info )
 
  225         CALL blacs_abort( ictxt, 1 )
  226         RETURN
  227      ELSE IF( lquery ) THEN
  228         RETURN
  229      END IF
  230
  231
  232
  233      IF( m.EQ.0 .OR. n.EQ.0 )
  234     $   RETURN
  235
  236      CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  237      CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
  238      CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
  239      CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'D-ring' )
  240
  242      DO 10 i = ia+k-1, ia, -1
  243         j = ja + i - ia
  244
  245
  246
  247
  248         CALL pclacgv( n-k+j-ja+1, a, i+m-k, ja, desca, desca( m_ ) )
 
  249         CALL pclarfg( n-k+j-ja+1, aii, i+m-k, j+n-k, a, i+m-k, ja,
 
  250     $                 desca, desca( m_ ), tau )
  251
  252
  253
  254         CALL pcelset( a, i+m-k, j+n-k, desca, one )
 
  255         CALL pclarf( 
'Right', m-k+i-ia, n-k+j-ja+1, a, m-k+i, ja,
 
  256     $                desca, desca( m_ ), tau, a, ia, ja, desca, work )
  257         CALL pcelset( a, i+m-k, j+n-k, desca, aii )
 
  258         CALL pclacgv( n-k+j-ja+1, a, i+m-k, ja, desca, desca( m_ ) )
 
  259
  260   10 CONTINUE
  261
  262      CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  263      CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
  264
  265      work( 1 ) = 
cmplx( real( lwmin ) )
 
  266
  267      RETURN
  268
  269
  270
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
 
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)
 
subroutine pcelset(a, ia, ja, desca, alpha)
 
subroutine pclacgv(n, x, ix, jx, descx, incx)
 
subroutine pclarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
 
subroutine pclarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)
 
subroutine pxerbla(ictxt, srname, info)