1 SUBROUTINE pclarfc( SIDE, M, N, V, IV, JV, DESCV, INCV, TAU,
2 $ C, IC, JC, DESCC, WORK )
11 INTEGER , INCV, IV, JC, JV, M, N
14 INTEGER DESCC( * ), DESCV( * )
15 COMPLEX C( * ), TAU( * ), V( * ), WORK( * )
229 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
230 $ lld_, mb_, m_, nb_, n_, rsrc_
231 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
232 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
233 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
235 parameter( one = ( 1.0e+0, 0.0e+0 ),
236 $ zero = ( 0.0e+0, 0.0e+0 ) )
239 LOGICAL CCBLCK, CRBLCK
240 CHARACTER COLBTOP, ROWBTOP
241 INTEGER ICCOL, , ICROW, ICTXT, IIC, IIV, IOFFC,
243 $ ldv, mycol, myrow, mp, ncc, ncv, npcol, nprow,
256 EXTERNAL lsame, numroc
265 IF( m.LE.0 .OR. n.LE.0 )
270 ictxt = descc( ctxt_ )
275 CALL infog2l( ic, jc, descc, nprow, npcol, myrow, mycol, iic, jjc,
277 CALL infog2l( iv, jv, descv, nprow, npcol, myrow, mycol, iiv, jjv,
279 ncc = numroc( descc( n_ ), descc( nb_ ), mycol, descc( csrc_ ),
281 ncv = numroc( descv( n_ ), descv( nb_ ), mycol, descv( csrc_ ),
285 iic =
min( iic, ldc )
286 iiv =
min( iiv, ldv )
287 jjc =
min( jjc, ncc )
288 jjv =
min( jjv, ncv )
289 ioffc = iic+(jjc-1)*ldc
290 ioffv = iiv+(jjv-1)*ldv
292 iroff = mod( ic-1, descc( mb_ ) )
293 icoff = mod( jc-1, descc( nb_ ) )
294 mp = numroc( m+iroff, descc( mb_ ), myrow, icrow, nprow )
295 nq = numroc( n+icoff, descc( nb_ ), mycol, iccol, npcol )
303 crblck = ( m.LE.(descc( mb_ )-iroff) )
307 ccblck = ( n.LE.(descc( nb_ )-icoff) )
309 IF( lsame( side,
'L' ) )
THEN
321 IF( descv( m_ ).EQ.incv )
THEN
326 CALL pbctrnv( ictxt,
'Rowwise',
'Transpose', m,
327 $ descv( nb_ ), iroff, v( ioffv ), ldv, zero,
328 $ work, 1, ivrow, ivcol, icrow, iccol,
333 IF( mycol.EQ.iccol )
THEN
335 IF( myrow.EQ.ivrow )
THEN
337 CALL cgebs2d( ictxt, 'columnwise
', ' ', 1, 1,
339 TAULOC( 1 ) = CONJG( TAU( IIV ) )
343 CALL CGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1,
344 $ TAULOC, 1, IVROW, MYCOL )
345 TAULOC( 1 ) = CONJG( TAULOC( 1 ) )
349.NE.
IF( TAULOC( 1 )ZERO ) THEN
354 CALL CGEMV( 'conjugate transpose
', MP, NQ, ONE,
355 $ C( IOFFC ), LDC, WORK, 1, ZERO,
358 CALL CLASET( 'all
', NQ, 1, ZERO, ZERO,
359 $ WORK( IPW ), MAX( 1, NQ ) )
361 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQ, 1,
362 $ WORK( IPW ), MAX( 1, NQ ), RDEST,
367 CALL CGERC( MP, NQ, -TAULOC( 1 ), WORK, 1,
368 $ WORK( IPW ), 1, C( IOFFC ), LDC )
377.EQ.
IF( IVCOLICCOL ) THEN
381.EQ.
IF( MYCOLICCOL ) THEN
383 TAULOC( 1 ) = CONJG( TAU( JJV ) )
385.NE.
IF( TAULOC( 1 )ZERO ) THEN
390 CALL CGEMV( 'conjugate transpose
', MP, NQ,
391 $ ONE, C( IOFFC ), LDC, V( IOFFV ), 1,
394 CALL CLASET( 'all
', NQ, 1, ZERO, ZERO,
395 $ WORK, MAX( 1, NQ ) )
397 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQ, 1,
398 $ WORK, MAX( 1, NQ ), RDEST, MYCOL )
402 CALL CGERC( MP, NQ, -TAULOC( 1 ), V( IOFFV ), 1,
403 $ WORK, 1, C( IOFFC ), LDC )
412.EQ.
IF( MYCOLIVCOL ) THEN
415 CALL CCOPY( MP, V( IOFFV ), 1, WORK, 1 )
416 WORK( IPW ) = TAU( JJV )
417 CALL CGESD2D( ICTXT, IPW, 1, WORK, IPW, MYROW,
420.EQ.
ELSE IF( MYCOLICCOL ) THEN
423 CALL CGERV2D( ICTXT, IPW, 1, WORK, IPW, MYROW,
425 TAULOC( 1 ) = CONJG( WORK( IPW ) )
427.NE.
IF( TAULOC( 1 )ZERO ) THEN
432 CALL CGEMV( 'conjugate transpose
', MP, NQ,
433 $ ONE, C( IOFFC ), LDC, WORK, 1,
434 $ ZERO, WORK( IPW ), 1 )
436 CALL CLASET( 'all
', NQ, 1, ZERO, ZERO,
437 $ WORK( IPW ), MAX( 1, NQ ) )
439 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQ, 1,
440 $ WORK( IPW ), MAX( 1, NQ ), RDEST,
445 CALL CGERC( MP, NQ, -TAULOC( 1 ), WORK, 1,
446 $ WORK( IPW ), 1, C( IOFFC ), LDC )
459.EQ.
IF( DESCV( M_ )INCV ) THEN
464 CALL PBCTRNV( ICTXT, 'rowwise
', 'transpose
', M,
465 $ DESCV( NB_ ), IROFF, V( IOFFV ), LDV, ZERO,
466 $ WORK, 1, IVROW, IVCOL, ICROW, -1,
471.EQ.
IF( MYROWIVROW ) THEN
473 CALL CGEBS2D( ICTXT, 'columnwise
', ' ', 1, 1,
475 TAULOC( 1 ) = CONJG( TAU( IIV ) )
479 CALL CGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, TAULOC,
481 TAULOC( 1 ) = CONJG( TAULOC( 1 ) )
485.NE.
IF( TAULOC( 1 )ZERO ) THEN
490 CALL CGEMV( 'conjugate transpose
', MP, NQ, ONE,
491 $ C( IOFFC ), LDC, WORK, 1, ZERO,
494 CALL CLASET( 'all
', NQ, 1, ZERO, ZERO,
495 $ WORK( IPW ), MAX( 1, NQ ) )
497 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQ, 1,
498 $ WORK( IPW ), MAX( 1, NQ ), RDEST,
503 CALL CGERC( MP, NQ, -TAULOC( 1 ), WORK, 1,
504 $ WORK( IPW ), 1, C( IOFFC ), LDC )
511 CALL PB_TOPGET( ICTXT, 'broadcast
', 'rowwise
', ROWBTOP )
512.EQ.
IF( MYCOLIVCOL ) THEN
515 CALL CCOPY( MP, V( IOFFV ), 1, WORK, 1 )
516 WORK(IPW) = TAU( JJV )
517 CALL CGEBS2D( ICTXT, 'rowwise
', ROWBTOP, IPW, 1,
519 TAULOC( 1 ) = CONJG( TAU( JJV ) )
524 CALL CGEBR2D( ICTXT, 'rowwise
', ROWBTOP, IPW, 1, WORK,
525 $ IPW, MYROW, IVCOL )
526 TAULOC( 1 ) = CONJG( WORK( IPW ) )
530.NE.
IF( TAULOC( 1 )ZERO ) THEN
535 CALL CGEMV( 'conjugate transpose
', MP, NQ, ONE,
536 $ C( IOFFC ), LDC, WORK, 1, ZERO,
539 CALL CLASET( 'all
', NQ, 1, ZERO, ZERO,
540 $ WORK( IPW ), MAX( 1, NQ ) )
542 CALL CGSUM2D( ICTXT, 'columnwise
', ' ', NQ, 1,
543 $ WORK( IPW ), MAX( 1, NQ ), RDEST,
548 CALL CGERC( MP, NQ, -TAULOC( 1 ), WORK, 1,
549 $ WORK( IPW ), 1, C( IOFFC ), LDC )
568.EQ.
IF( DESCV( M_ )INCV ) THEN
572.EQ.
IF( IVROWICROW ) THEN
576.EQ.
IF( MYROWICROW ) THEN
578 TAULOC( 1 ) = CONJG( TAU( IIV ) )
580.NE.
IF( TAULOC( 1 )ZERO ) THEN
585 CALL CGEMV( 'no transpose
', MP, NQ, ONE,
586 $ C( IOFFC ), LDC, V( IOFFV ), LDV,
589 CALL CLASET( 'all
', MP, 1, ZERO, ZERO,
590 $ WORK, MAX( 1, MP ) )
592 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1,
593 $ WORK, MAX( 1, MP ), RDEST, ICCOL )
597 CALL CGERC( MP, NQ, -TAULOC( 1 ), WORK, 1,
598 $ V( IOFFV ), LDV, C( IOFFC ), LDC )
607.EQ.
IF( MYROWIVROW ) THEN
610 CALL CCOPY( NQ, V( IOFFV ), LDV, WORK, 1 )
611 WORK(IPW) = TAU( IIV )
612 CALL CGESD2D( ICTXT, IPW, 1, WORK, IPW, ICROW,
615.EQ.
ELSE IF( MYROWICROW ) THEN
618 CALL CGERV2D( ICTXT, IPW, 1, WORK, IPW, IVROW,
620 TAULOC( 1 ) = CONJG( WORK( IPW ) )
622.NE.
IF( TAULOC( 1 )ZERO ) THEN
627 CALL CGEMV( 'no transpose
', MP, NQ, ONE,
628 $ C( IOFFC ), LDC, WORK, 1, ZERO,
631 CALL CLASET( 'all
', MP, 1, ZERO, ZERO,
632 $ WORK( IPW ), MAX( 1, MP ) )
634 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1,
635 $ WORK( IPW ), MAX( 1, MP ), RDEST,
640 CALL CGERC( MP, NQ, -TAULOC( 1 ), WORK( IPW ),
641 $ 1, WORK, 1, C( IOFFC ), LDC )
653 CALL PBCTRNV( ICTXT, 'columnwise
', 'transpose
', N,
654 $ DESCV( MB_ ), ICOFF, V( IOFFV ), 1, ZERO,
655 $ WORK, 1, IVROW, IVCOL, ICROW, ICCOL,
660.EQ.
IF( MYROWICROW ) THEN
662.EQ.
IF( MYCOLIVCOL ) THEN
664 CALL CGEBS2D( ICTXT, 'rowwise
', ' ', 1, 1,
666 TAULOC( 1 ) = CONJG( TAU( JJV ) )
670 CALL CGEBR2D( ICTXT, 'rowwise
', ' ', 1, 1, TAULOC,
672 TAULOC( 1 ) = CONJG( TAULOC( 1 ) )
676.NE.
IF( TAULOC( 1 )ZERO ) THEN
681 CALL CGEMV( 'no transpose
', MP, NQ, ONE,
682 $ C( IOFFC ), LDC, WORK, 1, ZERO,
685 CALL CLASET( 'all
', MP, 1, ZERO, ZERO,
686 $ WORK( IPW ), MAX( 1, MP ) )
688 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1,
689 $ WORK( IPW ), MAX( 1, MP ), RDEST,
694 CALL CGERC( MP, NQ, -TAULOC( 1 ), WORK( IPW ), 1,
695 $ WORK, 1, C( IOFFC ), LDC )
706.EQ.
IF( DESCV( M_ )INCV ) THEN
710 CALL PB_TOPGET( ICTXT, 'broadcast',
'Columnwise',
712 IF( myrow.EQ.ivrow )
THEN
715 CALL ccopy( nq, v( ioffv ), ldv, work, 1 )
716 work(ipw) = tau( iiv )
717 CALL cgebs2d( ictxt,
'Columnwise', colbtop, ipw, 1,
719 tauloc( 1 ) = conjg( tau( iiv ) )
724 CALL cgebr2d( ictxt,
'Columnwise', colbtop, ipw, 1,
725 $ work, ipw, ivrow, mycol )
726 tauloc( 1 ) = conjg( work( ipw ) )
730 IF( tauloc( 1 ).NE.zero )
THEN
735 CALL cgemv(
'No Transpose', mp, nq, one,
736 $ c( ioffc ), ldc, work, 1, zero,
739 CALL claset(
'All', mp, 1, zero, zero,
740 $ work( ipw ),
max( 1, mp ) )
742 CALL cgsum2d( ictxt,
'Rowwise',
' ', mp, 1,
743 $ work( ipw ),
max( 1, mp ), rdest,
748 CALL cgerc( mp, nq, -tauloc( 1 ), work( ipw ), 1,
749 $ work, 1, c( ioffc ), ldc )
757 CALL pbctrnv( ictxt, 'columnwise
', 'transpose
', N,
758 $ DESCV( MB_ ), ICOFF, V( IOFFV ), 1, ZERO,
759 $ WORK, 1, IVROW, IVCOL, -1, ICCOL,
764.EQ.
IF( MYCOLIVCOL ) THEN
766 CALL CGEBS2D( ICTXT, 'rowwise
', ' ', 1, 1, TAU( JJV ),
768 TAULOC( 1 ) = CONJG( TAU( JJV ) )
772 CALL CGEBR2D( ICTXT, 'rowwise
', ' ', 1, 1, TAULOC, 1,
774 TAULOC( 1 ) = CONJG( TAULOC( 1 ) )
778.NE.
IF( TAULOC( 1 )ZERO ) THEN
783 CALL CGEMV( 'no transpose
', MP, NQ, ONE,
784 $ C( IOFFC ), LDC, WORK, 1, ZERO,
787 CALL CLASET( 'all
', MP, 1, ZERO, ZERO, WORK( IPW ),
790 CALL CGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1,
791 $ WORK( IPW ), MAX( 1, MP ), RDEST,
796 CALL CGERC( MP, NQ, -TAULOC( 1 ), WORK( IPW ), 1,
797 $ WORK, 1, C( IOFFC ), LDC )