1 SUBROUTINE psormtr( SIDE, UPLO, TRANS, M, N, A, IA, JA, DESCA,
2 $ TAU, C, IC, JC, DESCC, WORK, LWORK, INFO )
10 CHARACTER SIDE, TRANS, UPLO
14 INTEGER DESCA( * ), DESCC( * )
15 REAL A( * ), C( * ), TAU( * ), WORK( * )
235 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
236 $ lld_, mb_, m_, nb_, n_, rsrc_
237 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
238 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
239 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
242 LOGICAL LEFT, LQUERY, NOTRAN, UPPER
243 INTEGER IAA, IAROW, ICC, ICCOL, ICOFFC, ICROW, ICTXT,
244 $ iinfo, iroffa, iroffc, jaa, jcc, lcm, lcmq,
245 $ lwmin, mi, mpc0, mycol, myrow, ni, npa0, npcol,
249 INTEGER IDUM1( 4 ), IDUM2( 4 )
257 INTEGER ILCM, INDXG2P, NUMROC
258 EXTERNAL ilcm, indxg2p, lsame, numroc
261 INTRINSIC ichar,
max, mod, real
267 ictxt = desca( ctxt_ )
273 IF( nprow.EQ.-1 )
THEN
276 left = lsame( side,
'L' )
277 notran = lsame( trans,
'N' )
278 upper = lsame( uplo,
'U' )
303 CALL chk1mat( mi, 4, nq-1, 4, iaa, jaa, desca, 9, info )
308 CALL chk1mat( ni, 5, nq-1, 5, iaa, jaa, desca, 9, info )
310 CALL chk1mat( mi, 4, ni, 5, icc, jcc, descc, 14, info )
312 iroffa = mod( iaa-1, desca( mb_ ) )
313 iroffc = mod( icc-1, descc( mb_ ) )
314 icoffc = mod( jcc-1, descc( nb_ ) )
315 iarow = indxg2p( iaa, desca( mb_ ), myrow, desca( rsrc_ ),
317 icrow = indxg2p( icc, descc( mb_ ), myrow, descc( rsrc_ ),
319 iccol = indxg2p( jcc, descc( nb_ ), mycol, descc( csrc_ ),
321 mpc0 = numroc( mi+iroffc, descc( mb_ ), myrow, icrow,
323 nqc0 = numroc( ni+icoffc, descc( nb_ ), mycol, iccol,
327 lwmin =
max( ( desca( nb_ ) * ( desca( nb_ ) - 1 ) ) / 2,
328 $ ( mpc0 + nqc0 ) * desca( nb_ ) ) +
329 $ desca( nb_ ) * desca( nb_ )
331 npa0 = numroc( ni+iroffa, desca( mb_ ), myrow, iarow,
333 lcm = ilcm( nprow, npcol )
335 lwmin =
max( ( desca( nb_ ) * ( desca( nb_ ) - 1 ) )
336 $ / 2, ( nqc0 +
max( npa0 + numroc( numroc(
337 $ ni+icoffc, desca( nb_ ), 0, 0, npcol ),
338 $ desca( nb_ ), 0, 0, lcmq ), mpc0 ) ) *
339 $ desca( nb_ ) ) + desca( nb_ ) * desca( nb_ )
342 work( 1 ) = real( lwmin )
343 lquery = ( lwork.EQ.-1 )
344 IF( .NOT.left .AND. .NOT.lsame( side,
'R' ) )
THEN
346 ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
348 ELSE IF( .NOT.lsame( trans, 'n.AND.
' )
349.NOT.
$ LSAME( TRANS, 't
' ) ) THEN
351.NOT..AND..NE.
ELSE IF( LEFT DESCA( MB_ )DESCC( NB_ ) ) THEN
353.AND..NE.
ELSE IF( LEFT IROFFAIROFFC ) THEN
355.AND..NE.
ELSE IF( LEFT IAROWICROW ) THEN
357.NOT..AND..NE.
ELSE IF( LEFT IROFFAICOFFC ) THEN
359.AND..NE.
ELSE IF( LEFT DESCA( MB_ )DESCC( MB_ ) ) THEN
361.NE.
ELSE IF( ICTXTDESCC( CTXT_ ) ) THEN
363.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
369 IDUM1( 1 ) = ICHAR( 'l
' )
371 IDUM1( 1 ) = ICHAR( 'r
' )
375 IDUM1( 2 ) = ICHAR( 'u
' )
377 IDUM1( 2 ) = ICHAR( 'l
' )
381 IDUM1( 3 ) = ICHAR( 'n
' )
383 IDUM1( 3 ) = ICHAR( 't
' )
386.EQ.
IF( LWORK-1 ) THEN
393 CALL PCHK2MAT( MI, 4, NQ-1, 4, IAA, JAA, DESCA, 9, MI, 4,
394 $ NI, 5, ICC, JCC, DESCC, 14, 4, IDUM1, IDUM2,
397 CALL PCHK2MAT( NI, 5, NQ-1, 5, IAA, JAA, DESCA, 9, MI, 4,
398 $ NI, 5, ICC, JCC, DESCC, 14, 4, IDUM1, IDUM2,
404 CALL PXERBLA( ICTXT, 'psormtr', -INFO )
406 ELSE IF( LQUERY ) THEN
412.EQ..OR..EQ..OR..EQ.
IF( M0 N0 NQ1 )
419 CALL PSORMQL( SIDE, TRANS, MI, NI, NQ-1, A, IAA, JAA, DESCA,
420 $ TAU, C, ICC, JCC, DESCC, WORK, LWORK, IINFO )
426 CALL PSORMQR( SIDE, TRANS, MI, NI, NQ-1, A, IAA, JAA, DESCA,
427 $ TAU, C, ICC, JCC, DESCC, WORK, LWORK, IINFO )
431 WORK( 1 ) = REAL( LWMIN )
subroutine pchk2mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, mb, mbpos0, nb, nbpos0, ib, jb, descb, descbpos0, nextra, ex, expos, info)