1 SUBROUTINE pbstrnv( ICONTXT, XDIST, TRANS, N, NB, NZ, X, INCX,
2 $ BETA, Y, INCY, IXROW, IXCOL, IYROW, IYCOL,
14 CHARACTER*1 TRANS, XDIST
15 INTEGER , INCX, INCY, IXCOL, IXROW, IYCOL,
20 REAL WORK( * ), X( * ), Y( * )
170 PARAMETER ( ONE = 1.0e+0, zero = 0.0e+0 )
173 LOGICAL COLFORM, ROWFORM
174 INTEGER I, IDEX, IGD, INFO, JDEX, JYCOL, JYROW, JZ, KZ,
175 $ lcm, lcmp, lcmq, mccol, mcrow, mrcol, mrrow,
176 $ mycol, myrow, nn, np, np0, np1, npcol, nprow,
182 INTEGER ILCM, ICEIL, NUMROC
183 EXTERNAL lsame, ilcm, iceil, numroc
201 colform =
lsame( xdist,
'C' )
202 rowform =
lsame( xdist,
'R' )
207 IF( ( .NOT.colform ) .AND. ( .NOT.rowform ) )
THEN
209 ELSE IF( n .LT.0 )
THEN
211 ELSE IF( nb .LT.1 )
THEN
213 ELSE IF( nz .LT.0 .OR. nz.GE.nb )
THEN
215 ELSE IF( incx.EQ.0 )
THEN
217 ELSE IF( incy.EQ.0 )
THEN
219 ELSE IF( ixrow.LT.-1 .OR. ixrow.GE.nprow .OR.
220 $ ( ixrow.EQ.-1 .AND. colform ) )
THEN
222 ELSE IF( ixcol.LT.-1 .OR. ixcol.GE.npcol .OR.
223 $ ( ixcol.EQ.-1 .AND. rowform ) )
THEN
225 ELSE IF( iyrow.LT.-1 .OR. iyrow.GE.nprow .OR.
226 $ ( iyrow.EQ.-1 .AND. rowform ) )
THEN
228 ELSE IF( iycol.LT.-1 .OR. iycol.GE.npcol .OR.
229 $ ( iycol.EQ.-1 .AND. colform ) )
THEN
243 LCM = ILCM( NPROW, NPCOL )
263.LT..OR..GE.
IF( IXROW0 IXROWNPROW ) THEN
265.LT..OR..GE.
ELSE IF( IXCOL-1 IXCOLNPCOL ) THEN
267.LT..OR..GE.
ELSE IF( IYROW-1 IYROWNPROW ) THEN
269.LT..OR..GE.
ELSE IF( IYCOL0 IYCOLNPCOL ) THEN
272.NE.
IF( INFO0 ) GO TO 10
277 MRROW = MOD( NPROW+MYROW-IXROW, NPROW )
278 MRCOL = MOD( NPCOL+MYCOL-IYCOL, NPCOL )
280.EQ.
IF( IYROW-1 ) JYROW = IXROW
282 NP = NUMROC( NN, NB, MYROW, IXROW, NPROW )
283.EQ.
IF( MRROW0 ) NP = NP - NZ
284 NQ = NUMROC( NN, NB, MYCOL, IYCOL, NPCOL )
285.EQ.
IF( MRCOL0 ) NQ = NQ - NZ
286 NQ0 = NUMROC( NUMROC(NN, NB, 0, 0, NPCOL), NB, 0, 0, LCMQ )
290.GE.
IF( IXCOL 0 ) THEN
292.EQ.
IF( MYROWJYROW ) TBETA = BETA
295 DO 20 I = 0, MIN( LCM, ICEIL(NN,NB) ) - 1
296 MCROW = MOD( MOD(I, NPROW) + IXROW, NPROW )
297 MCCOL = MOD( MOD(I, NPCOL) + IYCOL, NPCOL )
298.EQ.
IF( LCMQ1 ) NQ0 = NUMROC( NN, NB, I, 0, NPCOL )
299 JDEX = (I/NPCOL) * NB
300.EQ.
IF( MRCOL0 ) JDEX = MAX(0, JDEX-NZ)
304.EQ..AND..EQ.
IF( MYROWMCROW MYCOLIXCOL ) THEN
308 IDEX = (I/NPROW) * NB
309.EQ.
IF( MRROW0 ) IDEX = MAX( 0, IDEX-NZ )
310.EQ..AND..EQ.
IF( MYROWJYROW MYCOLMCCOL ) THEN
311 CALL PBSTR2B1( ICONTXT, TRANS, NP-IDEX, NB, KZ,
312 $ X(IDEX*INCX+1), INCX, TBETA,
313 $ Y(JDEX*INCY+1), INCY, LCMP, LCMQ )
318 CALL PBSTR2B1( ICONTXT, TRANS, NP-IDEX, NB, KZ,
319 $ X(IDEX*INCX+1), INCX, ZERO, WORK, 1,
321 CALL SGESD2D( ICONTXT, 1, NQ0-KZ, WORK, 1,
327.EQ..AND..EQ.
ELSE IF( MYROWJYROW MYCOLMCCOL ) THEN
328.EQ..AND..EQ.
IF( LCMQ1 TBETAZERO ) THEN
329 CALL SGERV2D( ICONTXT, 1, NQ0-KZ, Y, INCY,
332 CALL SGERV2D( ICONTXT, 1, NQ0-KZ, WORK, 1,
334 CALL PBSTR2A1( ICONTXT, NQ-JDEX, NB, KZ, WORK, 1, TBETA,
335 $ Y(JDEX*INCY+1), INCY, LCMQ*NB )
343.EQ.
IF( IYROW-1 ) THEN
344.EQ.
IF( MYROWJYROW ) THEN
345 CALL SGEBS2D( ICONTXT, 'col
', '1-tree
', 1, NQ, Y, INCY )
347 CALL SGEBR2D( ICONTXT, 'col
', '1-tree
', 1, NQ, Y, INCY,
355.EQ.
IF( LCMQ1 ) NQ0 = NQ
361.EQ.
IF( MRROW0 ) KZ = NZ
363.EQ..AND..EQ.
IF( MRROW0 MYCOLIYCOL ) JZ = NZ
365 DO 30 I = 0, LCMP - 1
366.EQ.
IF( MRCOLMOD(NPROW*I+MRROW, NPCOL) ) THEN
367 IDEX = MAX( 0, I*NB-KZ )
368.EQ..AND..EQ..OR..EQ.
IF( LCMQ1 (IYROW-1IYROWMYROW) ) THEN
369 CALL PBSTR2B1( ICONTXT, TRANS, NP-IDEX, NB, JZ,
370 $ X(IDEX*INCX+1), INCX, BETA, Y, INCY,
373 CALL PBSTR2B1( ICONTXT, TRANS, NP-IDEX, NB, JZ,
374 $ X(IDEX*INCX+1), INCX, ZERO, WORK, 1,
382 MCROW = MOD( MOD(MRCOL, NPROW) + IXROW, NPROW )
384 MCCOL = MOD( NPCOL+MYCOL-IYCOL, NPCOL )
385 CALL PBSTRGET( ICONTXT, 'row
', 1, NQ0, ICEIL( NN, NB ),
386 $ WORK, 1, MCROW, MCCOL, IGD, MYROW, MYCOL,
392.EQ.
IF( IYROW-1 ) THEN
393.EQ.
IF( MYROWMCROW ) THEN
396.EQ.
IF( MYCOLIYCOL ) KZ = NZ
397 CALL PBSTRST1( ICONTXT, 'row
', NQ, NB, KZ, WORK, 1,
398 $ BETA, Y, INCY, LCMP, LCMQ, NQ0 )
400 CALL SGEBS2D( ICONTXT, 'col
', '1-tree
', 1, NQ, Y, INCY )
402 CALL SGEBR2D( ICONTXT, 'col
', '1-tree
', 1, NQ, Y, INCY,
410.EQ.
IF( MYROWMCROW ) THEN
412 $ CALL SGESD2D( ICONTXT, 1, NQ0, WORK, 1, IYROW, MYCOL )
413.EQ.
ELSE IF( MYROWIYROW ) THEN
414.EQ.
IF( BETAZERO ) THEN
415 CALL SGERV2D( ICONTXT, 1, NQ0, Y, INCY, MCROW, MYCOL )
417 CALL SGERV2D( ICONTXT, 1, NQ0, WORK, 1, MCROW, MYCOL )
418 CALL PBSVECADD( ICONTXT, 'g
', NQ0, ONE, WORK, 1,
424 NQ1 = NQ0 * MIN( LCMQ, MAX( 0, ICEIL(NN,NB)-MCCOL ) )
425.EQ.
IF( MYROWMCROW ) THEN
427 $ CALL SGESD2D( ICONTXT, 1, NQ1, WORK, 1, IYROW, MYCOL )
428.EQ.
ELSE IF( MYROWIYROW ) THEN
429 CALL SGERV2D( ICONTXT, 1, NQ1, WORK, 1, MCROW, MYCOL )
432.EQ.
IF( MYROWIYROW ) THEN
434.EQ.
IF( MYCOLIYCOL ) KZ = NZ
435 CALL PBSTRST1( ICONTXT, 'row
', NQ, NB, KZ, WORK, 1,
436 $ BETA, Y, INCY, LCMP, LCMQ, NQ0 )
456.LT..OR..GE.
IF( IXROW-1 IXROWNPROW ) THEN
458.LT..OR..GE.
ELSE IF( IXCOL0 IXCOLNPCOL ) THEN
460.LT..OR..GE.
ELSE IF( IYROW0 IYROWNPROW ) THEN
462.LT..OR..GE.
ELSE IF( IYCOL-1 IYCOLNPCOL ) THEN
465.NE.
IF( INFO0 ) GO TO 10
470 MRROW = MOD( NPROW+MYROW-IYROW, NPROW )
471 MRCOL = MOD( NPCOL+MYCOL-IXCOL, NPCOL )
473.EQ.
IF( IYCOL-1 ) JYCOL = IXCOL
475 NP = NUMROC( NN, NB, MYROW, IYROW, NPROW )
476.EQ.
IF( MRROW0 ) NP = NP - NZ
477 NQ = NUMROC( NN, NB, MYCOL, IXCOL, NPCOL )
478.EQ.
IF( MRCOL0 ) NQ = NQ - NZ
479 NP0 = NUMROC( NUMROC(NN, NB, 0, 0, NPROW), NB, 0, 0, LCMP )
483.GE.
IF( IXROW 0 ) THEN
485.EQ.
IF( MYCOLJYCOL ) TBETA = BETA
488 DO 40 I = 0, MIN( LCM, ICEIL(NN,NB) ) - 1
489 MCROW = MOD( MOD(I, NPROW) + IYROW, NPROW )
490 MCCOL = MOD( MOD(I, NPCOL) + IXCOL, NPCOL )
491.EQ.
IF( LCMP1 ) NP0 = NUMROC( NN, NB, I, 0, NPROW )
492 JDEX = (I/NPROW) * NB
493.EQ.
IF( MRROW0 ) JDEX = MAX(0, JDEX-NZ)
497.EQ..AND..EQ.
IF( MYROWIXROW MYCOLMCCOL ) THEN
501 IDEX = (I/NPCOL) * NB
502.EQ.
IF( MRCOL0 ) IDEX = MAX( 0, IDEX-NZ )
503.EQ..AND..EQ.
IF( MYROWMCROW MYCOLJYCOL ) THEN
504 CALL PBSTR2B1( ICONTXT, TRANS, NQ-IDEX, NB, KZ,
505 $ X(IDEX*INCX+1), INCX, TBETA,
506 $ Y(JDEX*INCY+1), INCY, LCMQ, LCMP )
511 CALL PBSTR2B1( ICONTXT, TRANS, NQ-IDEX, NB, KZ,
512 $ X(IDEX*INCX+1), INCX, ZERO, WORK, 1,
514 CALL SGESD2D( ICONTXT, 1, NP0-KZ, WORK, 1,
520.EQ..AND..EQ.
ELSE IF( MYROWMCROW MYCOLJYCOL ) THEN
521.EQ..AND..EQ.
IF( LCMP1 TBETAZERO ) THEN
522 CALL SGERV2D( ICONTXT, 1, NP0-KZ, Y, INCY,
525 CALL SGERV2D( ICONTXT, 1, NP0-KZ, WORK, 1,
527 CALL PBSTR2A1( ICONTXT, NP-JDEX, NB, KZ, WORK, 1, TBETA,
528 $ Y(JDEX*INCY+1), INCY, LCMP*NB )
536.EQ.
IF( IYCOL-1 ) THEN
537.EQ.
IF( MYCOLJYCOL ) THEN
538 CALL SGEBS2D( ICONTXT, 'row',
'1-tree', 1, np, y, incy )
540 CALL sgebr2d( icontxt,
'Row',
'1-tree', 1, np, y, incy,
548 IF( lcmp.EQ.1 ) np0 = np
554 IF( mrcol.EQ.0 ) kz = nz
556 IF( mrcol.EQ.0 .AND. myrow.EQ.iyrow ) jz = nz
559 IF( mrrow.EQ.mod(npcol*i+mrcol, nprow) )
THEN
560 idex =
max( 0, i*nb-kz )
561 IF( lcmp.EQ.1 .AND. (iycol.EQ.-1.OR.iycol.EQ.mycol) )
THEN
562 CALL pbstr2b1( icontxt, trans, nq-idex, nb, jz,
563 $ x(idex*incx+1), incx, beta, y, incy,
566 CALL pbstr2b1( icontxt, trans, nq-idex, nb, jz,
567 $ x(idex*incx+1), incx, zero, work, 1,
575 mccol = mod( mod(mrrow, npcol) + ixcol, npcol )
577 mcrow = mod( nprow+myrow-iyrow, nprow )
578 CALL pbstrget( icontxt,
'Col', 1, np0, iceil( nn, nb ),
579 $ work, 1, mcrow, mccol, igd, myrow, mycol,
585 IF( iycol.EQ.-1 )
THEN
586 IF( mycol.EQ.mccol )
THEN
589 IF( myrow.EQ.iyrow ) kz = nz
590 CALL pbstrst1( icontxt,
'Col', np, nb, kz, work, 1,
591 $ beta, y, incy, lcmp, lcmq, np0 )
593 CALL sgebs2d( icontxt,
'Row',
'1-tree', 1, np, y, incy )
595 CALL sgebr2d( icontxt,
'Row',
'1-tree', 1, np, y, incy,
603 IF( mycol.EQ.mccol )
THEN
605 $
CALL sgesd2d( icontxt, 1, np, work, 1, myrow, iycol )
606 ELSE IF( mycol.EQ.iycol )
THEN
607 IF( beta.EQ.zero )
THEN
608 CALL sgerv2d( icontxt, 1, np, y, incy, myrow, mccol )
610 CALL sgerv2d( icontxt, 1, np, work, 1, myrow, mccol )
611 CALL pbsvecadd( icontxt,
'G', np, one, work, 1, beta,
617 np1 = np0 *
min( lcmp,
max( 0, iceil(nn,nb)-mcrow ) )
618 IF( mycol.EQ.mccol )
THEN
620 $
CALL sgesd2d( icontxt, 1, np1, work, 1, myrow, iycol )
621 ELSE IF( mycol.EQ.iycol )
THEN
622 CALL sgerv2d( icontxt, 1, np1, work, 1, myrow, mccol )
625 IF( mycol.EQ.iycol )
THEN
627 IF( myrow.EQ.iyrow ) kz = nz
628 CALL pbstrst1( icontxt,
'Col', np, nb, kz, work, 1,
629 $ beta, y, incy, lcmp, lcmq, np0 )
646 SUBROUTINE pbstr2a1( ICONTXT, N, NB, NZ, X, INCX, BETA, Y, INCY,
654 INTEGER ICONTXT, N, NB, NZ, INCX, INCY, INTV
680 PARAMETER ( ONE = 1.0e+0 )
683 INTEGER IX, IY, JZ, K, ITER
688 iter = iceil( n+nz, intv )
691 CALL pbsvecadd( icontxt,
'G', nb-jz, one, x(ix*incx+1), incx,
692 $ beta, y(iy*incy+1), incy )
698 CALL pbsvecadd( icontxt,
'G', nb, one, x(ix*incx+1), incx,
699 $ beta, y(iy*incy+1), incy )
706 $ x(ix*incx+1), incx, beta, y(iy*incy+1), incy )
718 SUBROUTINE pbstr2b1( ICONTXT, TRANS, N, NB, NZ, X, INCX, BETA, Y,
727 INTEGER ICONTXT, N, NB, NZ, INCX, INCY, JINX, JINY
753 parameter( one = 1.0e+0 )
756 INTEGER IX, IY, JZ, K, ITER, LENX, LENY
758 IF( jinx.EQ.1 .AND. jiny.EQ.1 )
THEN
759 CALL pbsvecadd( icontxt, trans, n, one, x, incx, beta,
768 iter = iceil( n+nz, lenx )
771 CALL pbsvecadd( icontxt, trans, nb-jz, one, x(ix*incx+1),
772 $ incx, beta, y(iy*incy+1), incy )
778 CALL pbsvecadd( icontxt, trans, nb, one, x(ix*incx+1),
779 $ incx, beta, y(iy*incy+1), incy )
785 CALL pbsvecadd( icontxt, trans,
min( n-ix, nb-jz ), one,
786 $ x(ix*incx+1), incx, beta, y(iy*incy+1), incy )