1 SUBROUTINE pcunmrz( SIDE, TRANS, M, N, K, L, A, IA, JA, DESCA,
2 $ TAU, C, IC, JC, DESCC, WORK, LWORK, INFO )
11 INTEGER IA, IC, , JA, JC, K, L, LWORK, M, N
14 INTEGER DESCA( * ), DESCC( * )
15 COMPLEX A( * ), C( * ), TAU( * ), WORK( * )
224 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
225 $ lld_, mb_, m_, nb_, n_, rsrc_
226 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
227 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
228 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
231 LOGICAL LEFT, LQUERY, NOTRAN
232 CHARACTER COLBTOP, ROWBTOP, TRANST
233 INTEGER I, I1, I2, I3, IACOL, , ICC, ICCOL, ICOFFA,
234 $ icoffc, icrow, ictxt, iinfo, ipw, iroffc, jaa,
235 $ jcc, lcm, lcmp, lwmin, mi, mpc0, mqa0, mycol,
236 $ myrow, ni, npcol, nprow, nq, nqc0
239 INTEGER IDUM1( 5 ), IDUM2( 5 )
247 INTEGER ICEIL, ILCM, INDXG2P, NUMROC
248 EXTERNAL iceil, ilcm, indxg2p, lsame, numroc
257 ictxt = desca( ctxt_ )
263 IF( nprow.EQ.-1 )
THEN
266 left = lsame( side,
'L' )
267 notran = lsame( trans,
'N' )
273 CALL chk1mat( k, 5, m, 3, ia, ja, desca, 10, info )
276 CALL chk1mat( k, 5, n, 4, ia, ja, desca, 10, info )
278 CALL chk1mat( m, 3, n, 4, ic, jc, descc, 15, info )
280 icoffa = mod( ja-1, desca( nb_ ) )
281 iroffc = mod( ic-1, descc( mb_ ) )
282 icoffc = mod( jc-1, descc( nb_ ) )
283 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
285 icrow = indxg2p( ic, descc( mb_ ), myrow, descc( rsrc_ ),
287 iccol = indxg2p( jc, descc( nb_ ), mycol, descc( csrc_ ),
289 mpc0 = numroc( m+iroffc, descc( mb_ ), myrow, icrow, nprow )
290 nqc0 = numroc( n+icoffc, descc( nb_ ), mycol, iccol, npcol )
293 mqa0 = numroc( m+icoffa, desca( nb_ ), mycol, iacol,
295 lcm = ilcm( nprow, npcol )
297 lwmin =
max( ( desca( mb_ ) * ( desca( mb_ ) - 1 ) )
298 $ / 2, ( mpc0 +
max( mqa0 + numroc( numroc(
299 $ m+iroffc, desca( mb_ ), 0, 0, nprow ),
300 $ desca( mb_ ), 0, 0, lcmp ), nqc0 ) ) *
301 $ desca( mb_ ) ) + desca( mb_ ) * desca( mb_ )
303 lwmin =
max( ( desca( mb_ ) * ( desca( mb_ ) - 1 ) ) / 2,
304 $ ( mpc0 + nqc0 ) * desca( mb_ ) ) +
305 $ desca( mb_ ) * desca( mb_ )
308 work( 1 ) =
cmplx( real( lwmin ) )
309 lquery = ( lwork.EQ.-1 )
310 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
312 ELSE IF( .NOT.notran .AND. .NOT.lsame( trans, 'c
' ) ) THEN
314.LT..OR..GT.
ELSE IF( K0 KNQ ) THEN
316.LT..OR..GT.
ELSE IF( K0 KNQ ) THEN
318.AND..NE.
ELSE IF( LEFT DESCA( NB_ )DESCC( MB_ ) ) THEN
320.AND..NE.
ELSE IF( LEFT ICOFFAIROFFC ) THEN
322.NOT..AND..NE.
ELSE IF( LEFT ICOFFAICOFFC ) THEN
324.NOT..AND..NE.
ELSE IF( LEFT IACOLICCOL ) THEN
326.NOT..AND..NE.
ELSE IF( LEFT DESCA( NB_ )DESCC( NB_ ) ) THEN
328.NE.
ELSE IF( ICTXTDESCC( CTXT_ ) ) THEN
330.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
335 IDUM1( 1 ) = ICHAR( 'l
' )
337 IDUM1( 1 ) = ICHAR( 'r
' )
341 IDUM1( 2 ) = ICHAR( 'n
' )
343 IDUM1( 2 ) = ICHAR( 'c
' )
350.EQ.
IF( LWORK-1 ) THEN
357 CALL PCHK2MAT( K, 5, M, 3, IA, JA, DESCA, 10, M, 3, N, 4,
358 $ IC, JC, DESCC, 15, 5, IDUM1, IDUM2, INFO )
360 CALL PCHK2MAT( K, 5, N, 4, IA, JA, DESCA, 10, M, 3, N, 4,
361 $ IC, JC, DESCC, 15, 5, IDUM1, IDUM2, INFO )
366 CALL PXERBLA( ICTXT, 'pcunmrz', -INFO )
368 ELSE IF( LQUERY ) THEN
374.EQ..OR..EQ..OR..EQ.
IF( M0 N0 K0 )
377 CALL PB_TOPGET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
378 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
380.AND..NOT..OR.
IF( ( LEFT NOTRAN )
381.NOT..AND.
$ ( LEFT NOTRAN ) ) THEN
382 I1 = MIN( ICEIL( IA, DESCA( MB_ ) ) * DESCA( MB_ ), IA+K-1 )
387 I1 = MAX( ( (IA+K-2) / DESCA( MB_ ) ) * DESCA( MB_ ) + 1, IA )
388 I2 = MIN( ICEIL( IA, DESCA( MB_ ) ) * DESCA( MB_ ), IA+K-1 )
401 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ' ' )
403 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', 'i-ring
' )
405 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', 'd-ring
' )
415.AND..NOT..OR.
IF( ( LEFT NOTRAN )
416.NOT..AND.
$ ( LEFT NOTRAN ) ) THEN
423 CALL PCUNMR3( SIDE, TRANS, MI, NI, IB, L, A, IA, JA, DESCA,
424 $ TAU, C, IC, JC, DESCC, WORK, LWORK, IINFO )
427 IPW = DESCA( MB_ )*DESCA( MB_ ) + 1
429 IB = MIN( DESCA( MB_ ), K-I+IA )
434 CALL PCLARZT( 'backward
', 'rowwise
', L, IB, A, I, JAA, DESCA,
435 $ TAU, WORK, WORK( IPW ) )
452 CALL PCLARZB( SIDE, TRANST, 'backward
', 'rowwise
', MI, NI, IB,
453 $ L, A, I, JAA, DESCA, WORK, C, ICC, JCC, DESCC,
457.AND..NOT..OR.
IF( ( LEFT NOTRAN )
458.NOT..AND.
$ ( LEFT NOTRAN ) ) THEN
465 CALL PCUNMR3( SIDE, TRANS, MI, NI, IB, L, A, IA, JA, DESCA,
466 $ TAU, C, IC, JC, DESCC, WORK, LWORK, IINFO )
469 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
470 CALL PB_TOPSET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
472 WORK( 1 ) = CMPLX( REAL( LWMIN ) )