1 SUBROUTINE psorgr2( M, N, K, A, IA, JA, DESCA, TAU, WORK, LWORK,
10 INTEGER IA, INFO, JA, , LWORK, M, N
14 REAL A( * ), TAU( * ), WORK( * )
157 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
158 $ lld_, mb_, m_, nb_, n_, rsrc_
159 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
160 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
161 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
163 parameter( one = 1.0e+0, zero = 0.0e+0 )
167 CHARACTER COLBTOP, ROWBTOP
168 INTEGER IACOL, IAROW, I, ICTXT, , LWMIN, MP, MPA0,
169 $ mycol, myrow, npcol, nprow, nqa0
178 INTEGER INDXG2L, INDXG2P,
179 EXTERNAL indxg2l, indxg2p,
numroc
182 INTRINSIC max,
min, mod, real
188 ictxt = desca( ctxt_ )
194 IF( nprow.EQ.-1 )
THEN
197 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 7, info )
199 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
201 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
203 mpa0 =
numroc( m+mod( ia-1, desca( mb_ ) ), desca( mb_ ),
204 $ myrow, iarow, nprow )
205 nqa0 =
numroc( n+mod( ja-1, desca( nb_ ) ), desca( nb_ ),
206 $ mycol, iacol, npcol )
207 lwmin = nqa0 +
max( 1, mpa0 )
209 work( 1 ) = real( lwmin )
210 lquery = ( lwork.EQ.-1 )
213 ELSE IF( k.LT.0 .OR. k.GT.m )
THEN
215 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
221 CALL pxerbla( ictxt,
'PSORGR2', -info )
222 CALL blacs_abort( ictxt, 1 )
224 ELSE IF( lquery )
THEN
233 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
234 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
235 CALL pb_topset( ictxt,
'Broadcast', 'rowwise
', ' ' )
236 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', 'i-ring
' )
242 CALL PSLASET( 'all
', M-K, N-M, ZERO, ZERO, A, IA, JA, DESCA )
243 CALL PSLASET( 'all
', M-K, M, ZERO, ONE, A, IA, JA+N-M, DESCA )
248 MP = NUMROC( IA+M-1, DESCA( MB_ ), MYROW, DESCA( RSRC_ ), NPROW )
250 DO 10 I = IA+M-K, IA+M-1
254 CALL PSELSET( A, I, JA+N-M+I-IA, DESCA, ONE )
255 CALL PSLARF( 'right
', I-IA, I-IA+N-M+1, A, I, JA, DESCA,
256 $ DESCA( M_ ), TAU, A, IA, JA, DESCA, WORK )
257 II = INDXG2L( I, DESCA( MB_ ), MYROW, DESCA( RSRC_ ), NPROW )
258 IAROW = INDXG2P( I, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),
261 $ TAUI = TAU( MIN( II, MP ) )
262 CALL PSSCAL( I-IA+N-M, -TAUI, A, I, JA, DESCA, DESCA( M_ ) )
263 CALL PSELSET( A, I, JA+N-M+I-IA, DESCA, ONE-TAUI )
267 CALL PSLASET( 'all
', 1, IA+M-1-I, ZERO, ZERO, A, I,
268 $ JA+N-M+I-IA+1, DESCA )
272 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
273 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
275 WORK( 1 ) = REAL( LWMIN )
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine pslarf(side, m, n, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine psorgr2(m, n, k, a, ia, ja, desca, tau, work, lwork, info)