1 SUBROUTINE pslaed2( ICTXT, K, N, N1, NB, D, DROW, DCOL, Q, LDQ,
2 $ RHO, Z, W, DLAMDA, Q2, LDQ2, QBUF, CTOT, PSM,
3 $ NPCOL, INDX, INDXC, INDXP, INDCOL, COLTYP, NN,
12 INTEGER DCOL, DROW, IB1, IB2, ICTXT, K, LDQ, LDQ2, N,
13 $ N1, NB, NN, NN1, NN2, NPCOL
17 INTEGER COLTYP( * ), CTOT( 0: NPCOL-1, 4 ),
18 $ INDCOL( N ), INDX( * ), INDXC( * ), INDXP( * ),
19 $ PSM( 0: NPCOL-1, 4 )
20 REAL D( * ), DLAMDA( * ), Q( LDQ, * ),
21 $ Q2( LDQ2, * ), QBUF( * ), W( * ), Z( * )
152 REAL MONE, ZERO, ONE, TWO, EIGHT
153 PARAMETER ( MONE = -1.0e0, zero = 0.0e0, one = 1.0e0,
154 $ two = 2.0e0, eight = 8.0e0 )
157 INTEGER COL, CT, I, IAM, IE1, IE2, IMAX, INFO, J, JJQ2,
158 $ JJS, JMAX, JS, K2, MYCOL, MYROW, N1P1, N2, NJ,
159 $ NJCOL, NJJ, NP, NPROCS, NPROW, PJ, PJCOL, PJJ
160 REAL C, EPS, S, T, TAU, TOL
163 INTEGER INDXG2L, INDXL2G, ISAMAX, NUMROC
165 EXTERNAL INDXG2L, INDXL2G, ISAMAX, NUMROC, PSLAMCH,
169 EXTERNAL blacs_gridinfo, blacs_pinfo,
infog1l, scopy,
170 $ sgerv2d, sgesd2d,
slapst, srot, sscal
173 INTRINSIC abs,
max,
min, mod, sqrt
187 CALL blacs_pinfo( iam, nprocs )
188 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
189 np = numroc( n, nb, myrow, drow, nprow )
194 IF( rho.LT.zero )
THEN
195 CALL sscal( n2, mone, z( n1p1 ), 1 )
201 t = one / sqrt( two )
202 CALL sscal( n, t, z, 1 )
210 imax = isamax( n, z, 1 )
211 jmax = isamax( n, d, 1 )
212 eps = pslamch( ictxt,
'Epsilon' )
213 tol = eight*eps*
max( abs( d( jmax ) ), abs( z( imax ) ) )
219 IF( rho*abs( z( imax ) ).LE.tol )
THEN
231 CALL slapst(
'I', n, d, indx, info )
243 $ indcol( i+j ) = col
245 col = mod( col+1, npcol )
252 IF( rho*abs( z( nj ) ).LE.tol )
THEN
271 IF( rho*abs( z( nj ) ).LE.tol )
THEN
289 t = d( nj ) - d( pj )
292 IF( abs( t*c*s ).LE.tol )
THEN
298 IF( coltyp( nj ).NE.coltyp( pj ) )
301 CALL infog1l( nj, nb, npcol, mycol, dcol, njj, njcol )
302 CALL infog1l( pj, nb, npcol, mycol, dcol, pjj, pjcol )
303 IF( indcol( pj ).EQ.indcol( nj ) .AND. mycol.EQ.njcol )
THEN
304 CALL srot( np, q( 1, pjj ), 1, q( 1, njj ), 1, c, s )
305 ELSE IF( mycol.EQ.pjcol )
THEN
306 CALL sgesd2d( ictxt, np, 1, q( 1, pjj ), np, myrow,
308 CALL sgerv2d( ictxt, np, 1, qbuf, np, myrow, njcol )
309 CALL srot( np, q( 1, pjj ), 1, qbuf, 1, c, s )
310 ELSE IF( mycol.EQ.njcol )
THEN
311 CALL sgesd2d( ictxt, np, 1, q( 1, njj ), np, myrow,
313 CALL sgerv2d( ictxt, np, 1, qbuf, np, myrow, pjcol )
314 CALL srot( np, qbuf, 1, q( 1, njj ), 1, c, s )
316 t = d( pj )*c**2 + d( nj )*s**2
317 d( nj ) = d( pj )*s**2 + d( nj )*c**2
323 IF( d( pj ).LT.d( indxp( k2+i ) ) )
THEN
324 indxp( k2+i-1 ) = indxp( k2+i )
337 dlamda( k ) = d( pj )
349 dlamda( k ) = d( pj )
359 DO 90 i = 0, npcol - 1
367 ctot( col, ct ) = ctot( col, ct ) + 1
372 DO 120 col = 0, npcol - 1
374 psm( col, 2 ) = 1 + ctot( col, 1 )
375 psm( col, 3 ) = psm( col, 2 ) + ctot( col, 2 )
376 psm( col, 4 ) = psm( col, 3 ) + ctot( col, 3 )
381 DO 130 j = 0, npcol - 1
382 ct = ct + ctot( j, i-1 )
384 ptt( i ) = ptt( i-1 ) + ct
395 i = indxl2g( psm( col, ct ), nb, col, dcol, npcol )
397 indxc( ptt( ct ) ) = i
398 psm( col, ct ) = psm( col, ct ) + 1
399 ptt( ct ) = ptt( ct ) + 1
403 jjs = indxg2l( js, nb, j, j, npcol )
405 IF( col.EQ.mycol )
THEN
407 jjq2 = indxg2l( i, nb, j, j, npcol )
408 CALL scopy( np, q( 1, jjs ), 1, q2( 1, jjq2 ), 1 )
416 CALL scopy( n, d, 1, z, 1 )
426 DO 180 j = 0, npcol - 1
427 ct = ct + ctot( j, i-1 )
429 ptt( i ) = ptt( i-1 ) + ct
435 ib2 = indxc( ptt( 2 ) )
437 DO 200 i = 2, ptt( 3 ) - 1
438 ib1 =
min( ib1, indxc( i ) )
439 ie1 =
max( ie1, indxc( i ) )
441 DO 210 i = ptt( 2 ), ptt( 4 ) - 1
442 ib2 =
min( ib2, indxc( i ) )
443 ie2 =
max( ie2, indxc( i ) )
447 nn =
max( ie1, ie2 ) -
min( ib1, ib2 ) + 1
subroutine pslaed2(ictxt, k, n, n1, nb, d, drow, dcol, q, ldq, rho, z, w, dlamda, q2, ldq2, qbuf, ctot, psm, npcol, indx, indxc, indxp, indcol, coltyp, nn, nn1, nn2, ib1, ib2)