3
    4
    5
    6
    7
    8
    9
   10      INTEGER            IA, INFO, JA, K, 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      INTEGER            BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
  159     $                   LLD_, MB_, M_, NB_, N_, RSRC_
  160      parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
  161     $                     ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
  162     $                     rsrc_ = 7, csrc_ = 8, lld_ = 9 )
  163      REAL               ZERO
  164      parameter( zero = 0.0e+0 )
  165
  166
  167      LOGICAL            LQUERY
  168      CHARACTER          COLBTOP, ROWBTOP
  169      INTEGER            I, IACOL, IAROW, IB, ICTXT, IINFO, IN, IPW,
  170     $                   LWMIN, MPA0, MYCOL, MYROW, NPCOL, NPROW, NQA0
  171
  172
  173      INTEGER            IDUM1( 2 ), IDUM2( 2 )
  174
  175
  179
  180
  181      INTEGER            ICEIL, INDXG2P, NUMROC
  183
  184
  185      INTRINSIC          min, mod, real
 
  186
  187
  188
  189
  190
  191      ictxt = desca( ctxt_ )
  192      CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
  193
  194
  195
  196      info = 0
  197      IF( nprow.EQ.-1 ) THEN
  198         info = -(700+ctxt_)
  199      ELSE
  200         CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
 
  201         IF( info.EQ.0 ) THEN
  202            iarow = 
indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
 
  203     $                       nprow )
  204            iacol = 
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
 
  205     $                       npcol )
  206            mpa0 = 
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
 
  207     $                     myrow, iarow, nprow )
  208            nqa0 = 
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
 
  209     $                     mycol, iacol, npcol )
  210            lwmin = desca( mb_ ) * ( mpa0 + nqa0 + desca( mb_ ) )
  211
  212            work( 1 ) = real( lwmin )
  213            lquery = ( lwork.EQ.-1 )
  214            IF( n.LT.m ) THEN
  215               info = -2
  216            ELSE IF( k.LT.0 .OR. k.GT.m ) THEN
  217               info = -3
  218            ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery ) THEN
  219               info = -10
  220            END IF
  221         END IF
  222         idum1( 1 ) = k
  223         idum2( 1 ) = 3
  224         IF( lwork.EQ.-1 ) THEN
  225            idum1( 2 ) = -1
  226         ELSE
  227            idum1( 2 ) = 1
  228         END IF
  229         idum2( 2 ) = 10
  230         CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 7, 2, idum1, idum2,
 
  231     $                  info )
  232      END IF
  233
  234      IF( info.NE.0 ) THEN
  235         CALL pxerbla( ictxt, 
'PSORGRQ', -info )
 
  236         RETURN
  237      ELSE IF( lquery ) THEN
  238         RETURN
  239      END IF
  240
  241
  242
  243      IF( m.LE.0 )
  244     $   RETURN
  245
  246      ipw = desca( mb_ )*desca( mb_ ) + 1
  247      in = 
min( 
iceil( ia+m-k, desca( mb_ ) )*desca( mb_ ), ia+m-1 )
 
  248      CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  249      CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
  250      CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
  251      CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'I-ring' )
  252
  253
  254
  255      CALL pslaset( 
'All', in-ia+1, m-in+ia-1, zero, zero, a, ia,
 
  256     $              ja+n-m+in-ia+1, desca )
  257
  258
  259
  260      CALL psorgr2( in-ia+1, n-m+in-ia+1, in-ia-m+k+1, a, ia, ja, desca,
 
  261     $              tau, work, lwork, iinfo )
  262
  263
  264
  265      DO 10 i = in+1, ia+m-1, desca( mb_ )
  266         ib = 
min( ia+m-i, desca( mb_ ) )
 
  267
  268
  269
  270
  271         CALL pslarft( 
'Backward', 
'Rowwise', n-m+i+ib-ia, ib, a, i, ja,
 
  272     $                 desca, tau, work, work( ipw ) )
  273
  274
  275
  276         CALL pslarfb( 
'Right', 
'Transpose', 
'Backward', 
'Rowwise',
 
  277     $                 i-ia, n-m+i+ib-ia, ib, a, i, ja, desca, work, a,
  278     $                 ia, ja, desca, work( ipw ) )
  279
  280
  281
  282         CALL psorgr2( ib, n-m+i+ib-ia, ib, a, i, ja, desca, tau, work,
 
  283     $                 lwork, iinfo )
  284
  285
  286
  287
  288         CALL pslaset( 
'All', ib, m-i-ib+ia, zero, zero, a, i,
 
  289     $                 ja+n-m+i+ib-ia, desca )
  290
  291   10 CONTINUE
  292
  293      CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
  294      CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
  295
  296      work( 1 ) = real( lwmin )
  297
  298      RETURN
  299
  300
  301
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
 
integer function iceil(inum, idenom)
 
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
 
integer function numroc(n, nb, iproc, isrcproc, nprocs)
 
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
 
subroutine pslaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
 
subroutine pslarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)
 
subroutine pslarft(direct, storev, n, k, v, iv, jv, descv, tau, t, work)
 
subroutine psorgr2(m, n, k, a, ia, ja, desca, tau, work, lwork, info)
 
subroutine pxerbla(ictxt, srname, info)