1 SUBROUTINE pcunmbr( VECT, SIDE, TRANS, M, N, K, A, IA, JA, DESCA,
2 $ TAU, C, IC, JC, DESCC, WORK, LWORK, INFO )
10 CHARACTER SIDE, TRANS, VECT
11 INTEGER , IC, INFO, JA, JC, K, LWORK, M, N
14 INTEGER DESCA( * ), DESCC( * )
15 COMPLEX A( * ), C( * ), ( * ), WORK( * )
283 INTEGER , CSRC_, CTXT_, DLEN_, DTYPE_,
284 $ lld_, mb_, m_, nb_, n_, rsrc_
285 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
286 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
287 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
290 LOGICAL APPLYQ, LEFT, LQUERY, NOTRAN
292 INTEGER IAA, IACOL, IAROW, ICC, ICCOL, ICOFFA, ICOFFC,
293 $ icrow, ictxt, iinfo, iroffa, iroffc, jaa, jcc,
294 $ lcm, lcmp, lcmq, lwmin, mi, mpc0, mqa0, mycol,
295 $ myrow, ni, npa0, npcol, nprow, nq, nqc0
298 INTEGER IDUM1( 5 ), IDUM2( 5 )
306 INTEGER ILCM, INDXG2P, NUMROC
307 EXTERNAL ilcm, indxg2p, lsame, numroc
310 INTRINSIC cmplx, ichar,
max, mod, real
322 IF( nprow.EQ.-1 )
THEN
325 applyq = lsame( vect,
'Q' )
326 left = lsame( side,
'L' )
327 notran = lsame( trans,
'N' )
333 IF( ( applyq .AND. nq.GE.k ) .OR.
334 $ ( .NOT.applyq .AND. nq.GT.k ) )
THEN
351 CALL chk1mat( m, 4, k, 6, ia, ja, desca, 10, info )
353 CALL chk1mat( k, 6, m, 4, ia, ja, desca, 10, info )
357 IF( ( applyq .AND. nq.GE.k ) .OR.
358 $ ( .NOT.applyq .AND. nq.GT.k ) )
THEN
375 CALL chk1mat( n, 5, k, 6, ia, ja, desca, 10, info )
377 CALL chk1mat( k, 6, n, 5, ia, ja, desca, 10, info )
380 CALL chk1mat( m, 4, n, 5, ic, jc, descc, 15, info )
383 iroffa = mod( iaa-1, desca( mb_ ) )
384 icoffa = mod( jaa-1, desca( nb_ ) )
385 iroffc = mod( icc-1, descc( mb_ ) )
386 icoffc = mod( jcc-1, descc( nb_ ) )
387 iacol = indxg2p( jaa, desca( nb_ ), mycol, desca( csrc_ ),
389 iarow = indxg2p( iaa, desca( mb_ ), myrow, desca( rsrc_ ),
391 icrow = indxg2p( icc, descc( mb_ ), myrow, descc( rsrc_ ),
393 iccol = indxg2p( jcc, descc( nb_ ), mycol, descc( csrc_ ),
395 mpc0 = numroc( mi+iroffc, descc( mb_ ), myrow, icrow,
397 nqc0 = numroc( ni+icoffc, descc( nb_ ), mycol, iccol,
402 lwmin =
max( ( desca( nb_ ) * ( desca( nb_ ) - 1 ) )
406 npa0 = numroc( ni+iroffa, desca( mb_ ), myrow, iarow,
408 lcm = ilcm( nprow, npcol )
410 lwmin =
max( ( desca( nb_ ) * ( desca( nb_ ) - 1 ) )
411 $ / 2, ( nqc0 +
max( npa0 + numroc( numroc(
412 $ ni+icoffc, desca( nb_ ), 0, 0, npcol ),
413 $ desca( nb_ ), 0, 0, lcmq ), mpc0 ) ) *
419 mqa0 = numroc( mi+icoffa, desca( nb_ ), mycol, iacol,
423 lwmin =
max( ( desca( mb_ ) * ( desca( mb_ ) - 1 ) )
424 $ / 2, ( mpc0 +
max( mqa0 + numroc( numroc(
425 $ mi+iroffc, desca( mb_ ), 0, 0, nprow ),
426 $ desca( mb_ ), 0, 0, lcmp ), nqc0 ) ) *
427 $ desca( mb_ ) ) + desca( mb_ ) * desca( mb_ )
429 lwmin =
max( ( desca( mb_ ) * ( desca( mb_ ) - 1 ) )
430 $ / 2, ( mpc0 + nqc0 ) * desca( mb_ ) ) +
431 $ desca( mb_ ) * desca( mb_ )
436 work( 1 ) =
cmplx( real( lwmin ) )
437 lquery = ( lwork.EQ.-1 )
438 IF( .NOT.applyq .AND. .NOT.lsame( vect,
'P' ) )
THEN
440 ELSE IF( .NOT.left .AND. .NOT.lsame( side, 'r
' ) ) THEN
442.NOT..AND..NOT.
ELSE IF( NOTRAN LSAME( TRANS, 'c
' ) ) THEN
444.LT.
ELSE IF( K0 ) THEN
446.AND..NOT..AND.
ELSE IF( APPLYQ LEFT
447.NE.
$ DESCA( MB_ )DESCC( NB_ ) ) THEN
449.AND..AND..NE.
ELSE IF( APPLYQ LEFT IROFFAIROFFC ) THEN
451.AND..AND..NE.
ELSE IF( APPLYQ LEFT IAROWICROW ) THEN
453.NOT..AND..AND.
ELSE IF( APPLYQ LEFT
454.NE.
$ ICOFFAIROFFC ) THEN
456.NOT..AND..NOT..AND.
ELSE IF( APPLYQ LEFT
457.NE.
$ IACOLICCOL ) THEN
459.AND..NOT..AND.
ELSE IF( APPLYQ LEFT
460.NE.
$ IROFFAICOFFC ) THEN
462.NOT..AND..NOT..AND.
ELSE IF( APPLYQ LEFT
463.NE.
$ ICOFFAICOFFC ) THEN
465.AND..AND.
ELSE IF( APPLYQ LEFT
466.NE.
$ DESCA( MB_ )DESCC( MB_ ) ) THEN
468.NOT..AND..AND.
ELSE IF( APPLYQ LEFT
469.NE.
$ DESCA( MB_ )DESCC( MB_ ) ) THEN
471.AND..NOT..AND.
ELSE IF( APPLYQ LEFT
472.NE.
$ DESCA( MB_ )DESCC( NB_ ) ) THEN
474.NOT..AND..NOT..AND.
ELSE IF( APPLYQ LEFT
475.NE.
$ DESCA( NB_ )DESCC( NB_ ) ) THEN
477.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
483 IDUM1( 1 ) = ICHAR( 'q
' )
485 IDUM1( 1 ) = ICHAR( 'p
' )
489 IDUM1( 2 ) = ICHAR( 'l
' )
491 IDUM1( 2 ) = ICHAR( 'r
' )
495 IDUM1( 3 ) = ICHAR( 'n
' )
497 IDUM1( 3 ) = ICHAR( 'c
' )
502.EQ.
IF( LWORK-1 ) THEN
510 CALL PCHK2MAT( M, 4, K, 6, IA, JA, DESCA, 10, M, 4, N,
511 $ 5, IC, JC, DESCC, 15, 5, IDUM1, IDUM2,
514 CALL PCHK2MAT( N, 5, K, 6, IA, JA, DESCA, 10, M, 4, N,
515 $ 5, IC, JC, DESCC, 15, 5, IDUM1, IDUM2,
520 CALL PCHK2MAT( K, 6, M, 4, IA, JA, DESCA, 10, M, 4, N,
521 $ 5, IC, JC, DESCC, 15, 5, IDUM1, IDUM2,
524 CALL PCHK2MAT( K, 6, N, 5, IA, JA, DESCA, 10, M, 4, N,
525 $ 5, IC, JC, DESCC, 15, 5, IDUM1, IDUM2,
532 CALL PXERBLA( ICTXT, 'pcunmbr', -INFO )
534 ELSE IF( LQUERY ) THEN
540.EQ..OR..EQ.
IF( M0 N0 )
551 CALL PCUNMQR( SIDE, TRANS, M, N, K, A, IA, JA, DESCA, TAU,
552 $ C, IC, JC, DESCC, WORK, LWORK, IINFO )
553.GT.
ELSE IF( NQ1 ) THEN
557 CALL PCUNMQR( SIDE, TRANS, MI, NI, NQ-1, A, IA+1, JA, DESCA,
558 $ TAU, C, ICC, JCC, DESCC, WORK, LWORK, IINFO )
573 CALL PCUNMLQ( SIDE, TRANST, M, N, K, A, IA, JA, DESCA, TAU,
574 $ C, IC, JC, DESCC, WORK, LWORK, IINFO )
575.GT.
ELSE IF( NQ1 ) THEN
579 CALL PCUNMLQ( SIDE, TRANST, MI, NI, NQ-1, A, IA, JA+1,
580 $ DESCA, TAU, C, ICC, JCC, DESCC, WORK, LWORK,
585 WORK( 1 ) = CMPLX( REAL( LWMIN ) )