1 SUBROUTINE pslarf( 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 REAL 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, zero = 0.0e+0 )
238 LOGICAL CCBLCK, CRBLCK
240 INTEGER ICCOL, ICOFF, ICROW, ICTXT, IIC, IIV, IOFFC,
241 $ ioffv, ipw, iroff, ivcol, ivrow, jjc, jjv, ldc,
242 $ ldv, mycol, myrow, mp, ncc, ncv, npcol, nprow,
249 $
sger, sgerv2d, sgesd2d, sgsum2d,
255 EXTERNAL lsame, numroc
264 IF( m.LE.0 .OR. n.LE.0 )
269 ictxt = descc( ctxt_ )
274 CALL infog2l( ic, jc, descc, nprow, npcol, myrow, mycol, iic
276 CALL infog2l( iv, jv, descv, nprow, npcol, myrow, mycol, iiv, jjv,
278 ncc = numroc( descc( n_ ), descc( nb_ ), mycol, descc( csrc_ ),
280 ncv = numroc( descv( n_ ), descv( nb_ ), mycol, descv( csrc_ ),
284 iic =
min( iic, ldc )
285 iiv =
min( iiv, ldv )
286 jjc =
min( jjc, ncc )
287 jjv =
min( jjv, ncv )
288 ioffc = iic+(jjc-1)*ldc
289 ioffv = iiv+(jjv-1)*ldv
291 iroff = mod( ic-1, descc( mb_ ) )
292 icoff = mod( jc-1, descc( nb_ ) )
293 mp = numroc( m+iroff, descc( mb_ ), myrow, icrow, nprow )
294 nq = numroc( n+icoff, descc( nb_ ), mycol, iccol, npcol )
302 crblck = ( m.LE.(descc( mb_ )-iroff) )
306 ccblck = ( n.LE.(descc( nb_ )-icoff) )
308 IF( lsame( side,
'L' ) )
THEN
320 IF( descv( m_ ).EQ.incv )
THEN
325 CALL pbstrnv( ictxt,
'Rowwise',
'Transpose', m,
326 $ descv( nb_ ), iroff, v( ioffv ), ldv, zero,
327 $ work, 1, ivrow, ivcol, icrow, iccol,
332 IF( mycol.EQ.iccol )
THEN
334 IF( myrow.EQ.ivrow )
THEN
336 CALL sgebs2d( ictxt,
'Columnwise',
' ', 1, 1,
338 tauloc( 1 ) = tau( iiv )
342 CALL sgebr2d( ictxt,
'Columnwise',
' ', 1, 1,
343 $ tauloc, 1, ivrow, mycol )
347 IF( tauloc( 1 ).NE.zero )
THEN
352 CALL sgemv(
'Transpose', mp, nq, one,
353 $ c( ioffc ), ldc, work, 1, zero,
356 CALL slaset(
'All', nq, 1, zero, zero,
357 $ work( ipw ),
max( 1, nq ) )
359 CALL sgsum2d( ictxt,
'Columnwise',
' ', nq, 1,
360 $ work( ipw ),
max( 1, nq ), rdest,
365 CALL sger( mp, nq, -tauloc( 1 ), work, 1,
366 $ work( ipw ), 1, c( ioffc ), ldc )
375 IF( ivcol.EQ.iccol )
THEN
379 IF( mycol.EQ.iccol )
THEN
381 tauloc( 1 ) = tau( jjv )
383 IF( tauloc( 1 ).NE.zero )
THEN
388 CALL sgemv(
'Transpose', mp, nq, one,
389 $ c( ioffc ), ldc, v( ioffv ), 1,
392 CALL slaset(
'All', nq, 1, zero, zero,
393 $ work,
max( 1, nq ) )
395 CALL sgsum2d( ictxt,
'Columnwise',
' ', nq, 1,
396 $ work,
max( 1, nq ), rdest, mycol )
400 CALL sger( mp, nq, -tauloc( 1 ), v( ioffv ), 1,
401 $ work, 1, c( ioffc ), ldc )
410 IF( mycol.EQ.ivcol )
THEN
413 CALL scopy( mp, v( ioffv ), 1, work, 1 )
414 work( ipw ) = tau( jjv )
415 CALL sgesd2d( ictxt, ipw, 1, work, ipw, myrow,
418 ELSE IF( mycol.EQ.iccol )
THEN
421 CALL sgerv2d( ictxt, ipw, 1, work, ipw, myrow,
423 tauloc( 1 ) = work( ipw )
425 IF( tauloc( 1 ).NE.zero )
THEN
430 CALL sgemv(
'Transpose', mp, nq, one,
431 $ c( ioffc ), ldc, work, 1, zero,
434 CALL slaset(
'All', nq, 1, zero, zero,
435 $ work( ipw ),
max( 1, nq ) )
437 CALL sgsum2d( ictxt,
'Columnwise',
' ', nq, 1,
438 $ work( ipw ),
max( 1, nq ), rdest,
443 CALL sger( mp, nq, -tauloc( 1 ), work, 1,
444 $ work( ipw ), 1, c( ioffc ), ldc )
457 IF( descv( m_ ).EQ.incv )
THEN
462 CALL pbstrnv( ictxt,
'Rowwise',
'Transpose', m,
463 $ descv( nb_ ), iroff, v( ioffv ), ldv, zero,
464 $ work, 1, ivrow, ivcol, icrow, -1,
469 IF( myrow.EQ.ivrow )
THEN
471 CALL sgebs2d( ictxt,
'Columnwise',
' ', 1, 1,
473 tauloc( 1 ) = tau( iiv )
477 CALL sgebr2d( ictxt,
'Columnwise',
' ', 1, 1, tauloc,
482 IF( tauloc( 1 ).NE.zero )
THEN
488 $
CALL sgemv(
'Transpose', mp, nq, one,
489 $ c( ioffc ), ldc, work, 1, zero,
492 CALL slaset(
'All', nq, 1, zero, zero,
493 $ work( ipw ),
max( 1, nq ) )
495 CALL sgsum2d( ictxt,
'Columnwise',
' ', nq, 1,
496 $ work( ipw ),
max( 1, nq ), rdest,
502 $
CALL sger( mp, nq, -tauloc( 1 ), work, 1,
503 $ work( ipw ), 1, c( ioffc ), ldc )
510 CALL pb_topget( ictxt,
'Broadcast',
'Rowwise', rowbtop )
511 IF( mycol.EQ.ivcol )
THEN
514 CALL scopy( mp, v( ioffv ), 1, work, 1 )
515 work(ipw) = tau( jjv )
516 CALL sgebs2d( ictxt,
'Rowwise', rowbtop, ipw, 1,
518 tauloc( 1 ) = tau( jjv )
523 CALL sgebr2d( ictxt,
'Rowwise', rowbtop, ipw, 1, work,
524 $ ipw, myrow, ivcol )
525 tauloc( 1 ) = work( ipw )
529 IF( tauloc( 1 ).NE.zero )
THEN
535 $
CALL sgemv(
'Transpose', mp, nq, one,
536 $ c( ioffc ), ldc, work, 1, zero,
539 CALL slaset(
'All', nq, 1, zero, zero,
540 $ work( ipw ),
max( 1, nq ) )
542 CALL sgsum2d( ictxt,
'Columnwise',
' ', nq, 1,
543 $ work( ipw ),
max( 1, nq ), rdest,
549 $
CALL sger( mp, nq, -tauloc( 1 ), work, 1,
550 $ work( ipw ), 1, c( ioffc ), ldc )
569 IF( descv( m_ ).EQ.incv )
THEN
573 IF( ivrow.EQ.icrow )
THEN
577 IF( myrow.EQ.icrow )
THEN
579 tauloc( 1 ) = tau( iiv )
581 IF( tauloc( 1 ).NE.zero )
THEN
586 CALL sgemv(
'No transpose', mp, nq, one,
587 $ c( ioffc ), ldc, v( ioffv ), ldv,
590 CALL slaset(
'All', mp, 1, zero, zero,
591 $ work,
max( 1, mp ) )
593 CALL sgsum2d( ictxt,
'Rowwise',
' ', mp, 1,
594 $ work,
max( 1, mp ), rdest, iccol )
598 IF( ioffv.GT.0 .AND. ioffc.GT.0 )
599 $
CALL sger( mp, nq, -tauloc( 1 ), work, 1,
600 $ v( ioffv ), ldv, c( ioffc ), ldc )
609 IF( myrow.EQ.ivrow )
THEN
612 CALL scopy( nq, v( ioffv ), ldv, work, 1 )
613 work(ipw) = tau( iiv )
614 CALL sgesd2d( ictxt, ipw, 1, work, ipw, icrow,
617 ELSE IF( myrow.EQ.icrow )
THEN
620 CALL sgerv2d( ictxt, ipw, 1, work, ipw, ivrow,
622 tauloc( 1 ) = work( ipw )
624 IF( tauloc( 1 ).NE.zero )
THEN
629 CALL sgemv(
'No transpose', mp, nq, one,
630 $ c( ioffc ), ldc, work, 1, zero,
633 CALL slaset(
'All', mp, 1, zero, zero,
634 $ work( ipw ),
max( 1, mp ) )
636 CALL sgsum2d( ictxt,
'Rowwise',
' ', mp, 1,
637 $ work( ipw ),
max( 1, mp ), rdest,
642 CALL sger( mp, nq, -tauloc( 1 ), work( ipw ), 1,
643 $ work, 1, c( ioffc ), ldc )
655 CALL pbstrnv( ictxt,
'Columnwise',
'Transpose', n,
656 $ descv( mb_ ), icoff, v( ioffv ), 1, zero,
657 $ work, 1, ivrow, ivcol, icrow, iccol,
662 IF( myrow.EQ.icrow )
THEN
664 IF( mycol.EQ.ivcol )
THEN
666 CALL sgebs2d'Rowwise',
' ', 1, 1,
668 tauloc( 1 ) = tau( jjv )
672 CALL sgebr2d( ictxt, 'rowwise
', ' ', 1, 1, TAULOC,
677.NE.
IF( TAULOC( 1 )ZERO ) THEN
682 CALL SGEMV( 'no transpose
', MP, NQ, ONE,
683 $ C( IOFFC ), LDC, WORK, 1, ZERO,
686 CALL SLASET( 'all
', MP, 1, ZERO, ZERO,
687 $ WORK( IPW ), MAX( 1, MP ) )
689 CALL SGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1,
690 $ WORK( IPW ), MAX( 1, MP ), RDEST,
695 CALL SGER( MP, NQ, -TAULOC( 1 ), WORK( IPW ), 1
696 $ , WORK, 1, C( IOFFC ), LDC )
707.EQ.
IF( DESCV( M_ )INCV ) THEN
711 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
',
713.EQ.
IF( MYROWIVROW ) THEN
717 $ CALL SCOPY( NQ, V( IOFFV ), LDV, WORK, 1 )
718 WORK(IPW) = TAU( IIV )
719 CALL SGEBS2D( ICTXT, 'columnwise
', COLBTOP, IPW, 1,
721 TAULOC( 1 ) = TAU( IIV )
726 CALL SGEBR2D( ICTXT, 'columnwise
', COLBTOP, IPW, 1,
727 $ WORK, IPW, IVROW, MYCOL )
728 TAULOC( 1 ) = WORK( IPW )
732.NE.
IF( TAULOC( 1 )ZERO ) THEN
737 CALL SGEMV( 'no transpose
', MP, NQ, ONE,
738 $ C( IOFFC ), LDC, WORK, 1, ZERO,
741 CALL SLASET( 'all
', MP, 1, ZERO, ZERO,
742 $ WORK( IPW ), MAX( 1, MP ) )
744 CALL SGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1,
745 $ WORK( IPW ), MAX( 1, MP ), RDEST,
751 $ CALL SGER( MP, NQ, -TAULOC( 1 ), WORK( IPW ), 1,
752 $ WORK, 1, C( IOFFC ), LDC )
760 CALL PBSTRNV( ICTXT, 'columnwise
', 'transpose
', N,
761 $ DESCV( MB_ ), ICOFF, V( IOFFV ), 1, ZERO,
762 $ WORK, 1, IVROW, IVCOL, -1, ICCOL,
767.EQ.
IF( MYCOLIVCOL ) THEN
769 CALL SGEBS2D( ICTXT, 'rowwise
', ' ', 1, 1, TAU( JJV ),
771 TAULOC( 1 ) = TAU( JJV )
775 CALL SGEBR2D( ICTXT, 'rowwise
', ' ', 1, 1, TAULOC, 1,
780.NE.
IF( TAULOC( 1 )ZERO ) THEN
785 CALL SGEMV( 'no transpose
', MP, NQ, ONE,
786 $ C( IOFFC ), LDC, WORK, 1, ZERO,
789 CALL SLASET( 'all
', MP, 1, ZERO, ZERO, WORK( IPW ),
792 CALL SGSUM2D( ICTXT, 'rowwise
', ' ', MP, 1,
793 $ WORK( IPW ), MAX( 1, MP ), RDEST,
798 CALL SGER( MP, NQ, -TAULOC( 1 ), WORK( IPW ), 1, WORK,
799 $ 1, C( IOFFC ), LDC )