1 SUBROUTINE psorm2r( SIDE, TRANS, M, N, K, A, IA, JA, DESCA, TAU,
2 $ C, IC, JC, DESCC, WORK, LWORK, INFO )
11 INTEGER IA, IC, INFO, JA, JC, K, LWORK, M, N
14 INTEGER DESCA( * ), DESCC( * )
15 REAL A( * ), C( * ), TAU( * ), WORK( * )
209 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
211 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
212 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
213 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
218 LOGICAL LEFT, , NOTRAN
219 CHARACTER COLBTOP, ROWBTOP
220 INTEGER IACOL, IAROW, ICCOL, ICOFFC, ICROW, ICTXT, ICC,
221 $ ii, iroffa, iroffc, j, j1, j2, j3, jcc, jj,
230 $ sgerv2d, sgesd2d,
sscal
234 INTEGER ILCM, INDXG2P, NUMROC
235 EXTERNAL ilcm, indxg2p
250 IF( nprow.EQ.-1 )
THEN
253 left = lsame( side,
'L'
254 notran = lsame( trans,
'N' )
260 CALL chk1mat( m, 3, k, 5, ia, ja, desca, 9
263 CALL chk1mat( n, 4, k, 5, ia, ja, desca,
265 CALL chk1mat( m, 3, n, 4, ic, jc, descc, 14, info )
267 iroffa = mod( ia-1, desca( mb_ ) )
268 iroffc = mod( ic-1, descc( mb_ ) )
269 icoffc = mod( jc-1, descc( nb_ ) )
270 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
272 icrow = indxg2p( ic, descc( mb_ ), myrow, descc( rsrc_
274 iccol = indxg2p( jc, descc( nb_ ), mycol, descc( csrc_ ),
276 mpc0 = numroc( m+iroffc, descc( mb_ ), myrow, icrow, nprow )
277 nqc0 = numroc( n+icoffc, descc( nb_ ), mycol, iccol, npcol )
280 lwmin = mpc0 +
max( 1, nqc0 )
282 lcm = ilcm( nprow, npcol )
284 lwmin = nqc0 +
max(
max( 1, mpc0 ), numroc( numroc(
285 $ n+icoffc, desca( nb_ ), 0, 0, npcol ),
286 $ desca( nb_ ), 0, 0, lcmq ) )
289 work( 1 ) = real( lwmin )
290 lquery = ( lwork.EQ.-1 )
291 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
293 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) )
THEN
295 ELSE IF( k.LT.0 .OR. k.GT.nq )
THEN
297 ELSE IF( .NOT.left .AND. desca( mb_ ).NE.descc( nb_ ) )
THEN
299 ELSE IF( left .AND. iroffa.NE.iroffc )
THEN
301 ELSE IF( left .AND. iarow.NE.icrow )
THEN
303 ELSE IF( .NOT.left .AND. iroffa.NE.icoffc )
THEN
305 ELSE IF( left .AND. desca( mb_ ).NE.descc( mb_ ) )
THEN
307 ELSE IF( ictxt.NE.descc( ctxt_ ) )
THEN
309 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
316 CALL pxerbla( ictxt,
'PSORM2R', -info )
317 CALL blacs_abort( ictxt, 1 )
319 ELSE IF( lquery )
THEN
325 IF( m.EQ.0 .OR. n.EQ.0 .OR. k.EQ.0 )
328 IF( desca( m_ ).EQ.1 )
THEN
329 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii,
331 CALL infog2l( ic, jc, descc, nprow, npcol, myrow, mycol
332 $ jcc, icrow, iccol )
334 IF( myrow.EQ.iarow )
THEN
335 nq = numroc( jc+n-1, descc( nb_ ), mycol, descc( csrc_ ),
337 IF( mycol.EQ.iacol )
THEN
338 ajj = one - tau( jj )
339 CALL sgebs2d( ictxt,
'Rowwise',
' ', 1, 1, ajj, 1 )
340 CALL sscal( nq-jcc+1, ajj,
341 $ c( icc+(jcc-1)*descc( lld_ ) ),
344 CALL sgebr2d( ictxt,
'Rowwise', '
', 1, 1, AJJ, 1,
346 CALL SSCAL( NQ-JCC+1, AJJ,
347 $ C( ICC+(JCC-1)*DESCC( LLD_ ) ),
352.EQ.
IF( MYCOLIACOL ) THEN
353 AJJ = ONE - TAU( JJ )
356.NE.
IF( IACOLICCOL ) THEN
358 $ CALL SGESD2D( ICTXT, 1, 1, AJJ, 1, MYROW, ICCOL )
360 $ CALL SGERV2D( ICTXT, 1, 1, AJJ, 1, MYROW, IACOL )
363.EQ.
IF( MYCOLICCOL ) THEN
364 MP = NUMROC( IC+M-1, DESCC( MB_ ), MYROW, DESCC( RSRC_ ),
366 CALL SSCAL( MP-ICC+1, AJJ, C( ICC+(JCC-1)*
367 $ DESCC( LLD_ ) ), 1 )
374 CALL PB_TOPGET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
375 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
377.AND..NOT..OR..NOT..AND.
IF( LEFT NOTRAN LEFT NOTRAN ) THEN
391 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', 'd-ring
' )
393 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', 'i-ring
' )
395 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', ' ' )
418 CALL PSELSET2( AJJ, A, IA+J-JA, J, DESCA, ONE )
419 CALL PSLARF( SIDE, MI, NI, A, IA+J-JA, J, DESCA, 1, TAU, C,
420 $ ICC, JCC, DESCC, WORK )
421 CALL PSELSET( A, IA+J-JA, J, DESCA, AJJ )
425 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
426 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
430 WORK( 1 ) = REAL( LWMIN )