3
    4
    5
    6
    7
    8
    9
   10      INTEGER            IA, INFO, JA, LWORK, M, N
   11
   12
   13      INTEGER            DESCA( * )
   14      DOUBLE PRECISION   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
  165      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  166     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  167      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  168     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  169     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  170      DOUBLE PRECISION   ONE
  171      parameter( one = 1.0d+0 )
  172
  173
  174      LOGICAL            LQUERY
  175      CHARACTER          COLBTOP, ROWBTOP
  176      INTEGER            I, IACOL, IAROW, ICTXT, II, J, JJ, K, LWMIN,
  177     $                   MP, MYCOL, MYROW, NPCOL, NPROW, NQ
  178      DOUBLE PRECISION   AJJ, ALPHA
  179
  180
  181      EXTERNAL           blacs_abort, blacs_gridinfo, 
chk1mat, dgebr2d,
 
  182     $                   dgebs2d, dlarfg, dscal, 
infog2l,
 
  185
  186
  187      INTEGER            INDXG2P, NUMROC
  189
  190
  191      INTRINSIC          dble, 
max, 
min, mod
 
  192
  193
  194
  195
  196
  197      ictxt = desca( ctxt_ )
  198      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  199
  200
  201
  202      info = 0
  203      IF( nprow.EQ.-1 ) THEN
  204         info = -(600+ctxt_)
  205      ELSE
  206         CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
 
  207         IF( info.EQ.0 ) THEN
  208            iarow = 
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
 
  209     $                       nprow )
  210            iacol = 
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
 
  211     $                       npcol )
  212            mp = 
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
 
  213     $                   myrow, iarow, nprow )
  214            nq = 
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
 
  215     $                   mycol, iacol, npcol )
  216            lwmin = mp + 
max( 1, nq )
 
  217
  218            work( 1 ) = dble( lwmin )
  219            lquery = ( lwork.EQ.-1 )
  220            IF( lwork.LT.lwmin .AND. .NOT.lquery )
  221     $         info = -9
  222         END IF
  223      END IF
  224
  225      IF( info.NE.0 ) THEN
  226         CALL pxerbla( ictxt, 
'PDGEQL2', -info )
 
  227         CALL blacs_abort( ictxt, 1 )
  228         RETURN
  229      ELSE IF( lquery ) THEN
  230         RETURN
  231      END IF
  232
  233
  234
  235      IF( m.EQ.0 .OR. n.EQ.0 )
  236     $   RETURN
  237
  238      CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  239      CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
  240      CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', 'D-ring' )
  241      CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', ' ' )
  242
  243      IF( desca( m_ ).EQ.1 ) THEN
  244         IF( mycol.EQ.iacol )
  245     $      nq = nq - mod( ja-1, desca( nb_ ) )
  246         CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii,
 
  247     $                 jj, iarow, iacol )
  248         iacol = 
indxg2p( ja+n-1, desca( nb_ ), mycol, desca( csrc_ ),
 
  249     $                    npcol )
  250         IF( myrow.EQ.iarow ) THEN
  251            IF( mycol.EQ.iacol ) THEN
  252               i = ii+(jj+nq-2)*desca( lld_ )
  253               ajj = a( i )
  254               CALL dlarfg( 1, ajj, a( i ), 1, tau( jj+nq-1 ) )
  255               IF( n.GT.1 ) THEN
  256                  alpha = one - tau( jj+nq-1 )
  257                  CALL dgebs2d( ictxt, 'Rowwise', ' ', 1, 1, alpha, 1 )
  258                  CALL dscal( nq-1, alpha, a( ii+(jj-1)*desca( lld_ ) ),
  259     $                        desca( lld_ ) )
  260               END IF
  261               CALL dgebs2d( ictxt, 'Columnwise', ' ', 1, 1,
  262     $                       tau( jj+nq-1 ), 1 )
  263               a( i ) = ajj
  264            ELSE
  265               IF( n.GT.1 ) THEN
  266                  CALL dgebr2d( ictxt, 'Rowwise', ' ', 1, 1, alpha,
  267     $                          1, iarow, iacol )
  268                  CALL dscal( nq, alpha, a( ii+(jj-1)*desca( lld_ ) ),
  269     $                        desca( lld_ ) )
  270               END IF
  271            END IF
  272         ELSE IF( mycol.EQ.iacol ) THEN
  273            CALL dgebr2d( ictxt, 'Columnwise', ' ', 1, 1,
  274     $                         tau( jj+nq-1 ), 1, iarow, iacol )
  275         END IF
  276
  277      ELSE
  278
  280         DO 10 j = ja+k-1, ja, -1
  281            i = ia + j - ja
  282
  283
  284
  285
  286            CALL pdlarfg( m-k+i-ia+1, ajj, m-k+i, n-k+j, a, ia,
 
  287     $                    n-k+j, desca, 1, tau )
  288
  289
  290
  291            CALL pdelset( a, i+m-k, j+n-k, desca, one )
 
  292            CALL pdlarf( 
'Left', m-k+i-ia+1, n-k+j-ja, a, ia, n-k+j,
 
  293     $                   desca, 1, tau, a, ia, ja, desca, work )
  294            CALL pdelset( a, i+m-k, j+n-k, desca, ajj )
 
  295
  296   10    CONTINUE
  297
  298      END IF
  299
  300      CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  301      CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
  302
  303      work( 1 ) = dble( lwmin )
  304
  305      RETURN
  306
  307
  308
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
 
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
 
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)
 
subroutine pdelset(a, ia, ja, desca, alpha)
 
subroutine pdlarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
 
subroutine pdlarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)
 
subroutine pxerbla(ictxt, srname, info)