1 SUBROUTINE pzlarf( SIDE, M, N, V, IV, JV, DESCV, INCV, TAU,
2 $ C, IC, JC, DESCC, WORK )
11 INTEGER IC, INCV, , JC, JV, M, N
14 INTEGER DESCC( * ), DESCV( * )
15 COMPLEX*16 C( * ), TAU( * ), V( * ), WORK( * )
229 INTEGER BLOCK_CYCLIC_2D, CSRC_, , 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.0d+0, 0.0d+0 ),
236 $ zero = ( 0.0d+0, 0.0d+0 ) )
239 LOGICAL CCBLCK, CRBLCK
240 CHARACTER COLBTOP, ROWBTOP
241 INTEGER ICCOL, ICOFF, ICROW, ICTXT, IIC, IIV, IOFFC,
242 $ ioffv, ipw, iroff, ivcol, ivrow, jjc, jjv, ldc,
243 $ ldv, mycol, myrow, mp, ncc, ncv, npcol, nprow,
245 COMPLEX*16 TAULOC( 1 )
250 $
zgerc, zgerv2d, zgesd2d, zgsum2d,
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 pbztrnv( ictxt,
'Rowwise',
'Transpose'
327 $ descv( nb_ ), iroff, v( ioffv
328 $ work, 1, ivrow, ivcol, icrow, iccol,
333 IF( mycol.EQ.iccol )
THEN
335 IF( myrow.EQ.ivrow )
THEN
337 CALL zgebs2d( ictxt,
'Columnwise',
' ', 1, 1,
339 tauloc( 1 ) = tau( iiv )
343 CALL zgebr2d( ictxt,
'Columnwise',
' ', 1, 1,
344 $ tauloc, 1, ivrow, mycol )
348 IF( tauloc( 1 ).NE.zero )
THEN
353 CALL zgemv(
'Conjugate transpose', mp, nq, one,
354 $ c( ioffc ), ldc, work, 1, zero,
357 CALL zlaset(
'All', nq, 1, zero, zero,
358 $ work( ipw ),
max( 1, nq ) )
360 CALL zgsum2d( ictxt,
'Columnwise', '
', NQ, 1,
361 $ WORK( IPW ), MAX( 1, NQ ), RDEST,
366 CALL ZGERC( MP, NQ, -TAULOC( 1 ), WORK, 1,
367 $ WORK( IPW ), 1, C( IOFFC ), LDC )
376.EQ.
IF( IVCOLICCOL ) THEN
380.EQ.
IF( MYCOLICCOL ) THEN
382 TAULOC( 1 ) = TAU( JJV )
384.NE.
IF( TAULOC( 1 )ZERO ) THEN
389 CALL ZGEMV( 'conjugate transpose
', MP, NQ,
390 $ ONE, C( IOFFC ), LDC, V( IOFFV ), 1,
393 CALL ZLASET( 'all
', NQ, 1, ZERO, ZERO,
394 $ WORK, MAX( 1, NQ ) )
396 CALL ZGSUM2D( ICTXT, 'columnwise
', ' ', NQ, 1,
397 $ WORK, MAX( 1, NQ ), RDEST, MYCOL )
401 CALL ZGERC( MP, NQ, -TAULOC( 1 ), V( IOFFV ), 1,
402 $ WORK, 1, C( IOFFC ), LDC )
411.EQ.
IF( MYCOLIVCOL ) THEN
414 CALL ZCOPY( MP, V( IOFFV ), 1, WORK, 1 )
415 WORK( IPW ) = TAU( JJV )
416 CALL ZGESD2D( ICTXT, IPW, 1, WORK, IPW, MYROW,
419.EQ.
ELSE IF( MYCOLICCOL ) THEN
422 CALL ZGERV2D( ICTXT, IPW, 1, WORK, IPW, MYROW,
424 TAULOC( 1 ) = WORK( IPW )
426.NE.
IF( TAULOC( 1 )ZERO ) THEN
431 CALL ZGEMV( 'conjugate transpose
', MP, NQ,
432 $ ONE, C( IOFFC ), LDC, WORK, 1,
433 $ ZERO, WORK( IPW ), 1 )
435 CALL ZLASET( 'all
', NQ, 1, ZERO, ZERO,
436 $ WORK( IPW ), MAX( 1, NQ ) )
438 CALL ZGSUM2D( ICTXT, 'columnwise
', ' ', NQ, 1,
439 $ WORK( IPW ), MAX( 1, NQ ), RDEST,
444 CALL ZGERC( MP, NQ, -TAULOC( 1 ), WORK, 1,
445 $ WORK( IPW ), 1, C( IOFFC ), LDC )
458.EQ.
IF( DESCV( M_ )INCV ) THEN
463 CALL PBZTRNV( ICTXT, 'rowwise
', 'transpose
', M,
464 $ DESCV( NB_ ), IROFF, V( IOFFV ), LDV, ZERO,
465 $ WORK, 1, IVROW, IVCOL, ICROW, -1,
470.EQ.
IF( MYROWIVROW ) THEN
472 CALL ZGEBS2D( ICTXT, 'columnwise
', ' ', 1, 1,
474 TAULOC( 1 ) = TAU( IIV )
478 CALL ZGEBR2D( ICTXT, 'columnwise
', ' ', 1, 1, TAULOC,
483.NE.
IF( TAULOC( 1 )ZERO ) THEN
489 $ CALL ZGEMV( 'conjugate transpose
', MP, NQ, ONE,
490 $ C( IOFFC ), LDC, WORK, 1, ZERO,
493 CALL ZLASET( 'all
', NQ, 1, ZERO, ZERO,
494 $ WORK( IPW ), MAX( 1, NQ ) )
496 CALL ZGSUM2D( ICTXT, 'columnwise
', ' ', NQ, 1,
497 $ WORK( IPW ), MAX( 1, NQ ), RDEST,
503 $ CALL ZGERC( 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 ZCOPY( MP, V( IOFFV ), 1, WORK, 1 )
516 WORK(IPW) = TAU( JJV )
517 CALL ZGEBS2D( ICTXT, 'rowwise
', ROWBTOP, IPW, 1,
519 TAULOC( 1 ) = TAU( JJV )
524 CALL ZGEBR2D( ICTXT, 'rowwise
', ROWBTOP, IPW, 1, WORK,
525 $ IPW, MYROW, IVCOL )
526 TAULOC( 1 ) = WORK( IPW )
530.NE.
IF( TAULOC( 1 )ZERO ) THEN
536 $ CALL ZGEMV( 'conjugate transpose
', MP, NQ, ONE,
537 $ C( IOFFC ), LDC, WORK, 1, ZERO,
540 CALL ZLASET( 'all
', NQ, 1, ZERO, ZERO,
541 $ WORK( IPW ), MAX( 1, NQ ) )
543 CALL ZGSUM2D( ICTXT, 'columnwise
', ' ', NQ, 1,
544 $ WORK( IPW ), MAX( 1, NQ ), RDEST,
550 $ CALL ZGERC( MP, NQ, -TAULOC( 1 ), WORK, 1,
551 $ WORK( IPW ), 1, C( IOFFC ), LDC )
570.EQ.
IF( DESCV( M_ )INCV ) THEN
574.EQ.
IF( IVROWICROW ) THEN
578.EQ.
IF( MYROWICROW ) THEN
580 TAULOC( 1 ) = TAU( IIV )
582.NE.
IF( TAULOC( 1 )ZERO ) THEN
587 CALL ZGEMV( 'no transpose
', MP, NQ, ONE,
588 $ C( IOFFC ), LDC, V( IOFFV ), LDV,
591 CALL ZLASET( 'all
', MP, 1, ZERO, ZERO,
592 $ WORK, MAX( 1, MP ) )
594 CALL ZGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1,
595 $ WORK, MAX( 1, MP ), RDEST, ICCOL )
599.GT..AND..GT.
IF( IOFFV0 IOFFC0 )
600 $ CALL ZGERC( MP, NQ, -TAULOC( 1 ), WORK, 1,
601 $ V( IOFFV ), LDV, C( IOFFC ),
611.EQ.
IF( MYROWIVROW ) THEN
614 CALL ZCOPY( NQ, V( IOFFV ), LDV, WORK, 1 )
615 WORK(IPW) = TAU( IIV )
616 CALL ZGESD2D( ICTXT, IPW, 1, WORK, IPW, ICROW,
619.EQ.
ELSE IF( MYROWICROW ) THEN
622 CALL ZGERV2D( ICTXT, IPW, 1, WORK, IPW, IVROW,
624 TAULOC( 1 ) = WORK( IPW )
626.NE.
IF( TAULOC( 1 )ZERO ) THEN
631 CALL ZGEMV( 'no transpose
', MP, NQ, ONE,
632 $ C( IOFFC ), LDC, WORK, 1, ZERO,
635 CALL ZLASET( 'all
', MP, 1, ZERO, ZERO,
636 $ WORK( IPW ), MAX( 1, MP ) )
638 CALL ZGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1,
639 $ WORK( IPW ), MAX( 1, MP ), RDEST,
644 CALL ZGERC( MP, NQ, -TAULOC( 1 ), WORK( IPW ),
645 $ 1, WORK, 1, C( IOFFC ), LDC )
657 CALL PBZTRNV( ICTXT, 'columnwise
', 'transpose
', N,
658 $ DESCV( MB_ ), ICOFF, V( IOFFV ), 1, ZERO,
659 $ WORK, 1, IVROW, IVCOL, ICROW, ICCOL,
664.EQ.
IF( MYROWICROW ) THEN
666.EQ.
IF( MYCOLIVCOL ) THEN
668 CALL ZGEBS2D( ICTXT, 'rowwise
', ' ', 1, 1,
670 TAULOC( 1 ) = TAU( JJV )
674 CALL ZGEBR2D( ICTXT, 'rowwise
', ' ', 1, 1, TAULOC,
679.NE.
IF( TAULOC( 1 )ZERO ) THEN
684 CALL ZGEMV( 'no transpose
', MP, NQ, ONE,
685 $ C( IOFFC ), LDC, WORK, 1, ZERO,
688 CALL ZLASET( 'all
', MP, 1, ZERO, ZERO,
689 $ WORK( IPW ), MAX( 1, MP ) )
691 CALL ZGSUM2D( ICTXT, 'rowwise',
' ', mp, 1,
692 $ work( ipw ),
max( 1, mp ), rdest,
697 CALL zgerc( mp, nq, -tauloc( 1 ), work( ipw ), 1,
698 $ work, 1, c( ioffc ), ldc )
709 IF( descv( m_ ).EQ.incv )
THEN
713 CALL pb_topget( ictxt,
'Broadcast',
'Columnwise',
715 IF( myrow.EQ.ivrow )
THEN
719 $
CALL zcopy( nq, v( ioffv ), ldv, work, 1 )
720 work(ipw) = tau( iiv )
721 CALL zgebs2d( ictxt,
'Columnwise', colbtop, ipw, 1,
728 CALL zgebr2d( ictxt,
'Columnwise', colbtop, ipw, 1,
729 $ work, ipw, ivrow, mycol )
730 tauloc( 1 ) = work( ipw )
734 IF( tauloc( 1 ).NE.zero )
THEN
739 CALL zgemv(
'No Transpose', mp, nq, one,
740 $ c( ioffc ), ldc, work, 1, zero,
743 CALL zlaset(
'All', mp, 1, zero, zero,
744 $ work( ipw ),
max( 1, mp ) )
746 CALL zgsum2d( ictxt,
'Rowwise',
' ', mp, 1,
747 $ work( ipw ),
max( 1, mp ), rdest,
753 $
CALL zgerc( mp, nq, -tauloc( 1 ), work( ipw ), 1,
754 $ work, 1, c( ioffc ), ldc )
762 CALL pbztrnv( ictxt,
'Columnwise',
'Transpose', n,
763 $ descv( mb_ ), icoff, v( ioffv ), 1, zero,
764 $ work, 1, ivrow, ivcol, -1, iccol,
769 IF( mycol.EQ.ivcol )
THEN
771 CALL zgebs2d( ictxt,
'Rowwise',
' ', 1, 1, tau( jjv ),
773 tauloc( 1 ) = tau( jjv )
777 CALL zgebr2d( ictxt,
'Rowwise',
' ', 1, 1, tauloc, 1,
782 IF( tauloc( 1 ).NE.zero )
THEN
787 CALL zgemv(
'No transpose', mp, nq, one,
788 $ c( ioffc ), ldc, work, 1, zero,
791 CALL zlaset(
'All', mp, 1, zero, zero, work( ipw ),
794 CALL zgsum2d( ictxt,
'Rowwise',
' ', mp, 1,
795 $ work( ipw ),
max( 1, mp ), rdest,
800 CALL zgerc( mp, nq, -tauloc( 1 ), work( ipw ), 1,
801 $ work, 1, c( ioffc ), ldc )