1 SUBROUTINE psormlq( SIDE, TRANS, M, N, K, A, IA, JA, DESCA, TAU,
2 $ C, IC, JC, DESCC, WORK, LWORK, INFO )
11 INTEGER IA, IC, INFO, JA, JC, K, LWORK, M, N
14 INTEGER DESCA( * ), DESCC( * )
15 REAL A( * ), C( * ), TAU( * ), WORK( * )
219 INTEGER BLOCK_CYCLIC_2D
221 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
222 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
223 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
226 LOGICAL LEFT, LQUERY, NOTRAN
227 CHARACTER COLBTOP, ROWBTOP
228INTEGER I, , I2, I3, IACOL, IB, ICC, ICCOL, ICOFFA,
229 $ icoffc, icrow, ictxt, iinfo, ipw, iroffc, jcc,
230 $ lcm, lcmp, lwmin, mi, mpc0, mqa0, mycol, myrow,
231 $ ni, npcol, nprow, nq, nqc0
234 INTEGER IDUM1( 4 ), IDUM2( 4 )
242 INTEGER ICEIL, ILCM, INDXG2P, NUMROC
243 EXTERNAL iceil, ilcm, indxg2p, lsame, numroc
246 INTRINSIC ichar,
max,
min, mod, real
252 ictxt = desca( ctxt_ )
258 IF( nprow.EQ.-1 )
THEN
261 left = lsame( side,
'L' )
262 notran = lsame( trans, 'n
' )
268 CALL CHK1MAT( K, 5, M, 3, IA, JA, DESCA, 9, INFO )
271 CALL CHK1MAT( K, 5, N, 4, IA, JA, DESCA, 9, INFO )
273 CALL CHK1MAT( M, 3, N, 4, IC, JC, DESCC, 14, INFO )
275 ICOFFA = MOD( JA-1, DESCA( NB_ ) )
276 IROFFC = MOD( IC-1, DESCC( MB_ ) )
277 ICOFFC = MOD( JC-1, DESCC( NB_ ) )
278 IACOL = INDXG2P( JA, DESCA( NB_ ), MYCOL, DESCA( CSRC_ ),
280 ICROW = INDXG2P( IC, DESCC( MB_ ), MYROW, DESCC( RSRC_ ),
282 ICCOL = INDXG2P( JC, DESCC( NB_ ), MYCOL, DESCC( CSRC_ ),
284 MPC0 = NUMROC( M+IROFFC, DESCC( MB_ ), MYROW, ICROW, NPROW )
285 NQC0 = NUMROC( N+ICOFFC, DESCC( NB_ ), MYCOL, ICCOL, NPCOL )
288 MQA0 = NUMROC( M+ICOFFA, DESCA( NB_ ), MYCOL, IACOL,
290 LCM = ILCM( NPROW, NPCOL )
292 LWMIN = MAX( ( DESCA( MB_ ) * ( DESCA( MB_ ) - 1 ) )
293 $ / 2, ( MPC0 + MAX( MQA0 + NUMROC( NUMROC(
294 $ M+IROFFC, DESCA( MB_ ), 0, 0, NPROW ),
295 $ DESCA( MB_ ), 0, 0, LCMP ), NQC0 ) ) *
296 $ DESCA( MB_ ) ) + DESCA( MB_ ) * DESCA( MB_ )
298 LWMIN = MAX( ( DESCA( MB_ ) * ( DESCA( MB_ ) - 1 ) ) / 2,
299 $ ( MPC0 + NQC0 ) * DESCA( MB_ ) ) +
300 $ DESCA( MB_ ) * DESCA( MB_ )
303 WORK( 1 ) = REAL( LWMIN )
304.EQ.
LQUERY = ( LWORK-1 )
305.NOT..AND..NOT.
IF( LEFT LSAME( SIDE, 'r
' ) ) THEN
307.NOT..AND..NOT.
ELSE IF( NOTRAN LSAME( TRANS, 't
' ) ) THEN
309.LT..OR..GT.
ELSE IF( K0 KNQ ) THEN
311.AND..NE.
ELSE IF( LEFT DESCA( NB_ )DESCC( MB_ ) ) THEN
313.AND..NE.
ELSE IF( LEFT ICOFFAIROFFC ) THEN
315.NOT..AND..NE.
ELSE IF( LEFT ICOFFAICOFFC ) THEN
317.NOT..AND..NE.
ELSE IF( LEFT IACOLICCOL ) THEN
319.NOT..AND..NE.
ELSE IF( LEFT DESCA( NB_ )DESCC( NB_ ) ) THEN
321.NE.
ELSE IF( ICTXTDESCC( CTXT_ ) ) THEN
323.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
328 IDUM1( 1 ) = ICHAR( 'l
' )
330 IDUM1( 1 ) = ICHAR( 'r
' )
334 IDUM1( 2 ) = ICHAR( 'n
' )
336 IDUM1( 2 ) = ICHAR( 't
' )
341.EQ.
IF( LWORK-1 ) THEN
348 CALL PCHK2MAT( K, 5, M, 3, IA, JA, DESCA, 9, M, 3, N, 4, IC,
349 $ JC, DESCC, 14, 4, IDUM1, IDUM2, INFO )
351 CALL PCHK2MAT( K, 5, N, 4, IA, JA, DESCA, 9, M, 3, N, 4, IC,
352 $ JC, DESCC, 14, 4, IDUM1, IDUM2, INFO )
357 CALL PXERBLA( ICTXT, 'psormlq', -INFO )
359 ELSE IF( LQUERY ) THEN
365.EQ..OR..EQ..OR..EQ.
IF( M0 N0 K0 )
368 CALL PB_TOPGET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
369 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
371.AND..OR.
IF( ( LEFT NOTRAN )
372.NOT..AND..NOT.
$ ( LEFT NOTRAN ) ) THEN
373 I1 = MIN( ICEIL( IA, DESCA( MB_ ) ) * DESCA( MB_ ), IA+K-1 )
378 I1 = MAX( ( (IA+K-2) / DESCA( MB_ ) ) * DESCA( MB_ ) + 1, IA )
379 I2 = MIN( ICEIL( IA, DESCA( MB_ ) ) * DESCA( MB_ ), IA+K-1 )
390 CALL PB_TOPSET( ICTXT, 'broadcast
', 'rowwise
', ' ' )
392 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise',
'D-ring' )
394 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise',
'I-ring' )
404 IF( ( left .AND. notran ) .OR. ( .NOT.left .AND. .NOT.notran ) )
405 $
CALL psorml2( side, trans, m, n, i1-ia, a, ia, ja, desca, tau,
406 $ c, ic, jc, descc, work, lwork, iinfo )
408 ipw = desca( mb_ ) * desca( mb_ ) + 1
410 ib =
min( desca( mb_ ), k-i+ia )
415 CALL pslarft(
'Forward',
'Rowwise', nq
416 $ desca, tau, work, work( ipw ) )
433 CALL pslarfb( side, transt
'Forward''Rowwise', mi, ni, ib,
434 $ a, i, ja+i-ia, desca, work, c, icc, jcc, descc,
438 IF( ( left .AND. .NOT.notran ) .OR. ( .NOT.left .AND. notran ) )
439 $
CALL psorml2( side, trans, m, n, i2-ia, a, ia, ja, desca, tau,
440 $ c, ic, jc, descc, work, lwork, iinfo )
442 CALL pb_topset( ictxt,
'Broadcast',
'Rowwise', rowbtop )
443 CALL pb_topset( ictxt,
'Broadcast',
'Columnwise', colbtop )
445 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)
subroutine pslarfb(side, trans, direct, storev, m, n, k, v, iv, jv, descv, t, c, ic, jc, descc, work)
subroutine psorml2(side, trans, m, n, k, a, ia, ja, desca, tau, c, ic, jc, descc, work, lwork, info)
subroutine psormlq(side, trans, m, n, k, a, ia, ja, desca, tau, c, ic, jc, descc, work, lwork, info)