1 SUBROUTINE pclarzb( SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V,
2 $ IV, JV, DESCV, T, C, IC, JC, DESCC, WORK )
9 CHARACTER DIRECT, SIDE, STOREV, TRANS
10 INTEGER IC, IV, JC, JV, K, L, M, N
13 INTEGER DESCC( * ), DESCV( * )
14 COMPLEX C( * ), T( * ), V( * ), 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 )
227 parameter( one = ( 1.0e+0, 0.0e+0 ),
228 $ zero = ( 0.0e+0, 0.0e+0 ) )
232 CHARACTER COLBTOP, TRANST
233 INTEGER ICCOL1, ICCOL2, ICOFFC1, ICOFFC2, ICOFFV,
234 $ icrow1, icrow2, ictxt, iibeg, iic1, iic2,
235 $ iiend, iinxt, iiv, ileft, info, ioffc2, ioffv,
236 $ ipt, ipv, ipw, iroffc1, iroffc2, itop, ivcol,
237 $ ivrow, j, jjbeg, jjend, jjnxt, jjc1, jjc2, jjv,
238 $ ldc, ldv, lv, lw, mbc, mbv, mpc1, mpc2, mpc20,
239 $ mqv, mqv0, mycol, mydist, myrow, nbc
240 $ npcol, nprow, nqc1, nqc2, nqcall, nqv
245 $ clamov,
claset, ctrbr2d, ctrbs2d,
254 INTEGER ICEIL, NUMROC
255 EXTERNAL iceil, lsame, numroc
261 IF( m.LE.0 .OR. n.LE.0 .OR. k.LE.0 )
266 ictxt = descc( ctxt_ )
272 IF( .NOT.lsame( direct,
'B' THEN
274 ELSE IF( .NOT.lsame( storev,
'R' ) )
THEN
278 CALL pxerbla( ictxt,
'PCLARZB', -info )
279 CALL blacs_abort( ictxt, 1 )
283 left = lsame( side,
'L' )
284 IF( lsame( trans, 'n
' ) ) THEN
290 CALL INFOG2L( IV, JV, DESCV, NPROW, NPCOL, MYROW, MYCOL, IIV, JJV,
294 ICOFFV = MOD( JV-1, NBV )
295 NQV = NUMROC( L+ICOFFV, NBV, MYCOL, IVCOL, NPCOL )
299 IIV = MIN( IIV, LDV )
300 JJV = MIN( JJV, MAX( 1, NUMROC( DESCV( N_ ), NBV, MYCOL,
301 $ DESCV( CSRC_ ), NPCOL ) ) )
302 IOFFV = IIV + ( JJV-1 ) * LDV
305 NQCALL = NUMROC( DESCC( N_ ), NBC, MYCOL, DESCC( CSRC_ ), NPCOL )
306 CALL INFOG2L( IC, JC, DESCC, NPROW, NPCOL, MYROW, MYCOL, IIC1,
307 $ JJC1, ICROW1, ICCOL1 )
309 IIC1 = MIN( IIC1, LDC )
310 JJC1 = MIN( JJC1, MAX( 1, NQCALL ) )
313 IROFFC1 = MOD( IC-1, MBC )
314 MPC1 = NUMROC( K+IROFFC1, MBC, MYROW, ICROW1, NPROW )
315.EQ.
IF( MYROWICROW1 )
316 $ MPC1 = MPC1 - IROFFC1
317 ICOFFC1 = MOD( JC-1, NBC )
318 NQC1 = NUMROC( N+ICOFFC1, NBC, MYCOL, ICCOL1, NPCOL )
319.EQ.
IF( MYCOLICCOL1 )
320 $ NQC1 = NQC1 - ICOFFC1
321 CALL INFOG2L( IC+M-L, JC, DESCC, NPROW, NPCOL, MYROW, MYCOL,
322 $ IIC2, JJC2, ICROW2, ICCOL2 )
323 IROFFC2 = MOD( IC+M-L-1, MBC )
324 MPC2 = NUMROC( L+IROFFC2, MBC, MYROW, ICROW2, NPROW )
325.EQ.
IF( MYROWICROW2 )
326 $ MPC2 = MPC2 - IROFFC2
330 IROFFC1 = MOD( IC-1, MBC )
331 MPC1 = NUMROC( M+IROFFC1, MBC, MYROW, ICROW1, NPROW )
332.EQ.
IF( MYROWICROW1 )
333 $ MPC1 = MPC1 - IROFFC1
334 ICOFFC1 = MOD( JC-1, NBC )
335 NQC1 = NUMROC( K+ICOFFC1, NBC, MYCOL, ICCOL1, NPCOL )
336.EQ.
IF( MYCOLICCOL1 )
337 $ NQC1 = NQC1 - ICOFFC1
338 CALL INFOG2L( IC, JC+N-L, DESCC, NPROW, NPCOL, MYROW, MYCOL,
339 $ IIC2, JJC2, ICROW2, ICCOL2 )
342 ICOFFC2 = MOD( JC+N-L-1, NBC )
343 NQC2 = NUMROC( L+ICOFFC2, NBC, MYCOL, ICCOL2, NPCOL )
344.EQ.
IF( MYCOLICCOL2 )
345 $ NQC2 = NQC2 - ICOFFC2
347 IIC2 = MIN( IIC2, LDC )
348 JJC2 = MIN( JJC2, NQCALL )
349 IOFFC2 = IIC2 + ( JJC2-1 ) * LDC
351 IF( LSAME( SIDE, 'l
' ) ) THEN
358 MQV0 = NUMROC( M+ICOFFV, NBV, MYCOL, IVCOL, NPCOL )
359.EQ.
IF( MYCOLIVCOL ) THEN
364.EQ.
IF( MYROWICROW2 ) THEN
365 MPC20 = MPC2 + IROFFC2
376 IPW = IPV + MPC20 * K
381.EQ.
IF( MYROWIVROW ) THEN
382.EQ.
IF( MYCOLIVCOL ) THEN
383 CALL CLAMOV( 'all
', K, MQV, V( IOFFV ), LDV,
384 $ WORK( IPW+ICOFFV*LW ), LW )
386 CALL CLAMOV( 'all
', K, MQV, V( IOFFV ), LDV,
393 CALL PBCTRAN( ICTXT, 'rowwise
', 'conjugate transpose
', K,
394 $ M+ICOFFV, DESCV( NB_ ), WORK( IPW ), LW, ZERO,
395 $ WORK( IPV ), LV, IVROW, IVCOL, ICROW2, -1,
400.EQ.
IF( MYROWICROW2 )
401 $ IPV = IPV + IROFFC2
409 CALL CGEMM( 'transpose
', 'no transpose
', NQC2, K, MPC2,
410 $ ONE, C( IOFFC2 ), LDC, WORK( IPV ), LV, ZERO,
413 CALL CLASET( 'all
', NQC2, K, ZERO, ZERO, WORK( IPW ), LW )
419 MYDIST = MOD( MYROW-ICROW1+NPROW, NPROW )
420 ITOP = MAX( 0, MYDIST * MBC - IROFFC1 )
422 IIEND = IIC1 + MPC1 - 1
423 IINXT = MIN( ICEIL( IIBEG, MBC ) * MBC, IIEND )
426.LE.
IF( IIBEGIINXT ) THEN
427 CALL PBCMATADD( ICTXT, 'transpose
', NQC2, IINXT-IIBEG+1,
428 $ ONE, C( IIBEG+(JJC1-1)*LDC ), LDC, ONE,
429 $ WORK( IPW+ITOP ), LW )
430 MYDIST = MYDIST + NPROW
431 ITOP = MYDIST * MBC - IROFFC1
433 IINXT = MIN( IINXT+MBC, IIEND )
438 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQC2, K, WORK( IPW ),
443.EQ.
IF( MYROWIVROW ) THEN
444.EQ.
IF( MYCOLIVCOL ) THEN
448 CALL CTRBS2D( ICTXT, 'rowwise
', ' ', 'lower
', 'non unit
',
451 CALL CTRBR2D( ICTXT, 'rowwise
', ' ', 'lower
', 'non unit
',
452 $ K, K, T, MBV, MYROW, IVCOL )
454 CALL CTRMM( 'right
', 'lower
', TRANST, 'non unit
', NQC2, K,
455 $ ONE, T, MBV, WORK( IPW ), LW )
457 CALL CGEBS2D( ICTXT, 'columnwise
', ' ', NQC2, K,
460 CALL CGEBR2D( ICTXT, 'columnwise
', ' ', NQC2, K,
461 $ WORK( IPW ), LW, IVROW, MYCOL )
467 MYDIST = MOD( MYROW-ICROW1+NPROW, NPROW )
468 ITOP = MAX( 0, MYDIST * MBC - IROFFC1 )
470 IIEND = IIC1 + MPC1 - 1
471 IINXT = MIN( ICEIL( IIBEG, MBC ) * MBC, IIEND )
474.LE.
IF( IIBEGIINXT ) THEN
475 CALL PBCMATADD( ICTXT, 'transpose
', IINXT-IIBEG+1, NQC2,
476 $ -ONE, WORK( IPW+ITOP ), LW, ONE,
477 $ C( IIBEG+(JJC1-1)*LDC ), LDC )
478 MYDIST = MYDIST + NPROW
479 ITOP = MYDIST * MBC - IROFFC1
481 IINXT = MIN( IINXT+MBC, IIEND )
491 CALL CLACGV( MPC2, WORK( IPV+(J-1)*LV ), 1 )
493 CALL CGEMM( 'no transpose
', 'transpose
', MPC2, NQC2, K, -ONE,
494 $ WORK( IPV ), LV, WORK( IPW ), LW, ONE,
512 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', COLBTOP )
513.EQ.
IF( MYROWIVROW ) THEN
514 CALL CGEBS2D( ICTXT, 'columnwise
', COLBTOP, K, NQC2,
517 $ CALL CTRBS2D( ICTXT, 'columnwise
', COLBTOP, 'lower
',
518 $ 'non unit
', K, K, T, MBV )
519 CALL CLAMOV( 'all
', K, NQC2, V( IOFFV ), LDV, WORK( IPV ),
522 CALL CGEBR2D( ICTXT, 'columnwise
', COLBTOP, K, NQC2,
523 $ WORK( IPV ), LV, IVROW, MYCOL )
525 $ CALL CTRBR2D( ICTXT, 'columnwise
', COLBTOP, 'lower
',
526 $ 'non unit
', K, K, T, MBV, IVROW, MYCOL )
533 CALL CGEMM( 'no transpose
', 'transpose
', MPC2, K, NQC2,
534 $ ONE, C( IOFFC2 ), LDC, WORK( IPV ), LV, ZERO,
537 CALL CLASET( 'all
', MPC2, K, ZERO, ZERO, WORK( IPW ), LW )
543 MYDIST = MOD( MYCOL-ICCOL1+NPCOL, NPCOL )
544 ILEFT = MAX( 0, MYDIST * NBC - ICOFFC1 )
546 JJEND = JJC1 + NQC1 - 1
547 JJNXT = MIN( ICEIL( JJBEG, NBC ) * NBC, JJEND )
550.LE.
IF( JJBEGJJNXT ) THEN
551 CALL PBCMATADD( ICTXT, 'no transpose
', MPC2,
552 $ JJNXT-JJBEG+1, ONE,
553 $ C( IIC1+(JJBEG-1)*LDC ), LDC, ONE,
554 $ WORK( IPW+ILEFT*LW ), LW )
555 MYDIST = MYDIST + NPCOL
556 ILEFT = MYDIST * NBC - ICOFFC1
558 JJNXT = MIN( JJNXT+NBC, JJEND )
563 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MPC2, K, WORK( IPW ),
568.EQ.
IF( MYCOLIVCOL ) THEN
570 CALL CLACGV( K-J+1, T( J+(J-1)*MBV ), 1 )
572 CALL CTRMM( 'right
', 'lower
', TRANS, 'non unit
', MPC2, K,
573 $ ONE, T, MBV, WORK( IPW ), LW )
574 CALL CGEBS2D( ICTXT, 'rowwise
', ' ', MPC2, K, WORK( IPW ),
577 CALL CLACGV( K-J+1, T( J+(J-1)*MBV ), 1 )
580 CALL CGEBR2D( ICTXT, 'rowwise
', ' ', MPC2, K, WORK( IPW ),
587 MYDIST = MOD( MYCOL-ICCOL1+NPCOL, NPCOL )
588 ILEFT = MAX( 0, MYDIST * NBC - ICOFFC1 )
590 JJEND = JJC1 + NQC1 - 1
591 JJNXT = MIN( ICEIL( JJBEG, NBC ) * NBC, JJEND )
594.LE.
IF( JJBEGJJNXT ) THEN
595 CALL PBCMATADD( ICTXT, 'no transpose
', MPC2,
596 $ JJNXT-JJBEG+1, -ONE,
597 $ WORK( IPW+ILEFT*LW ), LW, ONE,
598 $ C( IIC1+(JJBEG-1)*LDC ), LDC )
599 MYDIST = MYDIST + NPCOL
600 ILEFT = MYDIST * NBC - ICOFFC1
602 JJNXT = MIN( JJNXT+NBC, JJEND )
612 CALL CLACGV( K, WORK( IPV+(J-1)*LV ), 1 )
615 $ CALL CGEMM( 'no transpose
', 'no transpose
', MPC2, NQC2, K,
616 $ -ONE, WORK( IPW ), LW, WORK( IPV ), LV, ONE,
subroutine pbctran(icontxt, adist, trans, m, n, nb, a, lda, beta, c, ldc, iarow, iacol, icrow, iccol, work)
subroutine pclarzb(side, trans, direct, storev, m, n, k, l, v, iv, jv, descv, t, c, ic, jc, descc, work)