1 SUBROUTINE pdstein( N, D, E, M, W, IBLOCK, ISPLIT, ORFAC, Z, IZ,
2 $ JZ, DESCZ, WORK, LWORK, IWORK, LIWORK, IFAIL,
11 INTEGER INFO, IZ, JZ, LIWORK, LWORK, M, N
12 DOUBLE PRECISION ORFAC
15 INTEGER DESCZ( * ), IBLOCK( * ), ICLUSTR( * ),
16 $ IFAIL( * ), ISPLIT( * ), IWORK( * )
17 DOUBLE PRECISION D( * ), E( * ), GAP( * ), W( * ), WORK( * )
264 INTRINSIC abs, dble,
max,
min, mod
267 INTEGER ICEIL, NUMROC
268 EXTERNAL ICEIL, NUMROC
276 INTEGER BLOCK_CYCLIC_2D, DLEN_, DTYPE_, , M_, N_,
277 $ MB_, NB_, RSRC_, CSRC_, LLD_
278 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
279 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
280 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
281 DOUBLE PRECISION ZERO, NEGONE, ODM1, FIVE, ODM3, ODM18
282 PARAMETER ( ZERO = 0.0d+0, negone = -1.0d+0,
283 $ odm1 = 1.0d-1, five = 5.0d+0, odm3 = 1.0d-3,
287 LOGICAL LQUERY, SORTED
288 INTEGER B1, BN, BNDRY, CLSIZ, COL, I, IFIRST, IINFO,
289 $ ilast, im, indrw, itmp, j, k, lgclsiz, llwork,
290 $ load, locinfo, maxvec, mq00, mycol, myrow,
291 $ nblk, nerr, next, np00, npcol, nprow, nvs,
292 $ olnblk, p, row, self, till, toterr
293 DOUBLE PRECISION DIFF, MINGAP, ONENRM, ORGFAC, ORTOL, TMPFAC
296 INTEGER IDUM1( 1 ), IDUM2( 1 )
300 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
304 self = myrow*npcol + mycol
309 IF( nprow.EQ.-1 )
THEN
310 info = -( 1200+ctxt_ )
315 CALL chk1mat( n, 1, n, 1, iz, jz, descz, 12, info )
321 np00 = numroc( n, descz( mb_ ), 0, 0, nprow )
322 mq00 = numroc( m, descz( nb_ ), 0, 0, npcol )
328 CALL igamn2d( descz( ctxt_ ),
'A', '
', 1, 1, LLWORK, 1, 1,
330 INDRW = MAX( 5*N, NP00*MQ00 )
332 $ MAXVEC = ( LLWORK-INDRW ) / N
334.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
336 CALL DGEBS2D( DESCZ( CTXT_ ), 'all
', ' ', 1, 1, TMPFAC,
339 CALL DGEBR2D( DESCZ( CTXT_ ), 'all
', ' ', 1, 1, TMPFAC,
343.EQ..OR..EQ.
LQUERY = ( LWORK-1 LIWORK-1 )
344.LT..OR..GT.
IF( M0 MN ) THEN
346.LT..AND..NOT.
ELSE IF( MAXVECLOAD LQUERY ) THEN
348.LT..AND..NOT.
ELSE IF( LIWORK3*N+P+1 LQUERY ) THEN
352.LT.
IF( IBLOCK( I )IBLOCK( I-1 ) ) THEN
356.EQ..AND..LT.
IF( IBLOCK( I )IBLOCK( I-1 ) W( I )
364.GT.
IF( ABS( TMPFAC-ORFAC )FIVE*ABS( TMPFAC ) )
372 CALL PCHK1MAT( N, 1, N, 1, IZ, JZ, DESCZ, 12, 1, IDUM1, IDUM2,
374 WORK( 1 ) = DBLE( MAX( 5*N, NP00*MQ00 )+ICEIL( M, P )*N )
375 IWORK( 1 ) = 3*N + P + 1
378 CALL PXERBLA( DESCZ( CTXT_ ), 'pdstein', -INFO )
380.EQ..OR..EQ.
ELSE IF( LWORK-1 LIWORK-1 ) THEN
399.EQ..OR..EQ.
IF( N0 M0 )
402.GE.
IF( ORFACZERO ) THEN
412.EQ.
IF( MOD( M, LOAD )0 )
419 DO 100 I = 0, ILAST - 1
423 NBLK = IBLOCK( NEXT )
424.EQ..AND..NE.
IF( NBLKIBLOCK( NEXT-1 ) NBLKOLNBLK ) THEN
431 B1 = ISPLIT( NBLK-1 ) + 1
435 ONENRM = ABS( D( B1 ) ) + ABS( E( B1 ) )
436 ONENRM = MAX( ONENRM, ABS( D( BN ) )+ABS( E( BN-1 ) ) )
437 DO 60 J = B1 + 1, BN - 1
438 ONENRM = MAX( ONENRM, ABS( D( J ) )+ABS( E( J-1 ) )+
446.GT.
IF( TMPFACODM18 ) THEN
447 ORTOL = TMPFAC*ONENRM
448 DO 80 J = NEXT - 1, MIN( TILL, M-1 )
449.NE..OR.
IF( IBLOCK( J+1 )IBLOCK( J ) W( J+1 )-
450.GE.
$ W( J )ORTOL ) THEN
454.EQ..AND..GE.
IF( JM TILLM )
463 $ IM = MAX( 0, J-NVS )
470 IWORK( ILAST+1 ) = NVS
471 DO 110 I = ILAST + 2, P + 1
482.NE.
IF( IBLOCK( I )NBLK ) THEN
487 B1 = ISPLIT( NBLK-1 ) + 1
491 ONENRM = ABS( D( B1 ) ) + ABS( E( B1 ) )
492 ONENRM = MAX( ONENRM, ABS( D( BN ) )+ABS( E( BN-1 ) ) )
493 DO 120 J = B1 + 1, BN - 1
494 ONENRM = MAX( ONENRM, ABS( D( J ) )+ABS( E( J-1 ) )+
500 DIFF = W( I ) - W( I-1 )
501.NE..OR..EQ..OR..GT.
IF( IBLOCK( I )IBLOCK( I-1 ) IM DIFF
502 $ ORGFAC*ONENRM ) THEN
505.NE..OR..GT.
IF( IBLOCK( M )IBLOCK( M-1 ) DIFFORGFAC*
514 CLSIZ = ILAST - IFIRST
515.GT.
IF( CLSIZ1 ) THEN
516.LT.
IF( LGCLSIZCLSIZ )
522.GT..AND..LT.
IF( IWORK( BNDRY )IFIRST IWORK( BNDRY )
524 MINGAP = MIN( W( IWORK( BNDRY )+1 )-
525 $ W( IWORK( BNDRY ) ), MINGAP )
526.GE.
ELSE IF( IWORK( BNDRY )ILAST ) THEN
527.LT.
IF( MINGAPONENRM ) THEN
528 ICLUSTR( 2*K-1 ) = IFIRST + 1
529 ICLUSTR( 2*K ) = ILAST
530 GAP( K ) = MINGAP / ONENRM
542 INFO = ( K-1 )*( M+1 )
546 CALL DSTEIN2( N, D, E, IM, W( IWORK( SELF+1 )+1 ),
547 $ IBLOCK( IWORK( SELF+1 )+1 ), ISPLIT, ORGFAC,
548 $ WORK( INDRW+1 ), N, WORK, IWORK( P+2 ),
549 $ IFAIL( IWORK( SELF+1 )+1 ), LOCINFO )
559 CALL DLASRT2( 'i
', M, W, IWORK( P+2 ), IINFO )
562 IWORK( M+P+1+IWORK( P+1+I ) ) = I
566 DO 180 I = 1, LOCINFO
567 ITMP = IWORK( SELF+1 ) + I
568 IFAIL( ITMP ) = IFAIL( ITMP ) + ITMP - I
569 IFAIL( ITMP ) = IWORK( M+P+1+IFAIL( ITMP ) )
573 ICLUSTR( 2*I-1 ) = IWORK( M+P+1+ICLUSTR( 2*I-1 ) )
574 ICLUSTR( 2*I ) = IWORK( M+P+1+ICLUSTR( 2*I ) )
583.EQ.
IF( SELFI-1 ) THEN
584 CALL IGEBS2D( DESCZ( CTXT_ ), 'all
', ' ', 1, 1, LOCINFO, 1 )
585.NE.
IF( LOCINFO0 ) THEN
586 CALL IGEBS2D( DESCZ( CTXT_ ), 'all
', ' ', LOCINFO, 1,
587 $ IFAIL( IWORK( I )+1 ), LOCINFO )
588 DO 200 J = 1, LOCINFO
589 IFAIL( TOTERR+J ) = IFAIL( IWORK( I )+J )
591 TOTERR = TOTERR + LOCINFO
595 ROW = ( I-1 ) / NPCOL
596 COL = MOD( I-1, NPCOL )
598 CALL IGEBR2D( DESCZ( CTXT_ ), 'all
', ' ', 1, 1, NERR, 1,
601 CALL IGEBR2D( DESCZ( CTXT_ ), 'all
', ' ', NERR, 1,
602 $ IFAIL( TOTERR+1 ), NERR, ROW, COL )
603 TOTERR = TOTERR + NERR
610 CALL PDLAEVSWP( N, WORK( INDRW+1 ), N, Z, IZ, JZ, DESCZ, IWORK,
611 $ IWORK( M+P+2 ), WORK, INDRW )
614 IWORK( I ) = IWORK( M+P+1+IWORK( I ) )
624.GT.
IF( IWORK( I )IWORK( I+1 ) ) THEN
626 IWORK( I+1 ) = IWORK( I )
634 DO 250 I = P + 1, 1, -1
635 IWORK( I+1 ) = IWORK( I )
638 WORK( 1 ) = ( LGCLSIZ+LOAD-1 )*N + INDRW
639 IWORK( 1 ) = 3*N + P + 1
subroutine pdstein(n, d, e, m, w, iblock, isplit, orfac, z, iz, jz, descz, work, lwork, iwork, liwork, ifail, iclustr, gap, info)