3
    4
    5
    6
    7
    8
    9
   10      INTEGER            IA, INFO, JA, LWORK, M, N
   11
   12
   13      INTEGER            DESCA( * )
   14      REAL               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      REAL               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      REAL               AII
  178
  179
  182
  183
  184      INTEGER            INDXG2P, NUMROC
  186
  187
  188      INTRINSIC          max, 
min, mod, real
 
  189
  190
  191
  192
  193
  194      ictxt = desca( ctxt_ )
  195      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  196
  197
  198
  199      info = 0
  200      IF( nprow.EQ.-1 ) THEN
  201         info = -(600+ctxt_)
  202      ELSE
  203         CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
 
  204         IF( info.EQ.0 ) THEN
  205            iarow = 
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
 
  206     $                       nprow )
  207            iacol = 
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
 
  208     $                       npcol )
  209            mp = 
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
 
  210     $                   myrow, iarow, nprow )
  211            nq = 
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
 
  212     $                   mycol, iacol, npcol )
  213            lwmin = nq + 
max( 1, mp )
 
  214
  215            work( 1 ) = real( lwmin )
  216            lquery = ( lwork.EQ.-1 )
  217            IF( lwork.LT.lwmin .AND. .NOT.lquery )
  218     $         info = -9
  219         END IF
  220      END IF
  221
  222      IF( info.NE.0 ) THEN
  223         CALL pxerbla( ictxt, 
'PSGELQ2', -info )
 
  224         CALL blacs_abort( ictxt, 1 )
  225         RETURN
  226      ELSE IF( lquery ) THEN
  227         RETURN
  228      END IF
  229
  230
  231
  232      IF( m.EQ.0 .OR. n.EQ.0 )
  233     $   RETURN
  234
  235      CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  236      CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
  237      CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
  238      CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'I-ring' )
  239
  241      DO 10 i = ia, ia+k-1
  242         j = ja + i - ia
  243
  244
  245
  246
  247         CALL pslarfg( n-j+ja, aii, i, j, a, i, 
min( j+1, ja+n-1 ),
 
  248     $                 desca, desca( m_ ), tau )
  249
  250         IF( i.LT.ia+m-1 ) THEN
  251
  252
  253
  254            CALL pselset( a, i, j, desca, one )
 
  255            CALL pslarf( 
'Right', m-i+ia-1, n-j+ja, a, i, j, desca,
 
  256     $                   desca( m_ ), tau, a, i+1, j, desca, work )
  257         END IF
  258         CALL pselset( a, i, j, desca, aii )
 
  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 ) = 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 pselset(a, ia, ja, desca, alpha)
 
subroutine pslarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
 
subroutine pslarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)
 
subroutine pxerbla(ictxt, srname, info)