1 SUBROUTINE pcunmr3( SIDE, TRANS, M, N, K, L, A, IA, JA, DESCA,
2 $ TAU, C, IC, JC, DESCC, WORK, LWORK, INFO )
11 INTEGER IA, IC, INFO, JA, JC, K, L, LWORK, M, N
14 INTEGER DESCA( * ), DESCC( * )
15 COMPLEX A( * ), C( * ), TAU( * ), WORK( * )
214 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
215 $ lld_, mb_, m_, nb_, n_, rsrc_
216 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
217 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
218 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
221 LOGICAL LEFT, LQUERY, NOTRAN
222 CHARACTER COLBTOP, ROWBTOP
223 INTEGER I, I1, I2, I3, IACOL, ICC, ICCOL, ICOFFA,
224 $ icoffc, icrow, ictxt, iroffc, jaa, jcc, lcm,
225 $ lcmp, lwmin, mi, mpc0, mycol, myrow, ni, npcol,
234 INTEGER ILCM, INDXG2P, NUMROC
235 EXTERNAL ilcm, indxg2p, lsame, numroc
244 ictxt = desca( ctxt_ )
253 left = lsame( side, 'l
' )
254 NOTRAN = LSAME( TRANS, 'n
' )
260 CALL CHK1MAT( K, 5, M, 3, IA, JA, DESCA, 10, INFO )
263 CALL CHK1MAT( K, 5, N, 4, IA, JA, DESCA, 10, INFO )
265 CALL CHK1MAT( M, 3, N, 4, IC, JC, DESCC, 15, INFO )
267 ICOFFA = MOD( JA-1, DESCA( NB_ ) )
268 IROFFC = MOD( IC-1, DESCC( MB_ ) )
269 ICOFFC = MOD( JC-1, DESCC( NB_ ) )
270 IACOL = INDXG2P( JA, DESCA( NB_ ), MYCOL, DESCA( CSRC_ ),
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 LCM = ILCM( NPROW, NPCOL )
282 LWMIN = MPC0 + MAX( MAX( 1, NQC0 ), NUMROC( NUMROC(
283 $ M+IROFFC, DESCA( MB_ ), 0, 0, NPROW ),
284 $ DESCA( MB_ ), 0, 0, LCMP ) )
286 LWMIN = NQC0 + MAX( 1, MPC0 )
289 WORK( 1 ) = CMPLX( REAL( LWMIN ) )
290.EQ.
LQUERY = ( LWORK-1 )
291.NOT..AND..NOT.
IF( LEFT LSAME( SIDE, 'r
' ) ) THEN
293.NOT..AND..NOT.
ELSE IF( NOTRAN LSAME( TRANS, 'c
' ) ) THEN
295.LT..OR..GT.
ELSE IF( K0 KNQ ) THEN
297.LT..OR..GT.
ELSE IF( L0 LNQ ) THEN
299.AND..NE.
ELSE IF( LEFT DESCA( NB_ )DESCC( MB_ ) ) THEN
301.AND..NE.
ELSE IF( LEFT ICOFFAIROFFC ) THEN
303.NOT..AND..NE.
ELSE IF( LEFT ICOFFAICOFFC ) THEN
305.NOT..AND..NE.
ELSE IF( LEFT IACOLICCOL ) THEN
307.NOT..AND..NE.
ELSE IF( LEFT DESCA( NB_ )DESCC( NB_ ) ) THEN
309.NE.
ELSE IF( ICTXTDESCC( CTXT_ ) ) THEN
311.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
318 CALL PXERBLA( ICTXT, 'pcunmr3', -info )
319 CALL blacs_abort( ictxt, 1 )
321 ELSE IF( lquery )
THEN
327 IF( m.EQ.0 .OR. n.EQ.0 .OR. k.EQ.0 )
330 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
331 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise', colbtop )
333 IF( ( left .AND. .NOT.notran .OR. .NOT.left .AND. notran ) )
THEN
351 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise',
' ' )
353 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise',
'I-ring' )
355 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise',
'D-ring' )
377 CALL pclarz( side, mi, ni, l, a, i, jaa, desca, desca( m_ ),
378 $ tau, c, icc, jcc, descc, work )
380 CALL pclarzc( side, mi, ni, l, a, i, jaa, desca,
381 $ desca( m_ ), tau, c, icc, jcc, descc, work )
386 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise', rowbtop )
387 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise', colbtop )
389 work( 1 ) =
cmplx( real( lwmin ) )
subroutine pclarz(side, m, n, l, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pclarzc(side, m, n, l, v, iv, jv, descv, incv, tau, c, ic, jc, descc, work)
subroutine pcunmr3(side, trans, m, n, k, l, a, ia, ja, desca, tau, c, ic, jc, descc, work, lwork, info)