1 RECURSIVE SUBROUTINE pslaqr1( WANTT, WANTZ, N, ILO, IHI, A,
2 $ DESCA, WR, WI, ILOZ, IHIZ, Z,
3 $ DESCZ, WORK, LWORK, IWORK,
18 INTEGER ihi, ihiz, ilo, iloz, ilwork, info, lwork, n
21 INTEGER desca( * ), descz( * ), iwork( * )
22 REAL a( * ), wi( * ), work( * ), wr( * ), z( * )
253 INTEGER block_cyclic_2d, csrc_, ctxt_, dlen_, dtype_,
254 $ lld_, mb_, m_, nb_, n_, rsrc_
255 PARAMETER ( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
256 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
257 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
259 PARAMETER ( zero = 0.0, one = 1.0, half = 0.5 )
261 parameter( const = 1.50 )
263 parameter( iblk = 32, lds = 12*iblk+1 )
266 INTEGER contxt, down, hbl, i, i1, i2, , ibulge,
267 $ icbuf, icol, icol1, icol2, ierr, ii,
268 $ irbuf, irow, irow1, irow2, ispec, istart,
269 $ istartcol, istartrow, istop, isub,
270 $ itermax, itmp1, itmp2, itn, its, j, jafirst,
271 $ jblk, jj, k, ki, l, lcmrc, lda, ldz, left,
272 $ lihih, lihiz, liloh, liloz, locali1, locali2,
273 $ localk, localm, m, modkm1, mycol, myrow,
274 $ nbulge, nh, node, npcol, nprow, nr, num, nz,
275 $ right, rotn, up, vecsidx, totit, totns, totsw,
276 $ dblk, nibble, nd, ns, ltop, lwkopt, s1, s2, s3
277 REAL ave, disc, h00, h10, h11, h12, h21, h22, h33,
278 $ h43h34, h44, ovfl, s, smlnum, sum, t1, t1copy,
279 $ t2, t3, ulp, unfl, v1save, v2, v2save, ,
280 $ v3save, sn, cs,
swap
284 INTEGER icurcol( iblk ), ( iblk ), k1( iblk ),
285 $ k2( iblk ), kcol( iblk ), kp2col( iblk ),
286 $ kp2row( iblk ), krow( iblk ), localk2( iblk )
287 REAL smalla( 6, 6, iblk ), vcopy( 3 )
302 INTRINSIC abs, float,
max,
min, mod, sign, sqrt
308 itermax = 30*( ihi-ilo+1 )
315 contxt = desca( ctxt_ )
317 iafirst = desca( rsrc_ )
318 jafirst = desca( csrc_ )
321 node = myrow*npcol + mycol
323 left = mod( mycol+npcol-1, npcol )
324 right = mod( mycol+1, npcol )
325 up = mod( myrow+nprow-1, nprow )
326 down = mod( myrow+1, nprow )
327 lcmrc =
ilcm( nprow, npcol )
334 localk =
numroc( n, hbl, mycol, jafirst, npcol )
339 lwkopt = int( 6*n+
max( 3*
max( lda, ldz )+2*localk, jj )
341 IF( lwork.EQ.-1 .OR. ilwork.EQ.-1 )
THEN
342 work( 1 ) = float( lwkopt )
345 ELSEIF( lwork.LT.lwkopt )
THEN
348 IF( descz( ctxt_ ).NE.desca( ctxt_ ) )
THEN
349 info = -( 1300+ctxt_ )
351 IF( desca( mb_ ).NE.desca( nb_ ) )
THEN
354 IF( descz( mb_ ).NE.descz( nb_ ) )
THEN
357 IF( desca( mb_ ).NE.descz( mb_ ) )
THEN
360 IF( ( ilo.GT.n ) .OR. ( ilo.LT.1 ) )
THEN
363 IF( ( ihi.GT.n ) .OR. ( ihi.LT.1 ) )
THEN
369 CALL igamn2d( contxt,
'ALL',
' ', 1, 1, info, 1, itmp1, itmp2, -1,
372 CALL pxerbla( contxt,
'PSLAQR1', -info )
373 work( 1 ) = float( lwkopt )
382 vecsidx = s3+4*lds*lds
390 rotn =
max( rotn, hbl-2 )
391 rotn =
min( rotn, 1 )
393 IF( ilo.EQ.ihi )
THEN
394 CALL infog2l( ilo, ilo, desca, nprow, npcol, myrow, mycol,
395 $ irow, icol, ii, jj )
396 IF( ( myrow.EQ.ii ) .AND. ( mycol.EQ.jj ) )
THEN
397 wr( ilo ) = a( ( icol-1 )*lda+irow )
402 work( 1 ) = float( lwkopt )
412 IF( nh .LE. lds )
THEN
413 CALL pslaqr4( wantt, wantz, n, ilo, ihi, a, desca, wr, wi,
414 $ iloz, ihiz, z, descz, work( s1+1 ), nh,
415 $ work( s2+1 ), nh, work( s3+1 ), 4*lds*lds,
417 work( 1 ) = float( lwkopt )
421 CALL infog1l( iloz, hbl, nprow, myrow, descz(rsrc_), liloz, lihiz)
422 lihiz =
numroc( ihiz, hbl, myrow, descz(rsrc_), nprow )
427 unfl =
pslamch( contxt,
'SAFE MINIMUM' )
429 CALL pslabad( contxt, unfl, ovfl )
430 ulp =
pslamch( contxt,
'PRECISION' )
431 smlnum = unfl*( nh / ulp )
468 CALL pslasmsub( a, desca, i, l, k, smlnum, work( irbuf+1 ),
476 CALL infog2l( l, l-1, desca, nprow, npcol, myrow, mycol,
477 $ irow, icol, itmp1, itmp2 )
478 IF( ( myrow.EQ.itmp1 ) .AND. ( mycol.EQ.itmp2 ) )
THEN
479 a( ( icol-1 )*lda+irow ) = zero
481 work( isub+l-1 ) = zero
487 IF ( l .GT. i - lds )
494 IF( .NOT.wantt )
THEN
504 jblk =
min( iblk, ( nh / 2 )-1 )
505 IF( jblk.GT.lcmrc )
THEN
509 jblk = jblk - mod( jblk, lcmrc )
511 jblk =
min( jblk, 2*lcmrc )
512 jblk =
max( jblk, 1 )
514 IF( its.EQ.20 .OR. its.EQ.40 )
THEN
518 CALL pslacp3( 2*jblk, i-2*jblk+1, a, desca, work( s1+1 ),
520 DO 20 ii = 2*jblk, 2, -1
521 work( s1+ii+(ii-1)*lds ) = const*(
522 $ abs( work( s1+ii+(ii-1)*lds ) )+
523 $ abs( work( s1+ii+(ii-2)*lds ) ) )
524 work( s1+ii+(ii-2)*lds ) = zero
525 work( s1+ii-1+(ii-1)*lds ) = zero
527 work( s1+1 ) = const*abs( work( s1+1 ) )
533 dblk =
ilaenv( 13,
'DLAQR0',
'SV', n, l, i, 4*lds*lds )
534 dblk =
max( 2*jblk, dblk ) + 1
535 dblk =
min( nh, lds, dblk )
536 CALL pslaqr2( wantt, wantz, n, l, i, dblk, a, desca,
537 $ iloz, ihiz, z, descz, ns, nd, wr, wi,
538 $ work( s1+1 ), lds, work( s2+1 ), dblk,
539 $ work( irbuf+1 ), work( icbuf+1 ),
540 $ work( s3+1 ), 4*lds*lds )
544 nibble =
ilaenv( 14,
'DLAQR0',
'SV', n, l, i, 4*lds
545 nibble =
max( 0, nibble )
548 IF( 100*nd .GT. nibble*nh .OR. dblk .LT. 2*jblk )
GOTO 10
556 CALL slaset(
'L', dblk-1, dblk-1, zero, zero,
557 $ work( s1+2 ), lds )
558 work( irbuf+1 ) = work( s1+1 )
559 work( icbuf+1 ) = zero
565 DO 21 ii = dblk, 3, -2
566 IF( work( icbuf+ii ).NE.-work( icbuf+ii-1 ) )
THEN
567 swap = work( irbuf+ii )
568 work( irbuf+ii ) = work( irbuf+ii-1 )
569 work( irbuf+ii-1 ) = work( irbuf+ii-2 )
570 work( irbuf+ii-2 ) =
swap
571 swap = work( icbuf+ii )
572 work( icbuf+ii ) = work( icbuf+ii-1 )
573 work( icbuf+ii-1 ) = work( icbuf+ii-2 )
574 work( icbuf+ii-2 ) =
swap
582 IF( work( icbuf+ii ) .EQ. zero )
THEN
583 work( s1+ii+(ii-1)*lds ) = work( irbuf+ii )
584 work( s1+ii+(ii-2)*lds ) = zero
587 work( s1+ii+(ii-1)*lds ) = work( irbuf+ii )
588 work( s1+ii+1+ii*lds ) = work( irbuf+ii )
589 work( s1+ii+1+(ii-1)*lds ) = work( icbuf+ii )
590 work( s1+ii+ii*lds ) = -work( icbuf+ii )
593 IF( ii .LE. dblk )
GOTO 22
595 CALL slahqr( .false., .false., dblk, 1, dblk,
596 $ work( s1+1 ), lds, work( irbuf+1 ),
597 $ work( icbuf+1 ), 1, dblk, z, ldz, ierr )
601 CALL pslacp3( dblk, i-dblk+1, a, desca, work( s1+1 ),
603 CALL slahqr( .false., .false., dblk, 1, dblk,
604 $ work( s1+1 ), lds, work( irbuf+1 ),
605 $ work( icbuf+1 ), 1, dblk, z, ldz, ierr )
611 h44 = work( s1+dblk+(dblk-1)*lds )
612 h33 = work( s1+dblk-1+(dblk-2)*lds )
613 h43h34 = work( s1+dblk-1+(dblk-1)*lds )*
614 $ work( s1+dblk+(dblk-2)*lds )
615 IF( ( jblk.GT.1 ) .AND. ( its.GT.30 ) )
THEN
616 s = work( s1+dblk-1+(dblk-3)*lds )
617 disc = ( h33-h44 )*half
618 disc = disc*disc + h43h34
619 IF( disc.GT.zero )
THEN
624 ave = half*( h33+h44 )
625 IF( abs( h33 )-abs( h44 ).GT.zero )
THEN
626 h33 = h33*h44 - h43h34
627 h44 = h33 / ( sign( disc, ave )+ave )
629 h44 = sign( disc, ave ) + ave
663 istop =
min( m+rotn-mod( m, rotn ), i-2 )
664 istop =
min( istop, m+hbl-3-mod( m-1, hbl ) )
665 istop =
min( istop, i2-2 )
666 istop =
max( istop, m )
667 nbulge = ( i-1-istop ) / hbl
671 nbulge =
min( nbulge, jblk )
672 IF( nbulge.GT.lcmrc )
THEN
676 nbulge = nbulge - mod( nbulge, lcmrc )
678 nbulge =
max( nbulge, 1 )
680 totns = totns + nbulge*2
682 IF( ( its.NE.20 ) .AND. ( its.NE.40 ) .AND. ( nbulge.GT.1 ) )
691 CALL slasorte( work(s1+dblk-2*nbulge+1+(dblk-2*nbulge)*lds),
692 $ lds, 2*nbulge, work( irbuf+1 ), ierr )
701 CALL infog1l( m, hbl, npcol, mycol, desca(csrc_),itmp1,localk )
702 localk =
numroc( n, hbl, mycol, desca(csrc_), npcol )
703 CALL infog1l( 1, hbl, npcol, mycol,desca(csrc_),icol1,locali2 )
704 locali2 =
numroc( i2, hbl, mycol, desca(csrc_), npcol )
708 CALL infog1l( i1, hbl, nprow,myrow,desca(rsrc_),locali1,icol1 )
709 icol1 =
numroc( n, hbl, myrow, desca(rsrc_), nprow )
710 CALL infog1l( 1, hbl, nprow, myrow, desca(rsrc_),localm,icol1 )
711 icol1 =
numroc(
min( m+3, i ), hbl, myrow, desca(rsrc_),nprow )
715 istartrow = mod( ( m+1 ) / hbl + iafirst, nprow )
716 istartcol = mod( ( m+1 ) / hbl + jafirst, npcol )
718 CALL infog1l( m, hbl, nprow, myrow, desca(rsrc_), ii, itmp2 )
719 itmp2 =
numroc( n, hbl, myrow, desca(rsrc_), nprow )
720 CALL infog1l( m, hbl, npcol, mycol, desca(csrc_), jj, itmp2 )
721 itmp2 =
numroc( n, hbl, mycol, desca(csrc_), npcol )
722 CALL infog1l(1,hbl,nprow,myrow,desca(rsrc_),istop,kp2row( 1 ) )
723 kp2row( 1 ) =
numroc( m+2, hbl, myrow, desca(rsrc_), nprow )
724 CALL infog1l(1,hbl,npcol,mycol,desca(csrc_),istop,kp2col( 1 ) )
725 kp2col( 1 ) =
numroc( m+2, hbl, mycol, desca(csrc_), npcol )
745 istop =
min( m+rotn-mod( m, rotn ), i-2 )
746 istop =
min( istop, m+hbl-3-mod( m-1, hbl ) )
747 istop =
min( istop, i2-2 )
748 istop =
max( istop, m )
750 icurrow( ki ) = istartrow
751 icurcol( ki ) = istartcol
752 localk2( ki ) = itmp1
756 $ kp2row( ki ) = kp2row( 1 )
758 $ kp2col( ki ) = kp2col( 1 )
768 CALL pslawil( itmp1, itmp2, m, a, desca, h44, h33, h43h34,
773 IF( k2( ibulge ).LE.i-1 )
THEN
775 IF( ( k1( ibulge ).GE.m+5 ) .AND. ( ibulge.LT.nbulge ) )
777 IF( ( mod( k2( ibulge )+2, hbl ).EQ.mod( k2( ibulge+1 )+
778 $ 2, hbl ) ) .AND. ( k1( 1 ).LE.i-1 ) )
THEN
779 h44 = work( s1+dblk-2*ibulge+(dblk-2*ibulge-1)*lds )
780 h33 = work( s1+dblk-2*ibulge-1+(dblk-2*ibulge-2)*lds )
781 h43h34 = work( s1+dblk-2*ibulge-1+
782 $ (dblk-2*ibulge-1)*lds )
783 $ *work(s1+dblk-2*ibulge+(dblk-2*ibulge-2)*lds)
786 CALL pslawil( itmp1, itmp2, m, a, desca, h44, h33,
804 istart =
max( k1( ki ), m )
805 istop =
min( k2( ki ), i-1 )
807 modkm1 = mod( k-1, hbl )
808 IF( ( modkm1.GE.hbl-2 ) .AND. ( k.LE.i-1 ) )
THEN
811 smalla(itmp1, itmp2, ki) = zero
814 IF( ( modkm1.EQ.hbl-2 ) .AND. ( k.LT.i-1 ) )
THEN
818 CALL infog2l( k+2, k+2, desca, nprow, npcol, myrow,
819 $ mycol, irow1, icol1, itmp1, itmp2 )
821 $ smalla( 1, 1, ki ), 6, itmp1, itmp2,
824 IF( modkm1.EQ.hbl-1 )
THEN
828 CALL infog2l( k+1, k+1, desca, nprow, npcol, myrow,
829 $ mycol, irow1, icol1, itmp1, itmp2 )
831 $ smalla( 1, 1, ki ), 6, itmp1, itmp2,
860 IF( ( myrow.EQ.icurrow( ki ) ) .AND.
861 $ ( mycol.EQ.icurcol( ki ) ) .AND.
862 $ ( modkm1.EQ.hbl-2 ) .AND.
863 $ ( istart.LT.
min( i-1, istop+1 ) ) )
THEN
867 CALL scopy( nr, smalla( 2, 1, ki ), 1, vcopy, 1 )
873 CALL slarfg( nr, vcopy( 1 ), vcopy( 2 ), 1, t1copy )
875 smalla( 2, 1, ki ) = vcopy( 1 )
876 smalla( 3, 1, ki ) = zero
878 $ smalla( 4, 1, ki ) = zero
879 ELSE IF( m.GT.l )
THEN
880 smalla( 2, 1, ki ) = -smalla( 2, 1, ki )
884 work( vecsidx+( k-1 )*3+1 ) = vcopy( 2 )
885 work( vecsidx+( k-1 )*3+2 ) = vcopy( 3 )
886 work( vecsidx+( k-1 )*3+3 ) = t1copy
889 IF( ( mod( istop-1, hbl ).EQ.hbl-1 ) .AND.
890 $ ( myrow.EQ.icurrow( ki ) ) .AND.
891 $ ( mycol.EQ.icurcol( ki ) ) .AND.
892 $ ( istart.LE.
min( i, istop ) ) )
THEN
896 CALL scopy( nr, smalla( 3, 2, ki ), 1, vcopy, 1 )
902 CALL slarfg( nr, vcopy( 1 ), vcopy( 2 ), 1, t1copy )
904 smalla( 3, 2, ki ) = vcopy( 1 )
905 smalla( 4, 2, ki ) = zero
907 $ smalla( 5, 2, ki ) = zero
919 ELSE IF( m.GT.l )
THEN
920 smalla( 3, 2, ki ) = -smalla( 3, 2, ki )
924 work( vecsidx+( k-1 )*3+1 ) = vcopy( 2 )
925 work( vecsidx+( k-1 )*3+2 ) = vcopy( 3 )
926 work( vecsidx+( k-1 )*3+3 ) = t1copy
929 IF( ( modkm1.EQ.0 ) .AND. ( istart.LE.i-1 ) .AND.
930 $ ( myrow.EQ.icurrow( ki ) ) .AND.
931 $ ( right.EQ.icurcol( ki ) ) )
THEN
936 icol1 = localk2( ki )
937 IF( istart.GT.m )
THEN
938 vcopy( 1 ) = smalla( 4, 3, ki )
939 vcopy( 2 ) = smalla( 5, 3, ki )
940 vcopy( 3 ) = smalla( 6, 3, ki )
941 nr =
min( 3, i-istart+1 )
942 CALL slarfg( nr, vcopy( 1 ), vcopy( 2 ), 1,
944 a( ( icol1-2 )*lda+irow1 ) = vcopy( 1 )
945 a( ( icol1-2 )*lda+irow1+1 ) = zero
946 IF( istart.LT.i-1 )
THEN
947 a( ( icol1-2 )*lda+irow1+2 ) = zero
951 a( ( icol1-2 )*lda+irow1 ) = -a( ( icol1-2 )*
957 IF( ( myrow.EQ.icurrow( ki ) ) .AND.
958 $ ( mycol.EQ.icurcol( ki ) ) .AND.
959 $ ( ( ( modkm1.EQ.hbl-2 ) .AND. ( istart.EQ.i-
960 $ 1 ) ) .OR. ( ( modkm1.LT.hbl-2 ) .AND. ( istart.LE.i-
966 icol1 = localk2( ki )
967 DO 70 k = istart, istop
973 IF( mod( k-1, hbl ).EQ.0 )
THEN
974 vcopy( 1 ) = smalla( 4, 3, ki )
975 vcopy( 2 ) = smalla( 5, 3, ki )
976 vcopy( 3 ) = smalla( 6, 3, ki )
978 vcopy( 1 ) = a( ( icol1-2 )*lda+irow1 )
979 vcopy( 2 ) = a( ( icol1-2 )*lda+irow1+1 )
981 vcopy( 3 ) = a( ( icol1-2 )*lda+irow1+2 )
989 CALL slarfg( nr, vcopy( 1 ), vcopy( 2 ), 1,
992 IF( mod( k-1, hbl ).GT.0 )
THEN
993 a( ( icol1-2 )*lda+irow1 ) = vcopy( 1 )
994 a( ( icol1-2 )*lda+irow1+1 ) = zero
996 a( ( icol1-2 )*lda+irow1+2 ) = zero
1012 ELSE IF( m.GT.l )
THEN
1013 IF( mod( k-1, hbl ).GT.0 )
THEN
1014 a( ( icol1-2 )*lda+irow1 ) = -a( ( icol1-2 )*
1020 work( vecsidx+( k-1 )*3+1 ) = vcopy( 2 )
1021 work( vecsidx+( k-1 )*3+2 ) = vcopy( 3 )
1022 work( vecsidx+( k-1 )*3+3 ) = t1copy
1024 IF( k.LT.istop )
THEN
1030 DO 50 j = icol1,
min( k2( ki )+1, i-1 ) +
1032 sum = a( ( j-1 )*lda+irow1 ) +
1033 $ v2*a( ( j-1 )*lda+irow1+1 ) +
1034 $ v3*a( ( j-1 )*lda+irow1+2 )
1035 a( ( j-1 )*lda+irow1 ) = a( ( j-1 )*lda+
1037 a( ( j-1 )*lda+irow1+1 ) = a( ( j-1 )*lda+
1038 $ irow1+1 ) - sum*t2
1039 a( ( j-1 )*lda+irow1+2 ) = a( ( j-1 )*lda+
1040 $ irow1+2 ) - sum*t3
1042 itmp1 = localk2( ki )
1043 DO 60 j = irow1 + 1, irow1 + 3
1044 sum = a( ( icol1-1 )*lda+j ) +
1045 $ v2*a( icol1*lda+j ) +
1046 $ v3*a( ( icol1+1 )*lda+j )
1047 a( ( icol1-1 )*lda+j ) = a( ( icol1-1 )*lda+
1049 a( icol1*lda+j ) = a( icol1*lda+j ) - sum*t2
1050 a( ( icol1+1 )*lda+j ) = a( ( icol1+1 )*lda+
1059 IF( modkm1.EQ.hbl-2 )
THEN
1060 IF( ( down.EQ.icurrow( ki ) ) .AND.
1061 $ ( right.EQ.icurcol( ki ) ) .AND. ( num.GT.1 ) )
1063 CALL sgerv2d( contxt, 3, 1,
1064 $ work( vecsidx+( istart-1 )*3+1 ), 3,
1067 IF( ( myrow.EQ.icurrow( ki ) ) .AND.
1068 $ ( mycol.EQ.icurcol( ki ) ) .AND. ( num.GT.1 ) )
1070 CALL sgesd2d( contxt, 3, 1,
1071 $ work( vecsidx+( istart-1 )*3+1 ), 3,
1074 IF( ( down.EQ.icurrow( ki ) ) .AND.
1075 $ ( npcol.GT.1 ) .AND. ( istart.LE.istop ) )
THEN
1076 jj = mod( icurcol( ki )+npcol-1, npcol )
1077 IF( mycol.NE.jj )
THEN
1078 CALL sgebr2d( contxt,
'ROW',
' ',
1079 $ 3*( istop-istart+1 ), 1,
1080 $ work( vecsidx+( istart-1 )*3+1 ),
1081 $ 3*( istop-istart+1 ), myrow, jj )
1083 CALL sgebs2d( contxt,
'ROW',
' ',
1084 $ 3*( istop-istart+1 ), 1,
1085 $ work( vecsidx+( istart-1 )*3+1 ),
1086 $ 3*( istop-istart+1 ) )
1093 IF( ( myrow.EQ.icurrow( ki ) ) .AND. ( npcol.GT.1 ) .AND.
1094 $ ( istart.LE.istop ) )
THEN
1095 IF( mycol.NE.icurcol( ki ) )
THEN
1096 CALL sgebr2d( contxt,
'ROW',
' ',
1097 $ 3*( istop-istart+1 ), 1,
1098 $ work( vecsidx+( istart-1 )*3+1 ),
1099 $ 3*( istop-istart+1 ), myrow,
1102 CALL sgebs2d( contxt,
'ROW',
' ',
1104 $ work( vecsidx+( istart-1 )*3+1 ),
1105 $ 3*( istop-istart+1 ) )
1112 DO 90 ki = 1, ibulge
1114 istart =
max( k1( ki ), m )
1115 istop =
min( k2( ki ), i-1 )
1117 IF( mod( istart-1, hbl ).EQ.hbl-2 )
THEN
1118 IF( ( right.EQ.icurcol( ki ) ) .AND.
1119 $ ( nprow.GT.1 ) .AND. ( istart.LE.istop ) )
THEN
1120 jj = mod( icurrow( ki )+nprow-1, nprow )
1121 IF( myrow.NE.jj )
THEN
1122 CALL sgebr2d( contxt,
'COL', '
',
1123 $ 3*( ISTOP-ISTART+1 ), 1,
1124 $ WORK( VECSIDX+( ISTART-1 )*3+1 ),
1125 $ 3*( ISTOP-ISTART+1 ), JJ, MYCOL )
1127 CALL SGEBS2D( CONTXT, 'col
', ' ',
1128 $ 3*( ISTOP-ISTART+1 ), 1,
1129 $ WORK( VECSIDX+( ISTART-1 )*3+1 ),
1130 $ 3*( ISTOP-ISTART+1 ) )
1135.EQ..AND..GT..AND.
IF( ( MYCOLICURCOL( KI ) ) ( NPROW1 )
1136.LE.
$ ( ISTARTISTOP ) ) THEN
1137.NE.
IF( MYROWICURROW( KI ) ) THEN
1138 CALL SGEBR2D( CONTXT, 'col
', ' ',
1139 $ 3*( ISTOP-ISTART+1 ), 1,
1140 $ WORK( VECSIDX+( ISTART-1 )*3+1 ),
1141 $ 3*( ISTOP-ISTART+1 ), ICURROW( KI ),
1144 CALL SGEBS2D( CONTXT, 'col
', ' ',
1145 $ 3*( ISTOP-ISTART+1 ), 1,
1146 $ WORK( VECSIDX+( ISTART-1 )*3+1 ),
1147 $ 3*( ISTOP-ISTART+1 ) )
1154 DO 150 KI = 1, IBULGE
1155 ISTART = MAX( K1( KI ), M )
1156 ISTOP = MIN( K2( KI ), I-1 )
1158 MODKM1 = MOD( ISTART-1, HBL )
1159.EQ..AND.
IF( ( MYROWICURROW( KI ) )
1160.EQ..AND.
$ ( MYCOLICURCOL( KI ) )
1161.EQ..AND..LT.
$ ( MODKM1HBL-2 ) ( ISTARTI-1 ) ) THEN
1166 NR = MIN( 3, I-K+1 )
1167 V2 = WORK( VECSIDX+( K-1 )*3+1 )
1168 V3 = WORK( VECSIDX+( K-1 )*3+2 )
1169 T1 = WORK( VECSIDX+( K-1 )*3+3 )
1177 ITMP1 = MIN( 6, I2+2-K )
1178 ITMP2 = MAX( I1-K+2, 1 )
1180 SUM = SMALLA( 2, J, KI ) +
1181 $ V2*SMALLA( 3, J, KI ) +
1182 $ V3*SMALLA( 4, J, KI )
1183 SMALLA( 2, J, KI ) = SMALLA( 2, J, KI ) - SUM*T1
1184 SMALLA( 3, J, KI ) = SMALLA( 3, J, KI ) - SUM*T2
1185 SMALLA( 4, J, KI ) = SMALLA( 4, J, KI ) - SUM*T3
1188 SUM = SMALLA( J, 2, KI ) +
1189 $ V2*SMALLA( J, 3, KI ) +
1190 $ V3*SMALLA( J, 4, KI )
1191 SMALLA( J, 2, KI ) = SMALLA( J, 2, KI ) - SUM*T1
1192 SMALLA( J, 3, KI ) = SMALLA( J, 3, KI ) - SUM*T2
1193 SMALLA( J, 4, KI ) = SMALLA( J, 4, KI ) - SUM*T3
1198.EQ..AND.
IF( ( MOD( ISTART-1, HBL )HBL-1 )
1199.LE..AND.
$ ( ISTARTISTOP )
1200.EQ..AND.
$ ( MYROWICURROW( KI ) )
1201.EQ.
$ ( MYCOLICURCOL( KI ) ) ) THEN
1206 NR = MIN( 3, I-K+1 )
1207 V2 = WORK( VECSIDX+( K-1 )*3+1 )
1208 V3 = WORK( VECSIDX+( K-1 )*3+2 )
1209 T1 = WORK( VECSIDX+( K-1 )*3+3 )
1217 ITMP1 = MIN( 6, I2-K+3 )
1218 ITMP2 = MAX( I1-K+3, 1 )
1220 SUM = SMALLA( 3, J, KI ) +
1221 $ V2*SMALLA( 4, J, KI ) +
1222 $ V3*SMALLA( 5, J, KI )
1223 SMALLA( 3, J, KI ) = SMALLA( 3, J, KI ) - SUM*T1
1224 SMALLA( 4, J, KI ) = SMALLA( 4, J, KI ) - SUM*T2
1225 SMALLA( 5, J, KI ) = SMALLA( 5, J, KI ) - SUM*T3
1228 SUM = SMALLA( J, 3, KI ) +
1229 $ V2*SMALLA( J, 4, KI ) +
1230 $ V3*SMALLA( J, 5, KI )
1231 SMALLA( J, 3, KI ) = SMALLA( J, 3, KI ) - SUM*T1
1232 SMALLA( J, 4, KI ) = SMALLA( J, 4, KI ) - SUM*T2
1233 SMALLA( J, 5, KI ) = SMALLA( J, 5, KI ) - SUM*T3
1238 MODKM1 = MOD( ISTART-1, HBL )
1239.EQ..AND.
IF( ( MYROWICURROW( KI ) )
1240.EQ..AND.
$ ( MYCOLICURCOL( KI ) )
1241.EQ..AND..EQ.
$ ( ( ( MODKM1HBL-2 ) ( ISTARTI-
1242.OR..LT..AND..LE.
$ 1 ) ) ( ( MODKM1HBL-2 ) ( ISTARTI-
1248 ICOL1 = LOCALK2( KI )
1249 DO 140 K = ISTART, ISTOP
1253 NR = MIN( 3, I-K+1 )
1254 V2 = WORK( VECSIDX+( K-1 )*3+1 )
1255 V3 = WORK( VECSIDX+( K-1 )*3+2 )
1256 T1 = WORK( VECSIDX+( K-1 )*3+3 )
1257.LT.
IF( KISTOP ) THEN
1263 CALL SLAREF( 'col
', A, LDA, .FALSE., Z, LDZ,
1264 $ .FALSE., ICOL1, ICOL1, ISTART,
1265 $ ISTOP, MIN( ISTART+1, I )-K+IROW1,
1266 $ IROW1, LILOZ, LIHIZ,
1267 $ WORK( VECSIDX+1 ), V2, V3, T1, T2,
1272.EQ..AND.
IF( ( NR3 ) ( MOD( K-1,
1273.LT.
$ HBL )HBL-2 ) ) THEN
1276 CALL SLAREF( 'row
', A, LDA, .FALSE., Z, LDZ,
1277 $ .FALSE., IROW1, IROW1, ISTART,
1278 $ ISTOP, ICOL1, MIN( MIN( K2( KI )
1279 $ +1, I-1 ), I2 )-K+ICOL1, LILOZ,
1280 $ LIHIZ, WORK( VECSIDX+1 ), V2,
1290 MODKM1 = MOD( K-1, HBL )
1291.GE..AND..LE.
IF( ( MODKM1HBL-2 ) ( KI-1 ) ) THEN
1292.EQ..AND..LT.
IF( ( MODKM1HBL-2 ) ( KI-1 ) ) THEN
1296 CALL INFOG2L( K+2, K+2, DESCA, NPROW, NPCOL, MYROW,
1297 $ MYCOL, IROW1, ICOL1, ITMP1, ITMP2 )
1298 CALL PSLACP3( MIN( 6, N-K+2 ), K-1, A, DESCA,
1299 $ SMALLA( 1, 1, KI ), 6, ITMP1, ITMP2,
1303.EQ.
IF( MODKM1HBL-1 ) THEN
1307 CALL INFOG2L( K+1, K+1, DESCA, NPROW, NPCOL, MYROW,
1308 $ MYCOL, IROW1, ICOL1, ITMP1, ITMP2 )
1309 CALL PSLACP3( MIN( 6, N-K+3 ), K-2, A, DESCA,
1310 $ SMALLA( 1, 1, KI ), 6, ITMP1, ITMP2,
1319 DO 160 KI = 1, IBULGE
1320.NE..AND.
IF( ( MYROWICURROW( KI ) )
1321.NE.
$ ( DOWNICURROW( KI ) ) )GO TO 160
1322 ISTART = MAX( K1( KI ), M )
1323 ISTOP = MIN( K2( KI ), I-1 )
1325.GT..AND.
IF( ( ISTOPISTART )
1326.LT..AND.
$ ( MOD( ISTART-1, HBL )HBL-2 )
1327.EQ.
$ ( ICURROW( KI )MYROW ) ) THEN
1328 IROW1 = MIN( K2( KI )+1, I-1 ) + 1
1329 CALL INFOG1L( IROW1, HBL, NPCOL, MYCOL, DESCA(CSRC_),
1331 ITMP2 = NUMROC( I2, HBL, MYCOL, DESCA(CSRC_), NPCOL )
1333 CALL SLAREF( 'row
', A, LDA, WANTZ, Z, LDZ, .TRUE., II,
1334 $ II, ISTART, ISTOP, ITMP1, ITMP2, LILOZ,
1335 $ LIHIZ, WORK( VECSIDX+1 ), V2, V3, T1, T2,
1340 DO 180 KI = 1, IBULGE
1341.GT.
IF( KROW( KI )KP2ROW( KI ) )
1343.NE..AND.
IF( ( MYROWICURROW( KI ) )
1344.NE.
$ ( DOWNICURROW( KI ) ) )GO TO 180
1345 ISTART = MAX( K1( KI ), M )
1346 ISTOP = MIN( K2( KI ), I-1 )
1347.EQ..OR.
IF( ( ISTARTISTOP )
1348.GE..OR.
$ ( MOD( ISTART-1, HBL )HBL-2 )
1349.NE.
$ ( ICURROW( KI )MYROW ) ) THEN
1350 DO 170 K = ISTART, ISTOP
1351 V2 = WORK( VECSIDX+( K-1 )*3+1 )
1352 V3 = WORK( VECSIDX+( K-1 )*3+2 )
1353 T1 = WORK( VECSIDX+( K-1 )*3+3 )
1354 NR = MIN( 3, I-K+1 )
1355.EQ..AND..LE.
IF( ( NR3 ) ( KROW( KI )
1356 $ KP2ROW( KI ) ) ) THEN
1357.LT..AND.
IF( ( KISTOP )
1358.LT.
$ ( MOD( K-1, HBL )HBL-2 ) ) THEN
1359 ITMP1 = MIN( K2( KI )+1, I-1 ) + 1
1361.LT.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1362 ITMP1 = MIN( K2( KI )+1, I-1 ) + 1
1364.EQ.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1365 ITMP1 = MIN( K+4, I2 ) + 1
1367.EQ.
IF( MOD( K-1, HBL )HBL-1 ) THEN
1368 ITMP1 = MIN( K+3, I2 ) + 1
1375 IROW2 = KP2ROW( KI )
1376 CALL INFOG1L( ITMP1, HBL, NPCOL, MYCOL,
1377 $ DESCA(CSRC_), ICOL1, ICOL2 )
1378 ICOL2 = NUMROC(I2,HBL,MYCOL,DESCA(CSRC_),NPCOL )
1379.LT..OR.
IF( ( MOD( K-1, HBL )HBL-2 )
1380.EQ.
$ ( NPROW1 ) ) THEN
1383 CALL SLAREF( 'row
', A, LDA, WANTZ, Z, LDZ,
1384 $ .FALSE., IROW1, IROW1, ISTART,
1385 $ ISTOP, ICOL1, ICOL2, LILOZ,
1386 $ LIHIZ, WORK( VECSIDX+1 ), V2,
1389.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-2 )
1390.GT.
$ ( NPROW1 ) ) THEN
1391.EQ.
IF( IROW1IROW2 ) THEN
1392 CALL SGESD2D( CONTXT, 1, ICOL2-ICOL1+1,
1393 $ A( ( ICOL1-1 )*LDA+IROW2 ),
1397.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-1 )
1398.GT.
$ ( NPROW1 ) ) THEN
1399.EQ.
IF( IROW1IROW2 ) THEN
1400 CALL SGESD2D( CONTXT, 1, ICOL2-ICOL1+1,
1401 $ A( ( ICOL1-1 )*LDA+IROW1 ),
1402 $ LDA, DOWN, MYCOL )
1410 DO 220 KI = 1, IBULGE
1411.GT.
IF( KROW( KI )KP2ROW( KI ) )
1413.NE..AND.
IF( ( MYROWICURROW( KI ) )
1414.NE.
$ ( DOWNICURROW( KI ) ) )GO TO 220
1415 ISTART = MAX( K1( KI ), M )
1416 ISTOP = MIN( K2( KI ), I-1 )
1417.EQ..OR.
IF( ( ISTARTISTOP )
1418.GE..OR.
$ ( MOD( ISTART-1, HBL )HBL-2 )
1419.NE.
$ ( ICURROW( KI )MYROW ) ) THEN
1420 DO 210 K = ISTART, ISTOP
1421 V2 = WORK( VECSIDX+( K-1 )*3+1 )
1422 V3 = WORK( VECSIDX+( K-1 )*3+2 )
1423 T1 = WORK( VECSIDX+( K-1 )*3+3 )
1424 NR = MIN( 3, I-K+1 )
1425.EQ..AND..LE.
IF( ( NR3 ) ( KROW( KI )
1426 $ KP2ROW( KI ) ) ) THEN
1427.LT..AND.
IF( ( KISTOP )
1428.LT.
$ ( MOD( K-1, HBL )HBL-2 ) ) THEN
1429 ITMP1 = MIN( K2( KI )+1, I-1 ) + 1
1431.LT.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1432 ITMP1 = MIN( K2( KI )+1, I-1 ) + 1
1434.EQ.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1435 ITMP1 = MIN( K+4, I2 ) + 1
1437.EQ.
IF( MOD( K-1, HBL )HBL-1 ) THEN
1438 ITMP1 = MIN( K+3, I2 ) + 1
1442 IROW1 = KROW( KI ) + K - ISTART
1443 IROW2 = KP2ROW( KI ) + K - ISTART
1444 CALL INFOG1L( ITMP1, HBL, NPCOL, MYCOL,
1445 $ DESCA(CSRC_),ICOL1, ICOL2 )
1446 ICOL2 = NUMROC(I2,HBL,MYCOL,DESCA(CSRC_),NPCOL )
1447.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-2 )
1448.GT.
$ ( NPROW1 ) ) THEN
1449.NE.
IF( IROW1IROW2 ) THEN
1450 CALL SGERV2D( CONTXT, 1, ICOL2-ICOL1+1,
1451 $ WORK( IRBUF+1 ), 1, DOWN,
1455 DO 190 J = ICOL1, ICOL2
1456 SUM = A( ( J-1 )*LDA+IROW1 ) +
1457 $ V2*A( ( J-1 )*LDA+IROW1+1 ) +
1458 $ V3*WORK( IRBUF+J-ICOL1+1 )
1459 A( ( J-1 )*LDA+IROW1 ) = A( ( J-1 )*
1460 $ LDA+IROW1 ) - SUM*T1
1461 A( ( J-1 )*LDA+IROW1+1 ) = A( ( J-1 )*
1462 $ LDA+IROW1+1 ) - SUM*T2
1463 WORK( IRBUF+J-ICOL1+1 ) = WORK( IRBUF+
1464 $ J-ICOL1+1 ) - SUM*T3
1466 CALL SGESD2D( CONTXT, 1, ICOL2-ICOL1+1,
1467 $ WORK( IRBUF+1 ), 1, DOWN,
1471.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-1 )
1472.GT.
$ ( NPROW1 ) ) THEN
1473.NE.
IF( IROW1IROW2 ) THEN
1474 CALL SGERV2D( CONTXT, 1, ICOL2-ICOL1+1,
1475 $ WORK( IRBUF+1 ), 1, UP,
1479 DO 200 J = ICOL1, ICOL2
1480 SUM = WORK( IRBUF+J-ICOL1+1 ) +
1481 $ V2*A( ( J-1 )*LDA+IROW1 ) +
1482 $ V3*A( ( J-1 )*LDA+IROW1+1 )
1483 WORK( IRBUF+J-ICOL1+1 ) = WORK( IRBUF+
1484 $ J-ICOL1+1 ) - SUM*T1
1485 A( ( J-1 )*LDA+IROW1 ) = A( ( J-1 )*
1486 $ LDA+IROW1 ) - SUM*T2
1487 A( ( J-1 )*LDA+IROW1+1 ) = A( ( J-1 )*
1488 $ LDA+IROW1+1 ) - SUM*T3
1490 CALL SGESD2D( CONTXT, 1, ICOL2-ICOL1+1,
1491 $ WORK( IRBUF+1 ), 1, UP,
1500 DO 240 KI = 1, IBULGE
1501.GT.
IF( KROW( KI )KP2ROW( KI ) )
1503.NE..AND.
IF( ( MYROWICURROW( KI ) )
1504.NE.
$ ( DOWNICURROW( KI ) ) )GO TO 240
1505 ISTART = MAX( K1( KI ), M )
1506 ISTOP = MIN( K2( KI ), I-1 )
1507.EQ..OR.
IF( ( ISTARTISTOP )
1508.GE..OR.
$ ( MOD( ISTART-1, HBL )HBL-2 )
1509.NE.
$ ( ICURROW( KI )MYROW ) ) THEN
1510 DO 230 K = ISTART, ISTOP
1511 V2 = WORK( VECSIDX+( K-1 )*3+1 )
1512 V3 = WORK( VECSIDX+( K-1 )*3+2 )
1513 T1 = WORK( VECSIDX+( K-1 )*3+3 )
1514 NR = MIN( 3, I-K+1 )
1515.EQ..AND..LE.
IF( ( NR3 ) ( KROW( KI )
1516 $ KP2ROW( KI ) ) ) THEN
1517.LT..AND.
IF( ( KISTOP )
1518.LT.
$ ( MOD( K-1, HBL )HBL-2 ) ) THEN
1519 ITMP1 = MIN( K2( KI )+1, I-1 ) + 1
1521.LT.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1522 ITMP1 = MIN( K2( KI )+1, I-1 ) + 1
1524.EQ.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1525 ITMP1 = MIN( K+4, I2 ) + 1
1527.EQ.
IF( MOD( K-1, HBL )HBL-1 ) THEN
1528 ITMP1 = MIN( K+3, I2 ) + 1
1532 IROW1 = KROW( KI ) + K - ISTART
1533 IROW2 = KP2ROW( KI ) + K - ISTART
1534 CALL INFOG1L( ITMP1, HBL, NPCOL, MYCOL,
1535 $ DESCA(CSRC_), ICOL1, ICOL2 )
1536 ICOL2 = NUMROC(I2,HBL,MYCOL,DESCA(CSRC_),NPCOL )
1537.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-2 )
1538.GT.
$ ( NPROW1 ) ) THEN
1539.EQ.
IF( IROW1IROW2 ) THEN
1540 CALL SGERV2D( CONTXT, 1, ICOL2-ICOL1+1,
1541 $ A( ( ICOL1-1 )*LDA+IROW2 ),
1545.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-1 )
1546.GT.
$ ( NPROW1 ) ) THEN
1547.EQ.
IF( IROW1IROW2 ) THEN
1548 CALL SGERV2D( CONTXT, 1, ICOL2-ICOL1+1,
1549 $ A( ( ICOL1-1 )*LDA+IROW1 ),
1550 $ LDA, DOWN, MYCOL )
1561 DO 260 KI = 1, IBULGE
1562.NE..AND.
IF( ( MYCOLICURCOL( KI ) )
1563.NE.
$ ( RIGHTICURCOL( KI ) ) )GO TO 260
1564 ISTART = MAX( K1( KI ), M )
1565 ISTOP = MIN( K2( KI ), I-1 )
1567.LT..OR..EQ.
IF( ( ( MOD( ISTART-1, HBL )HBL-2 ) ( NPCOL
1568.AND..EQ..AND.
$ 1 ) ) ( ICURCOL( KI )MYCOL )
1569.GE.
$ ( I-ISTOP+13 ) ) THEN
1571.LT..AND.
IF( ( KISTOP ) ( MOD( K-1,
1572.LT.
$ HBL )HBL-2 ) ) THEN
1573 ITMP1 = MIN( ISTART+1, I ) - 1
1575.LT.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1576 ITMP1 = MIN( K+3, I )
1578.EQ.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1579 ITMP1 = MAX( I1, K-1 ) - 1
1581.EQ.
IF( MOD( K-1, HBL )HBL-1 ) THEN
1582 ITMP1 = MAX( I1, K-2 ) - 1
1587 CALL INFOG1L( I1, HBL, NPROW, MYROW, DESCA(RSRC_),
1589 IROW2 = NUMROC( ITMP1, HBL, MYROW,DESCA(RSRC_),NPROW )
1590.LE.
IF( IROW1IROW2 ) THEN
1595 CALL SLAREF( 'col
', A, LDA, WANTZ, Z, LDZ, .TRUE.,
1596 $ ICOL1, ICOL1, ISTART, ISTOP, IROW1,
1597 $ IROW2, LILOZ, LIHIZ, WORK( VECSIDX+1 ),
1598 $ V2, V3, T1, T2, T3 )
1600.LT.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1604.LT.
IF( MOD( K-1, HBL )HBL-3 ) THEN
1606.EQ.
IF( MOD( ( ITMP1 / HBL ), NPROW )MYROW )
1608.GT.
IF( ITMP20 ) THEN
1609 IROW2 = ITMP2 + MIN( K+3, I ) - ITMP1
1617 CALL INFOG1L( ITMP1+1, HBL, NPROW, MYROW,
1618 $ DESCA(RSRC_),IROW1, IROW2 )
1619 IROW2 = NUMROC( MIN( K+3, I ), HBL, MYROW,
1620 $ DESCA(RSRC_), NPROW )
1622 V2 = WORK( VECSIDX+( K-1 )*3+1 )
1623 V3 = WORK( VECSIDX+( K-1 )*3+2 )
1624 T1 = WORK( VECSIDX+( K-1 )*3+3 )
1627 ICOL1 = KCOL( KI ) + ISTOP - ISTART
1628 CALL SLAREF( 'col
', A, LDA, .FALSE., Z, LDZ,
1629 $ .FALSE., ICOL1, ICOL1, ISTART, ISTOP,
1630 $ IROW1, IROW2, LILOZ, LIHIZ,
1631 $ WORK( VECSIDX+1 ), V2, V3, T1, T2,
1637 DO 320 KI = 1, IBULGE
1638.GT.
IF( KCOL( KI )KP2COL( KI ) )
1640.NE..AND.
IF( ( MYCOLICURCOL( KI ) )
1641.NE.
$ ( RIGHTICURCOL( KI ) ) )GO TO 320
1642 ISTART = MAX( K1( KI ), M )
1643 ISTOP = MIN( K2( KI ), I-1 )
1644.GE.
IF( MOD( ISTART-1, HBL )HBL-2 ) THEN
1656 DO 310 K = ISTART, ISTOP
1658 V2 = WORK( VECSIDX+( K-1 )*3+1 )
1659 V3 = WORK( VECSIDX+( K-1 )*3+2 )
1660 T1 = WORK( VECSIDX+( K-1 )*3+3 )
1661 NR = MIN( 3, I-K+1 )
1662.EQ..AND..LE.
IF( ( NR3 ) ( KCOL( KI )KP2COL( KI ) ) )
1665.LT..AND.
IF( ( KISTOP )
1666.LT.
$ ( MOD( K-1, HBL )HBL-2 ) ) THEN
1667 ITMP1 = MIN( ISTART+1, I ) - 1
1669.LT.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1670 ITMP1 = MIN( K+3, I )
1672.EQ.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1673 ITMP1 = MAX( I1, K-1 ) - 1
1675.EQ.
IF( MOD( K-1, HBL )HBL-1 ) THEN
1676 ITMP1 = MAX( I1, K-2 ) - 1
1679 ICOL1 = KCOL( KI ) + K - ISTART
1680 ICOL2 = KP2COL( KI ) + K - ISTART
1681 CALL INFOG1L( I1, HBL, NPROW, MYROW, DESCA(RSRC_),
1683 IROW2 = NUMROC( ITMP1, HBL, MYROW, DESCA(RSRC_),
1685.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-2 )
1686.GT.
$ ( NPCOL1 ) ) THEN
1687.EQ.
IF( ICOL1ICOL2 ) THEN
1688 CALL SGESD2D( CONTXT, IROW2-IROW1+1, 1,
1689 $ A( ( ICOL1-1 )*LDA+IROW1 ),
1690 $ LDA, MYROW, LEFT )
1691 CALL SGERV2D( CONTXT, IROW2-IROW1+1, 1,
1692 $ A( ( ICOL1-1 )*LDA+IROW1 ),
1693 $ LDA, MYROW, LEFT )
1695 CALL SGERV2D( CONTXT, IROW2-IROW1+1, 1,
1696 $ WORK( ICBUF+1 ), IROW2-IROW1+1,
1700 DO 270 J = IROW1, IROW2
1701 SUM = A( ( ICOL1-1 )*LDA+J ) +
1702 $ V2*A( ICOL1*LDA+J ) +
1703 $ V3*WORK( ICBUF+J-IROW1+1 )
1704 A( ( ICOL1-1 )*LDA+J ) = A( ( ICOL1-1 )*
1706 A( ICOL1*LDA+J ) = A( ICOL1*LDA+J ) -
1708 WORK( ICBUF+J-IROW1+1 ) = WORK( ICBUF+J-
1709 $ IROW1+1 ) - SUM*T3
1711 CALL SGESD2D( CONTXT, IROW2-IROW1+1, 1,
1712 $ WORK( ICBUF+1 ), IROW2-IROW1+1,
1716.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-1 )
1717.GT.
$ ( NPCOL1 ) ) THEN
1718.EQ.
IF( ICOL1ICOL2 ) THEN
1719 CALL SGESD2D( CONTXT, IROW2-IROW1+1, 1,
1720 $ A( ( ICOL1-1 )*LDA+IROW1 ),
1721 $ LDA, MYROW, RIGHT )
1722 CALL SGERV2D( CONTXT, IROW2-IROW1+1, 1,
1723 $ A( ( ICOL1-1 )*LDA+IROW1 ),
1724 $ LDA, MYROW, RIGHT )
1726 CALL SGERV2D( CONTXT, IROW2-IROW1+1, 1,
1727 $ WORK( ICBUF+1 ), IROW2-IROW1+1,
1731 DO 280 J = IROW1, IROW2
1732 SUM = WORK( ICBUF+J-IROW1+1 ) +
1733 $ V2*A( ( ICOL1-1 )*LDA+J ) +
1734 $ V3*A( ICOL1*LDA+J )
1735 WORK( ICBUF+J-IROW1+1 ) = WORK( ICBUF+J-
1736 $ IROW1+1 ) - SUM*T1
1737 A( ( ICOL1-1 )*LDA+J ) = A( ( ICOL1-1 )*
1739 A( ICOL1*LDA+J ) = A( ICOL1*LDA+J ) -
1742 CALL SGESD2D( CONTXT, IROW2-IROW1+1, 1,
1743 $ WORK( ICBUF+1 ), IROW2-IROW1+1,
1749.AND.
IF( ( WANTZ ) ( MOD( K-1,
1750.GE..AND..GT.
$ HBL )HBL-2 ) ( NPCOL1 ) ) THEN
1756.EQ.
IF( MOD( K-1, HBL )HBL-2 ) THEN
1757.EQ.
IF( ICOL1ICOL2 ) THEN
1758 CALL SGESD2D( CONTXT, IROW2-IROW1+1, 1,
1759 $ Z( ( ICOL1-1 )*LDZ+IROW1 ),
1760 $ LDZ, MYROW, LEFT )
1761 CALL SGERV2D( CONTXT, IROW2-IROW1+1, 1,
1762 $ Z( ( ICOL1-1 )*LDZ+IROW1 ),
1763 $ LDZ, MYROW, LEFT )
1765 CALL SGERV2D( CONTXT, IROW2-IROW1+1, 1,
1767 $ IROW2-IROW1+1, MYROW,
1771 ICOL1 = ( ICOL1-1 )*LDZ
1772 DO 290 J = IROW1, IROW2
1773 SUM = Z( ICOL1+J ) +
1774 $ V2*Z( ICOL1+J+LDZ ) +
1775 $ V3*WORK( ICBUF+J-IROW1+1 )
1776 Z( J+ICOL1 ) = Z( J+ICOL1 ) - SUM*T1
1777 Z( J+ICOL1+LDZ ) = Z( J+ICOL1+LDZ ) -
1779 WORK( ICBUF+J-IROW1+1 ) = WORK( ICBUF+
1780 $ J-IROW1+1 ) - SUM*T3
1782 CALL SGESD2D( CONTXT, IROW2-IROW1+1, 1,
1784 $ IROW2-IROW1+1, MYROW,
1788.EQ.
IF( MOD( K-1, HBL )HBL-1 ) THEN
1789.EQ.
IF( ICOL1ICOL2 ) THEN
1790 CALL SGESD2D( CONTXT, IROW2-IROW1+1, 1,
1791 $ Z( ( ICOL1-1 )*LDZ+IROW1 ),
1792 $ LDZ, MYROW, RIGHT )
1793 CALL SGERV2D( CONTXT, IROW2-IROW1+1, 1,
1794 $ Z( ( ICOL1-1 )*LDZ+IROW1 ),
1795 $ LDZ, MYROW, RIGHT )
1797 CALL SGERV2D( CONTXT, IROW2-IROW1+1, 1,
1799 $ IROW2-IROW1+1, MYROW, LEFT )
1802 ICOL1 = ( ICOL1-1 )*LDZ
1803 DO 300 J = IROW1, IROW2
1804 SUM = WORK( ICBUF+J-IROW1+1 ) +
1806 $ V3*Z( J+ICOL1+LDZ )
1807 WORK( ICBUF+J-IROW1+1 ) = WORK( ICBUF+
1808 $ J-IROW1+1 ) - SUM*T1
1809 Z( J+ICOL1 ) = Z( J+ICOL1 ) - SUM*T2
1810 Z( J+ICOL1+LDZ ) = Z( J+ICOL1+LDZ ) -
1813 CALL SGESD2D( CONTXT, IROW2-IROW1+1, 1,
1815 $ IROW2-IROW1+1, MYROW, LEFT )
1819.EQ.
IF( ICURCOL( KI )MYCOL ) THEN
1820.EQ..OR..EQ.
IF( ( ISPEC0 ) ( NPCOL1 ) ) THEN
1821 LOCALK2( KI ) = LOCALK2( KI ) + 1
1824.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-1 )
1825.EQ.
$ ( ICURCOL( KI )RIGHT ) ) THEN
1827 LOCALK2( KI ) = LOCALK2( KI ) + 2
1829 LOCALK2( KI ) = LOCALK2( KI ) + 1
1832.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-2 )
1833.EQ..AND..EQ.
$ ( I-K2 ) ( ICURCOL( KI )
1835 LOCALK2( KI ) = LOCALK2( KI ) + 2
1848 DO 410 KI = 1, IBULGE
1849 ISTART = MAX( K1( KI ), M )
1850 ISTOP = MIN( K2( KI ), I-1 )
1851.GE.
IF( MOD( ISTART-1, HBL )HBL-2 ) THEN
1863 DO 400 K = ISTART, ISTOP
1865 V2 = WORK( VECSIDX+( K-1 )*3+1 )
1866 V3 = WORK( VECSIDX+( K-1 )*3+2 )
1867 T1 = WORK( VECSIDX+( K-1 )*3+3 )
1868 NR = MIN( 3, I-K+1 )
1870.EQ.
IF ( ICURROW( KI )MYROW ) THEN
1873.EQ.
IF ( ICURCOL( KI )MYCOL ) THEN
1880 CALL INFOG1L( K, HBL, NPCOL, MYCOL, DESCA(CSRC_),
1882 LIHIH = NUMROC( I2, HBL, MYCOL, DESCA(CSRC_),NPCOL)
1883 CALL INFOG1L( 1, HBL, NPROW, MYROW, DESCA(RSRC_),
1885 ITMP1 = NUMROC( K+1,HBL, MYROW,DESCA(RSRC_),NPROW )
1886.EQ.
IF( ICURROW( KI )MYROW ) THEN
1887.EQ..OR..EQ..OR.
IF( ( ISPEC0 ) ( NPROW1 )
1888.EQ.
$ ( MOD( K-1, HBL )HBL-2 ) ) THEN
1890 DO 340 J = ( LILOH-1 )*LDA,
1891 $ ( LIHIH-1 )*LDA, LDA
1892 SUM = A( ITMP1+J ) + V2*A( ITMP1+1+J )
1893 A( ITMP1+J ) = A( ITMP1+J ) - SUM*T1
1894 A( ITMP1+1+J ) = A( ITMP1+1+J ) - SUM*T2
1897.EQ.
IF( MOD( K-1, HBL )HBL-1 ) THEN
1898 CALL SGERV2D( CONTXT, 1, LIHIH-LILOH+1,
1899 $ WORK( IRBUF+1 ), 1, UP,
1901 DO 350 J = LILOH, LIHIH
1902 SUM = WORK( IRBUF+J-LILOH+1 ) +
1903 $ V2*A( ( J-1 )*LDA+ITMP1 )
1904 WORK( IRBUF+J-LILOH+1 ) = WORK( IRBUF+
1905 $ J-LILOH+1 ) - SUM*T1
1906 A( ( J-1 )*LDA+ITMP1 ) = A( ( J-1 )*
1907 $ LDA+ITMP1 ) - SUM*T2
1909 CALL SGESD2D( CONTXT, 1, LIHIH-LILOH+1,
1910 $ WORK( IRBUF+1 ), 1, UP,
1915.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-1 )
1916.EQ.
$ ( ICURROW( KI )DOWN ) ) THEN
1917 CALL SGESD2D( CONTXT, 1, LIHIH-LILOH+1,
1918 $ A( ( LILOH-1 )*LDA+ITMP1 ),
1919 $ LDA, DOWN, MYCOL )
1920 CALL SGERV2D( CONTXT, 1, LIHIH-LILOH+1,
1921 $ A( ( LILOH-1 )*LDA+ITMP1 ),
1922 $ LDA, DOWN, MYCOL )
1929 CALL INFOG1L( I1, HBL, NPROW, MYROW, DESCA(RSRC_),
1931 LIHIH = NUMROC( I, HBL, MYROW, DESCA(RSRC_),NPROW )
1933.EQ.
IF( ICURCOL( KI )MYCOL ) THEN
1935.EQ..OR..EQ..OR.
IF( ( ISPEC0 ) ( NPCOL1 )
1936.EQ.
$ ( MOD( K-1, HBL )HBL-2 ) ) THEN
1937 CALL INFOG1L( K, HBL, NPCOL, MYCOL,
1938 $ DESCA(CSRC_), ITMP1,ITMP2 )
1939 ITMP2 = NUMROC(K+1,HBL,MYCOL,DESCA(CSRC_),
1941 DO 360 J = LILOH, LIHIH
1942 SUM = A( ( ITMP1-1 )*LDA+J ) +
1943 $ V2*A( ITMP1*LDA+J )
1944 A( ( ITMP1-1 )*LDA+J ) = A( ( ITMP1-1 )*
1946 A( ITMP1*LDA+J ) = A( ITMP1*LDA+J ) -
1950 ITMP1 = LOCALK2( KI )
1951.EQ.
IF( MOD( K-1, HBL )HBL-1 ) THEN
1952 CALL SGERV2D( CONTXT, LIHIH-LILOH+1, 1,
1954 $ LIHIH-LILOH+1, MYROW, LEFT )
1955 DO 370 J = LILOH, LIHIH
1956 SUM = WORK( ICBUF+J ) +
1957 $ V2*A( ( ITMP1-1 )*LDA+J )
1958 WORK( ICBUF+J ) = WORK( ICBUF+J ) -
1960 A( ( ITMP1-1 )*LDA+J )
1961 $ = A( ( ITMP1-1 )*LDA+J ) - SUM*T2
1963 CALL SGESD2D( CONTXT, LIHIH-LILOH+1, 1,
1965 $ LIHIH-LILOH+1, MYROW, LEFT )
1969.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-1 )
1970.EQ.
$ ( ICURCOL( KI )RIGHT ) ) THEN
1972 CALL SGESD2D( CONTXT, LIHIH-LILOH+1, 1,
1973 $ A( ( ITMP1-1 )*LDA+LILOH ),
1974 $ LDA, MYROW, RIGHT )
1975 CALL INFOG1L( K, HBL, NPCOL, MYCOL,
1976 $ DESCA(CSRC_), ITMP1, ITMP2 )
1977 ITMP2 = NUMROC( K+1, HBL, MYCOL,
1978 $ DESCA(CSRC_), NPCOL )
1979 CALL SGERV2D( CONTXT, LIHIH-LILOH+1, 1,
1980 $ A( ( ITMP1-1 )*LDA+LILOH ),
1981 $ LDA, MYROW, RIGHT )
1989.EQ.
IF( ICURCOL( KI )MYCOL ) THEN
1991.EQ..OR..EQ..OR.
IF( ( ISPEC0 ) ( NPCOL1 )
1992.EQ.
$ ( MOD( K-1, HBL )HBL-2 ) ) THEN
1993 ITMP1 = KCOL( KI ) + K - ISTART
1994 ITMP1 = ( ITMP1-1 )*LDZ
1995 DO 380 J = LILOZ, LIHIZ
1996 SUM = Z( J+ITMP1 ) +
1997 $ V2*Z( J+ITMP1+LDZ )
1998 Z( J+ITMP1 ) = Z( J+ITMP1 ) - SUM*T1
1999 Z( J+ITMP1+LDZ ) = Z( J+ITMP1+LDZ ) -
2002 LOCALK2( KI ) = LOCALK2( KI ) + 1
2004 ITMP1 = LOCALK2( KI )
2006.EQ.
IF( MOD( K-1, HBL )HBL-1 ) THEN
2007 CALL SGERV2D( CONTXT, LIHIZ-LILOZ+1, 1,
2008 $ WORK( ICBUF+1 ), LDZ,
2010 ITMP1 = ( ITMP1-1 )*LDZ
2011 DO 390 J = LILOZ, LIHIZ
2012 SUM = WORK( ICBUF+J ) +
2014 WORK( ICBUF+J ) = WORK( ICBUF+J ) -
2016 Z( J+ITMP1 ) = Z( J+ITMP1 ) - SUM*T2
2018 CALL SGESD2D( CONTXT, LIHIZ-LILOZ+1, 1,
2019 $ WORK( ICBUF+1 ), LDZ,
2021 LOCALK2( KI ) = LOCALK2( KI ) + 1
2028.EQ..AND.
IF( ( MOD( K-1, HBL )HBL-1 )
2029.EQ.
$ ( ICURCOL( KI )RIGHT ) ) THEN
2031 ITMP1 = ( ITMP1-1 )*LDZ
2032 CALL SGESD2D( CONTXT, LIHIZ-LILOZ+1, 1,
2033 $ Z( LILOZ+ITMP1 ), LDZ,
2035 CALL SGERV2D( CONTXT, LIHIZ-LILOZ+1, 1,
2036 $ Z( LILOZ+ITMP1 ), LDZ,
2038 LOCALK2( KI ) = LOCALK2( KI ) + 1
2047.EQ.
IF( NPROW1 ) THEN
2048 KROW( KI ) = KROW( KI ) + K2( KI ) - K1( KI ) + 1
2049 KP2ROW( KI ) = KP2ROW( KI ) + K2( KI ) - K1( KI ) + 1
2051.LT..AND.
IF( ( MOD( K1( KI )-1, HBL )HBL-2 )
2052.EQ..AND..GT.
$ ( ICURROW( KI )MYROW ) ( NPROW1 ) )
2054 KROW( KI ) = KROW( KI ) + K2( KI ) - K1( KI ) + 1
2056.LT..AND.
IF( ( MOD( K2( KI ), HBL )HBL-2 )
2057.EQ..AND..GT.
$ ( ICURROW( KI )MYROW ) ( NPROW1 ) )
2059 KP2ROW( KI ) = KP2ROW( KI ) + K2( KI ) - K1( KI ) + 1
2061.GE..AND.
IF( ( MOD( K1( KI )-1, HBL )HBL-2 )
2062.EQ..OR..EQ.
$ ( ( MYROWICURROW( KI ) ) ( DOWN
2063.AND..GT.
$ ICURROW( KI ) ) ) ( NPROW1 ) ) THEN
2064 CALL INFOG1L( K2( KI )+1, HBL, NPROW, MYROW,
2065 $ DESCA(RSRC_), KROW( KI ), ITMP2 )
2066 ITMP2 = NUMROC( N, HBL, MYROW, DESCA(RSRC_), NPROW )
2068.GE..AND.
IF( ( MOD( K2( KI ), HBL )HBL-2 )
2069.EQ..OR..EQ.
$ ( ( MYROWICURROW( KI ) ) ( UP
2070.AND..GT.
$ ICURROW( KI ) ) ) ( NPROW1 ) ) THEN
2071 CALL INFOG1L( 1, HBL, NPROW, MYROW, DESCA(RSRC_),
2072 $ ITMP2,KP2ROW( KI ) )
2073 KP2ROW( KI ) = NUMROC( K2( KI )+3, HBL, MYROW,
2074 $ DESCA(RSRC_), NPROW )
2076.EQ.
IF( NPCOL1 ) THEN
2077 KCOL( KI ) = KCOL( KI ) + K2( KI ) - K1( KI ) + 1
2078 KP2COL( KI ) = KP2COL( KI ) + K2( KI ) - K1( KI ) + 1
2080.LT..AND.
IF( ( MOD( K1( KI )-1, HBL )HBL-2 )
2081.EQ..AND..GT.
$ ( ICURCOL( KI )MYCOL ) ( NPCOL1 ) )
2083 KCOL( KI ) = KCOL( KI ) + K2( KI ) - K1( KI ) + 1
2085.LT..AND.
IF( ( MOD( K2( KI ), HBL )HBL-2 )
2086.EQ..AND..GT.
$ ( ICURCOL( KI )MYCOL ) ( NPCOL1 ) )
2088 KP2COL( KI ) = KP2COL( KI ) + K2( KI ) - K1( KI ) + 1
2090.GE..AND.
IF( ( MOD( K1( KI )-1, HBL )HBL-2 )
2091.EQ..OR..EQ.
$ ( ( MYCOLICURCOL( KI ) ) ( RIGHT
2092.AND..GT.
$ ICURCOL( KI ) ) ) ( NPCOL1 ) ) THEN
2093 CALL INFOG1L( K2( KI )+1, HBL, NPCOL, MYCOL,
2094 $ DESCA(CSRC_), KCOL( KI ), ITMP2 )
2095 ITMP2 = NUMROC( N, HBL, MYCOL, DESCA(CSRC_), NPCOL )
2097.GE..AND.
IF( ( MOD( K2( KI ), HBL )HBL-2 )
2098.EQ..OR..EQ.
$ ( ( MYCOLICURCOL( KI ) ) ( LEFT
2099.AND..GT.
$ ICURCOL( KI ) ) ) ( NPCOL1 ) ) THEN
2100 CALL INFOG1L( 1, HBL, NPCOL, MYCOL,DESCA(CSRC_),ITMP2,
2102 KP2COL( KI ) = NUMROC( K2( KI )+3, HBL, MYCOL,
2103 $ DESCA(CSRC_), NPCOL )
2105 K1( KI ) = K2( KI ) + 1
2106 ISTOP = MIN( K1( KI )+ROTN-MOD( K1( KI ), ROTN ), I-2 )
2107 ISTOP = MIN( ISTOP, K1( KI )+HBL-3-
2108 $ MOD( K1( KI )-1, HBL ) )
2109 ISTOP = MIN( ISTOP, I2-2 )
2110 ISTOP = MAX( ISTOP, K1( KI ) )
2113.EQ.
IF( K1( KI )ISTOP ) THEN
2114.EQ..AND.
IF( ( MOD( ISTOP-1, HBL )HBL-2 )
2115.GT.
$ ( I-ISTOP1 ) ) THEN
2119 ICURROW( KI ) = MOD( ICURROW( KI )+1, NPROW )
2120 ICURCOL( KI ) = MOD( ICURCOL( KI )+1, NPCOL )
2124.LE.
IF( K2( IBULGE )I-1 )
2133 WORK( 1 ) = FLOAT( LWKOPT )
2142 CALL INFOG2L( I, I, DESCA, NPROW, NPCOL, MYROW, MYCOL, IROW,
2143 $ ICOL, ITMP1, ITMP2 )
2144.EQ..AND..EQ.
IF( ( MYROWITMP1 ) ( MYCOLITMP2 ) ) THEN
2145 WR( I ) = A( ( ICOL-1 )*LDA+IROW )
2150.EQ.
ELSE IF( LI-1 ) THEN
2154 CALL PSELGET( 'all
', ' ', H11, A, L, L, DESCA )
2155 CALL PSELGET( 'all
', ' ', H21, A, I, L, DESCA )
2156 CALL PSELGET( 'all
', ' ', H12, A, L, I, DESCA )
2157 CALL PSELGET( 'all
', ' ', H22, A, I, I, DESCA )
2158 CALL SLANV2( H11, H12, H21, H22, WR( L ), WI( L ), WR( I ),
2160 CALL PSELSET( A, L, L, DESCA, H11 )
2161 CALL PSELSET( A, I, L, DESCA, H21 )
2162 CALL PSELSET( A, L, I, DESCA, H12 )
2163 CALL PSELSET( A, I, I, DESCA, H22 )
2168.LT.
IF(I N) CALL PSROT( N-I, A, L, I+1, DESCA, DESCA( M_ ),
2169 $ A, I, I+1, DESCA, DESCA( M_ ), CS,
2170 $ SN, WORK( VECSIDX+1 ),
2171 $ LWORK-VECSIDX, IERR )
2176.GT.
IF (L LTOP) CALL PSROT( L-LTOP, A, LTOP, L, DESCA, 1, A,
2177 $ LTOP, I, DESCA, 1, CS, SN,
2178 $ WORK( VECSIDX+1 ), LWORK-VECSIDX,
2181 CALL PSROT( IHIZ-ILOZ+1, Z, ILOZ, L, DESCZ, 1, Z, ILOZ, I,
2182 $ DESCZ, 1, CS, SN, WORK( VECSIDX+1 ),
2183 $ LWORK-VECSIDX, IERR )
2185.NE.
IF( NODE 0 ) THEN
2196.LE.
IF( NH LDS ) THEN
2197 CALL PSLAQR4( WANTT, WANTZ, N, L, I, A, DESCA, WR, WI,
2198 $ ILOZ, IHIZ, Z, DESCZ, WORK( S1+1 ), NH,
2199 $ WORK( S2+1 ), NH, WORK( S3+1 ), 4*LDS*LDS,
2201.NE.
IF( INFO0 ) THEN
2202 WORK( 1 ) = FLOAT( LWKOPT )
2205.NE.
IF( NODE0 ) THEN
2221.EQ.
IF( ML-10 ) THEN
2232 CALL SGSUM2D( CONTXT, 'all
', ' ', IHI-ILO+1, 1, WR(ILO), N,
2234 CALL SGSUM2D( CONTXT, 'all
', ' ', IHI-ILO+1, 1, WI(ILO), N,
2238 WORK( 1 ) = FLOAT( LWKOPT )