1 SUBROUTINE pcunmhr( SIDE, TRANS, M, N, ILO, IHI, A, IA, JA, DESCA,
2 $ TAU, C, IC, JC, DESCC, WORK, LWORK, INFO )
11 INTEGER IA, IC, IHI, ILO, , JA, , LWORK, M, N
14 INTEGER DESCA( * ), DESCC( * )
15 COMPLEX A( * ), C( * ), TAU( * ), WORK( * )
221 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
222 $ lld_, mb_, m_, nb_, n_, rsrc_
223 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
224 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
225 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
228 LOGICAL , LQUERY, NOTRAN
229 INTEGER IAA, IAROW, ICC, ICCOL, ICOFFC, ICROW, ICTXT,
230 $ iinfo, iroffa, iroffc, jaa, jcc, lcm, lcmq,
231 $ lwmin, mi, mpc0, mycol, myrow, nh, ni, npa0,
232 $ npcol, nprow, nq, nqc0
235 INTEGER IDUM1( 5 ), IDUM2( 5 )
243 INTEGER ILCM, INDXG2P, NUMROC
244 EXTERNAL ilcm, indxg2p, lsame, numroc
253 ictxt = desca( ctxt_ )
260 IF( nprow.EQ.-1 )
THEN
263 left = lsame( side,
'L' )
264 notran = lsame( trans, 'n
' )
276 CALL CHK1MAT( M, 3, M, 3, IA, JA, DESCA, 10, INFO )
283 CALL CHK1MAT( N, 4, N, 4, IA, JA, DESCA, 10, INFO )
285 CALL CHK1MAT( M, 3, N, 4, IC, JC, DESCC, 15, INFO )
287 IROFFA = MOD( IAA-1, DESCA( MB_ ) )
288 IROFFC = MOD( ICC-1, DESCC( MB_ ) )
289 ICOFFC = MOD( JCC-1, DESCC( NB_ ) )
290 IAROW = INDXG2P( IAA, DESCA( MB_ ), MYROW, DESCA( RSRC_ ),
292 ICROW = INDXG2P( ICC, DESCC( MB_ ), MYROW, DESCC( RSRC_ ),
294 ICCOL = INDXG2P( JCC, DESCC( NB_ ), MYCOL, DESCC( CSRC_ ),
296 MPC0 = NUMROC( MI+IROFFC, DESCC( MB_ ), MYROW, ICROW,
298 NQC0 = NUMROC( NI+ICOFFC, DESCC( NB_ ), MYCOL, ICCOL,
302 LWMIN = MAX( ( DESCA( NB_ ) * ( DESCA( NB_ ) - 1 ) ) / 2,
303 $ ( MPC0 + NQC0 ) * DESCA( NB_ ) ) +
304 $ DESCA( NB_ ) * DESCA( NB_ )
306 NPA0 = NUMROC( NI+IROFFA, DESCA( MB_ ), MYROW, IAROW,
308 LCM = ILCM( NPROW, NPCOL )
310 LWMIN = MAX( ( DESCA( NB_ ) * ( DESCA( NB_ ) - 1 ) )
311 $ / 2, ( NQC0 + MAX( NPA0 + NUMROC( NUMROC(
312 $ NI+ICOFFC, DESCA( NB_ ), 0, 0, NPCOL ),
313 $ DESCA( NB_ ), 0, 0, LCMQ ), MPC0 ) ) *
314 $ DESCA( NB_ ) ) + DESCA( NB_ ) * DESCA( NB_ )
317 WORK( 1 ) = CMPLX( REAL( LWMIN ) )
318.EQ.
LQUERY = ( LWORK-1 )
319.NOT..AND..NOT.
IF( LEFT LSAME( SIDE, 'r
' ) ) THEN
321.NOT..AND..NOT.
ELSE IF( NOTRAN LSAME( TRANS, 'c
' ) ) THEN
323.LT..OR..GT.
ELSE IF( ILO1 ILOMAX( 1, NQ ) ) THEN
325.LT..OR..GT.
ELSE IF( IHIMIN( ILO, NQ ) IHINQ ) THEN
327.NOT..AND..NE.
ELSE IF( LEFT DESCA( MB_ )DESCC( NB_ ) ) THEN
329.AND..NE.
ELSE IF( LEFT IROFFAIROFFC ) THEN
331.AND..NE.
ELSE IF( LEFT IAROWICROW ) THEN
333.NOT..AND..NE.
ELSE IF( LEFT IROFFAICOFFC ) THEN
335.AND..NE.
ELSE IF( LEFT DESCA( MB_ )DESCC( MB_ ) ) THEN
337.NE.
ELSE IF( ICTXTDESCC( CTXT_ ) ) THEN
339.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
345 IDUM1( 1 ) = ICHAR( 'l
' )
347 IDUM1( 1 ) = ICHAR( 'r
' )
351 IDUM1( 2 ) = ICHAR( 'n
' )
353 IDUM1( 2 ) = ICHAR( 'c
' )
360.EQ.
IF( LWORK-1 ) THEN
367 CALL PCHK2MAT( M, 3, M, 3, IA, JA, DESCA, 10, M, 3, N, 4,
368 $ IC, JC, DESCC, 15, 5, IDUM1, IDUM2, INFO )
370 CALL PCHK2MAT( N, 4, N, 4, IA, JA, DESCA, 10, M, 3, N, 4,
371 $ IC, JC, DESCC, 15, 5, IDUM1, IDUM2, INFO )
376 CALL PXERBLA( ICTXT, 'pcunmhr', -INFO )
378 ELSE IF( LQUERY ) THEN
384.EQ..OR..EQ..OR..EQ.
IF( M0 N0 NH0 )
387 CALL PCUNMQR( SIDE, TRANS, MI, NI, NH, A, IAA, JAA, DESCA, TAU,
388 $ C, ICC, JCC, DESCC, WORK, LWORK, IINFO )
390 WORK( 1 ) = CMPLX( REAL( LWMIN ) )
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine pchk2mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, mb, mbpos0, nb, nbpos0, ib, jb, descb, descbpos0, nextra, ex, expos, info)
subroutine pcunmqr(side, trans, m, n, k, a, ia, ja, desca, tau, c, ic, jc, descc, work, lwork, info)
subroutine pcunmhr(side, trans, m, n, ilo, ihi, a, ia, ja, desca, tau, c, ic, jc, descc, work, lwork, info)