1 SUBROUTINE pclarzc( SIDE, M, N, L, V, IV, JV, DESCV, INCV, TAU, C,
2 $ IC, JC, DESCC, WORK )
11 INTEGER IC, INCV, IV, JC, JV, L, M, N
14 INTEGER DESCC( * ), DESCV( * )
15 COMPLEX C( * ), TAU( * ), ( * ), WORK( * )
236 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_
238 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
239 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
240 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
242 parameter( one = ( 1.0e+0, 0.0e+0 ),
243 $ zero = ( 0.0e+0, 0.0e+0 ) )
246 LOGICAL CCBLCK, CRBLCK, LEFT
247 CHARACTER COLBTOP, ROWBTOP
248 INTEGER ICCOL1, ICCOL2, ICOFFC1, ICOFFC2, ICOFFV,
249 $ icrow1, icrow2, ictxt, iic1, iic2, iiv, ioffc1,
250 $ ioffc2, ioffv, ipw, iroffc1, iroffc2, iroffv,
251 $ ivcol, ivrow, jjc1, jjc2, jjv, ldc, ldv, mpc2,
252 $ mpv, mycol, myrow, ncc, ncv, npcol, nprow,
274 IF( m.LE.0 .OR. n.LE.0 )
279 ictxt = descc( ctxt_ )
284 left = lsame( side,
'L' )
285 CALL infog2l( iv, jv, descv, nprow, npcol, myrow, mycol, iiv, jjv,
287 iroffv = mod( iv-1, descv( nb_ ) )
288 mpv =
numroc( l+iroffv, descv( mb_
291 icoffv = mod( jv-1, descv( nb_ ) )
292 nqv =
numroc( l+icoffv, descv( nb_ ), mycol, ivcol, npcol )
296 ncv =
numroc( descv( n_ ), descv( nb_ ), mycol, descv( csrc_ ),
299 iiv =
min( iiv, ldv )
300 jjv =
min( jjv, ncv )
301 ioffv = iiv+(jjv-1)*ldv
302 ncc =
numroc( descc( n_ ), descc( nb_ ), mycol, descc( csrc_ ),
304 CALL infog2l( ic, jc, descc, nprow, npcol, myrow, mycol,
305 $ iic1, jjc1, icrow1, iccol1 )
306 iroffc1 = mod( ic-1, descc( mb_ ) )
307 icoffc1 = mod( jc-1, descc( nb_ ) )
309 iic1 =
min( iic1, ldc )
310 jjc1 =
min( jjc1,
max( 1, ncc ) )
311 ioffc1 = iic1 + ( jjc1-1 ) * ldc
314 CALL infog2l( ic+m-l, jc, descc, nprow, npcol, myrow, mycol,
315 $ iic2, jjc2, icrow2, iccol2 )
316 iroffc2 = mod( ic+m-l-1, descc( mb_ ) )
317 icoffc2 = mod( jc-1, descc( nb_ ) )
318 nqc2 =
numroc( n+icoffc2, descc( nb_ ), mycol, iccol2, npcol )
319 IF( mycol.EQ.iccol2 )
320 $ nqc2 = nqc2 - icoffc2
322 CALL infog2l( ic, jc+n-l, descc, nprow, npcol, myrow, mycol,
323 $ iic2, jjc2, icrow2, iccol2 )
324 iroffc2 = mod( ic-1, descc( mb_ ) )
325 mpc2 =
numroc( m+iroffc2, descc( mb_ ), myrow, icrow2, nprow )
326 IF( myrow.EQ.icrow2 )
327 $ mpc2 = mpc2 - iroffc2
328 icoffc2 = mod( jc+n-l-1, descc( nb_ ) )
330 iic2 =
min( iic2, ldc )
331 jjc2 =
min( jjc2, ncc )
332 ioffc2 = iic2 + ( jjc2-1 ) * ldc
336 crblck = ( m.LE.(descc( mb_ )-iroffc1) )
340 ccblck = ( n.LE.(descc( nb_ )-icoffc1) )
354 IF( descv( m_ ).EQ.incv )
THEN
359 CALL pbctrnv( ictxt,
'Rowwise', 'transpose
', M,
360 $ DESCV( NB_ ), IROFFC2, V( IOFFV ), LDV,
362 $ WORK, 1, IVROW, IVCOL, ICROW2, ICCOL2,
367.EQ.
IF( MYCOLICCOL2 ) THEN
369.EQ.
IF( MYROWIVROW ) THEN
371 CALL CGEBS2D( ICTXT, 'columnwise
', ' ', 1, 1,
373 TAULOC( 1 ) = CONJG( TAU( IIV ) )
377 CALL CGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1,
378 $ TAULOC, 1, IVROW, MYCOL )
379 TAULOC( 1 ) = CONJG( TAULOC( 1 ) )
383.NE.
IF( TAULOC( 1 )ZERO ) THEN
388 CALL CGEMV( 'conjugate transpose
', MPV, NQC2,
389 $ ONE, C( IOFFC2 ), LDC, WORK, 1,
390 $ ZERO, WORK( IPW ), 1 )
392 CALL CLASET( 'all
', NQC2, 1, ZERO, ZERO,
393 $ WORK( IPW ), MAX( 1, NQC2 ) )
395.EQ.
IF( MYROWICROW1 )
396 $ CALL CAXPY( NQC2, ONE, C( IOFFC1 ), LDC,
397 $ WORK( IPW ), MAX( 1, NQC2 ) )
399 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQC2, 1,
400 $ WORK( IPW ), MAX( 1, NQC2 ), RDEST,
405.EQ.
IF( MYROWICROW1 )
406 $ CALL CAXPY( NQC2, -TAULOC( 1 ), WORK( IPW ),
407 $ MAX( 1, NQC2 ), C( IOFFC1 ), LDC )
408 CALL CGERC( MPV, NQC2, -TAULOC( 1 ), WORK, 1,
409 $ WORK( IPW ), 1, C( IOFFC2 ), LDC )
418.EQ.
IF( IVCOLICCOL2 ) THEN
422.EQ.
IF( MYCOLICCOL2 ) THEN
424 TAULOC( 1 ) = CONJG( TAU( JJV ) )
426.NE.
IF( TAULOC( 1 )ZERO ) THEN
431 CALL CGEMV( 'conjugate transpose
', MPV, NQC2,
432 $ ONE, C( IOFFC2 ), LDC, V( IOFFV ),
435 CALL CLASET( 'all
', NQC2, 1, ZERO, ZERO,
436 $ WORK, MAX( 1, NQC2 ) )
438.EQ.
IF( MYROWICROW1 )
439 $ CALL CAXPY( NQC2, ONE, C( IOFFC1 ), LDC,
440 $ WORK, MAX( 1, NQC2 ) )
442 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQC2, 1,
443 $ WORK, MAX( 1, NQC2 ), RDEST,
448.EQ.
IF( MYROWICROW1 )
449 $ CALL CAXPY( NQC2, -TAULOC( 1 ), WORK,
450 $ MAX( 1, NQC2 ), C( IOFFC1 ),
452 CALL CGERC( MPV, NQC2, -TAULOC( 1 ), V( IOFFV ),
453 $ 1, WORK, 1, C( IOFFC2 ), LDC )
462.EQ.
IF( MYCOLIVCOL ) THEN
465 CALL CCOPY( MPV, V( IOFFV ), 1, WORK, 1 )
466 WORK( IPW ) = TAU( JJV )
467 CALL CGESD2D( ICTXT, IPW, 1, WORK, IPW, MYROW,
470.EQ.
ELSE IF( MYCOLICCOL2 ) THEN
473 CALL CGERV2D( ICTXT, IPW, 1, WORK, IPW, MYROW,
475 TAULOC( 1 ) = CONJG( WORK( IPW ) )
477.NE.
IF( TAULOC( 1 )ZERO ) THEN
482 CALL CGEMV( 'conjugate transpose
', MPV, NQC2,
483 $ ONE, C( IOFFC2 ), LDC, WORK, 1,
484 $ ZERO, WORK( IPW ), 1 )
486 CALL CLASET( 'all
', NQC2, 1, ZERO, ZERO,
487 $ WORK( IPW ), MAX( 1, NQC2 ) )
489.EQ.
IF( MYROWICROW1 )
490 $ CALL CAXPY( NQC2, ONE, C( IOFFC1 ), LDC,
491 $ WORK( IPW ), MAX( 1, NQC2 ) )
493 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQC2, 1,
494 $ WORK( IPW ), MAX( 1, NQC2 ),
499.EQ.
IF( MYROWICROW1 )
500 $ CALL CAXPY( NQC2, -TAULOC( 1 ), WORK( IPW ),
501 $ MAX( 1, NQC2 ), C( IOFFC1 ),
503 CALL CGERC( MPV, NQC2, -TAULOC( 1 ), WORK, 1,
504 $ WORK( IPW ), 1, C( IOFFC2 ), LDC )
517.EQ.
IF( DESCV( M_ )INCV ) THEN
522 CALL PBCTRNV( ICTXT, 'rowwise
', 'transpose
', M,
523 $ DESCV( NB_ ), IROFFC2, V( IOFFV ), LDV,
525 $ WORK, 1, IVROW, IVCOL, ICROW2, -1,
530.EQ.
IF( MYROWIVROW ) THEN
532 CALL CGEBS2D( ICTXT, 'columnwise
', ' ', 1, 1,
534 TAULOC( 1 ) = CONJG( TAU( IIV ) )
538 CALL CGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, TAULOC,
540 TAULOC( 1 ) = CONJG( TAULOC( 1 ) )
544.NE.
IF( TAULOC( 1 )ZERO ) THEN
549 CALL CGEMV( 'conjugate transpose
', MPV, NQC2, ONE,
550 $ C( IOFFC2 ), LDC, WORK, 1, ZERO,
553 CALL CLASET( 'all
', NQC2, 1, ZERO, ZERO,
554 $ WORK( IPW ), MAX( 1, NQC2 ) )
556.EQ.
IF( MYROWICROW1 )
557 $ CALL CAXPY( NQC2, ONE, C( IOFFC1 ), LDC,
558 $ WORK( IPW ), MAX( 1, NQC2 ) )
560 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQC2, 1,
561 $ WORK( IPW ), MAX( 1, NQC2 ), RDEST,
566.EQ.
IF( MYROWICROW1 )
567 $ CALL CAXPY( NQC2, -TAULOC( 1 ), WORK( IPW ),
568 $ MAX( 1, NQC2 ), C( IOFFC1 ), LDC )
569 CALL CGERC( MPV, NQC2, -TAULOC( 1 ), WORK, 1,
570 $ WORK( IPW ), 1, C( IOFFC2 ), LDC )
577 CALL PB_TOPGET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
578.EQ.
IF( MYCOLIVCOL ) THEN
581 CALL CCOPY( MPV, V( IOFFV ), 1, WORK, 1 )
582 WORK( IPW ) = TAU( JJV )
583 CALL CGEBS2D( ICTXT, 'rowwise
', ROWBTOP, IPW, 1,
585 TAULOC( 1 ) = CONJG( TAU( JJV ) )
590 CALL CGEBR2D( ICTXT, 'rowwise
', ROWBTOP, IPW, 1, WORK,
591 $ IPW, MYROW, IVCOL )
592 TAULOC( 1 ) = CONJG( WORK( IPW ) )
596.NE.
IF( TAULOC( 1 )ZERO ) THEN
601 CALL CGEMV( 'conjugate transpose
', MPV, NQC2, ONE,
602 $ C( IOFFC2 ), LDC, WORK, 1, ZERO,
605 CALL CLASET( 'all
', NQC2, 1, ZERO, ZERO,
606 $ WORK( IPW ), MAX( 1, NQC2 ) )
608.EQ.
IF( MYROWICROW1 )
609 $ CALL CAXPY( NQC2, ONE, C( IOFFC1 ), LDC,
610 $ WORK( IPW ), MAX( 1, NQC2 ) )
612 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQC2, 1,
613 $ WORK( IPW ), MAX( 1, NQC2 ), RDEST,
618.EQ.
IF( MYROWICROW1 )
619 $ CALL CAXPY( NQC2, -TAULOC( 1 ), WORK( IPW ),
620 $ MAX( 1, NQC2 ), C( IOFFC1 ), LDC )
621 CALL CGERC( MPV, NQC2, -TAULOC( 1 ), WORK, 1,
622 $ WORK( IPW ), 1, C( IOFFC2 ), LDC )
641.EQ.
IF( DESCV( M_ )INCV ) THEN
645.EQ.
IF( IVROWICROW2 ) THEN
649.EQ.
IF( MYROWICROW2 ) THEN
651 TAULOC( 1 ) = CONJG( TAU( IIV ) )
653.NE.
IF( TAULOC( 1 )ZERO ) THEN
658 CALL CGEMV( 'no transpose
', MPC2, NQV, ONE,
659 $ C( IOFFC2 ), LDC, V( IOFFV ),
660 $ LDV, ZERO, WORK, 1 )
662 CALL CLASET( 'all
', MPC2, 1, ZERO, ZERO,
663 $ WORK, MAX( 1, MPC2 ) )
665.EQ.
IF( MYCOLICCOL1 )
666 $ CALL CAXPY( MPC2, ONE, C( IOFFC1 ), 1,
669 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MPC2, 1,
670 $ WORK, MAX( 1, MPC2 ), RDEST,
673.EQ.
IF( MYCOLICCOL1 )
674 $ CALL CAXPY( MPC2, -TAULOC( 1 ), WORK, 1,
679 CALL CGERC( MPC2, NQV, -TAULOC( 1 ), WORK, 1,
680 $ V( IOFFV ), LDV, C( IOFFC2 ), LDC )
689.EQ.
IF( MYROWIVROW ) THEN
692 CALL CCOPY( NQV, V( IOFFV ), LDV, WORK, 1 )
693 WORK( IPW ) = TAU( IIV )
694 CALL CGESD2D( ICTXT, IPW, 1, WORK, IPW, ICROW2,
697.EQ.
ELSE IF( MYROWICROW2 ) THEN
700 CALL CGERV2D( ICTXT, IPW, 1, WORK, IPW, IVROW,
702 TAULOC( 1 ) = CONJG( WORK( IPW ) )
704.NE.
IF( TAULOC( 1 )ZERO ) THEN
709 CALL CGEMV( 'no transpose
', MPC2, NQV, ONE,
710 $ C( IOFFC2 ), LDC, WORK, 1, ZERO,
713 CALL CLASET( 'all
', MPC2, 1, ZERO, ZERO,
714 $ WORK( IPW ), MAX( 1, MPC2 ) )
716.EQ.
IF( MYCOLICCOL1 )
717 $ CALL CAXPY( MPC2, ONE, C( IOFFC1 ), 1,
719 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MPC2, 1,
720 $ WORK( IPW ), MAX( 1, MPC2 ),
722.EQ.
IF( MYCOLICCOL1 )
723 $ CALL CAXPY( MPC2, -TAULOC( 1 ), WORK( IPW ),
724 $ 1, C( IOFFC1 ), 1 )
728 CALL CGERC( MPC2, NQV, -TAULOC( 1 ),
729 $ WORK( IPW ), 1, WORK, 1,
742 CALL PBCTRNV( ICTXT, 'columnwise
', 'transpose
', N,
743 $ DESCV( MB_ ), ICOFFC2, V( IOFFV ), 1, ZERO,
744 $ WORK, 1, IVROW, IVCOL, ICROW2, ICCOL2,
749.EQ.
IF( MYROWICROW2 ) THEN
751.EQ.
IF( MYCOLIVCOL ) THEN
753 CALL CGEBS2D( ICTXT, 'rowwise
', ' ', 1, 1,
755 TAULOC( 1 ) = CONJG( TAU( JJV ) )
759 CALL CGEBR2D( ICTXT, 'rowwise
', ' ', 1, 1, TAULOC,
761 TAULOC( 1 ) = CONJG( TAULOC( 1 ) )
765.NE.
IF( TAULOC( 1 )ZERO ) THEN
770 CALL CGEMV( 'no transpose
', MPC2, NQV, ONE,
771 $ C( IOFFC2 ), LDC, WORK, 1, ZERO,
774 CALL CLASET( 'all
', MPC2, 1, ZERO, ZERO,
775 $ WORK( IPW ), MAX( 1, MPC2 ) )
777.EQ.
IF( MYCOLICCOL1 )
778 $ CALL CAXPY( MPC2, ONE, C( IOFFC1 ), 1,
780 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MPC2, 1,
781 $ WORK( IPW ), MAX( 1, MPC2 ), RDEST,
783.EQ.
IF( MYCOLICCOL1 )
784 $ CALL CAXPY( MPC2, -TAULOC( 1 ), WORK( IPW ), 1,
789 CALL CGERC( MPC2, NQV, -TAULOC( 1 ), WORK( IPW ),
790 $ 1, WORK, 1, C( IOFFC2 ), LDC )
801.EQ.
IF( DESCV( M_ )INCV ) THEN
805 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
',
807.EQ.
IF( MYROWIVROW ) THEN
810 CALL CCOPY( NQV, V( IOFFV ), LDV, WORK, 1 )
811 WORK( IPW ) = TAU( IIV )
812 CALL CGEBS2D( ICTXT, 'columnwise
', COLBTOP, IPW, 1,
814 TAULOC( 1 ) = CONJG( TAU( IIV ) )
819 CALL CGEBR2D( ICTXT, 'columnwise
', COLBTOP, IPW, 1,
820 $ WORK, IPW, IVROW, MYCOL )
821 TAULOC( 1 ) = CONJG( WORK( IPW ) )
825.NE.
IF( TAULOC( 1 )ZERO ) THEN
830 CALL CGEMV( 'no transpose
', MPC2, NQV, ONE,
831 $ C( IOFFC2 ), LDC, WORK, 1, ZERO,
834 CALL CLASET( 'all
', MPC2, 1, ZERO, ZERO,
835 $ WORK( IPW ), MAX( 1, MPC2 ) )
837.EQ.
IF( MYCOLICCOL1 )
838 $ CALL CAXPY( MPC2, ONE, C( IOFFC1 ), 1,
841 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MPC2, 1,
842 $ WORK( IPW ), MAX( 1, MPC2 ), RDEST,
844.EQ.
IF( MYCOLICCOL1 )
845 $ CALL CAXPY( MPC2, -TAULOC( 1 ), WORK( IPW ), 1,
850 CALL CGERC( MPC2, NQV, -TAULOC( 1 ), WORK( IPW ), 1,
851 $ WORK, 1, C( IOFFC2 ), LDC )
859 CALL PBCTRNV( ICTXT, 'columnwise
', 'transpose
', N,
860 $ DESCV( MB_ ), ICOFFC2, V( IOFFV ), 1, ZERO,
861 $ WORK, 1, IVROW, IVCOL, -1, ICCOL2,
866.EQ.
IF( MYCOLIVCOL ) THEN
868 CALL CGEBS2D( ICTXT, 'rowwise
', ' ', 1, 1, TAU( JJV ),
870 TAULOC( 1 ) = CONJG( TAU( JJV ) )
874 CALL CGEBR2D( ICTXT, 'rowwise
', ' ', 1, 1,
875 $ TAULOC( 1 ), 1, MYROW, IVCOL )
876 TAULOC( 1 ) = CONJG( TAULOC( 1 ) )
880.NE.
IF( TAULOC( 1 )ZERO ) THEN
885 CALL CGEMV( 'no transpose
', MPC2, NQV, ONE,
886 $ C( IOFFC2 ), LDC, WORK, 1, ZERO,
889 CALL CLASET( 'all
', MPC2, 1, ZERO, ZERO,
890 $ WORK( IPW ), MAX( 1, MPC2 ) )
892.EQ.
IF( MYCOLICCOL1 )
893 $ CALL CAXPY( MPC2, ONE, C( IOFFC1 ), 1,
895 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MPC2, 1,
896 $ WORK( IPW ), MAX( 1, MPC2 ), RDEST,
898.EQ.
IF( MYCOLICCOL1 )
899 $ CALL CAXPY( MPC2, -TAULOC( 1 ), WORK( IPW ), 1,
904 CALL CGERC( MPC2, NQV, -TAULOC( 1 ), WORK( IPW ), 1,
905 $ WORK, 1, C( IOFFC2 ), LDC )