1 SUBROUTINE pdhseqr( JOB, COMPZ, N, ILO, IHI, H, DESCH, WR, WI, Z,
2 $ DESCZ, WORK, LWORK, IWORK, LIWORK, INFO )
15 INTEGER IHI, ILO, INFO, LWORK, LIWORK, N
19 INTEGER DESCH( * ) , DESCZ( * ), IWORK( * )
20 DOUBLE PRECISION H( * ), WI( N ), WORK( * ), ( N ), Z( * )
239 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
242 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
243 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
244 $ rsrc_ = 7, csrc_ = 8, lld_ = 9,
247 parameter( ntiny = 11 )
250 DOUBLE PRECISION ZERO, ONE
251 parameter( zero = 0.0d0, one = 1.0d0 )
254 INTEGER I, KBOT, NMIN, LLDH, LLDZ, ICTXT, NPROW, NPCOL,
255 $ myrow, mycol, hrows, hcols, ipw, nh, nb,
256 $ ii, jj, hrsrc, hcsrc, nprocs, iloc1, jloc1,
257 $ hrsrc1, hcsrc1, k, iloc2, jloc2, iloc3, jloc3,
258 $ iloc4, jloc4, hrsrc2, hcsrc2, hrsrc3, hcsrc3,
259 $ hrsrc4, hcsrc4, liwkopt
260 LOGICAL INITZ, LQUERY, WANTT, WANTZ, PAIR, BORDER
261 DOUBLE PRECISION TMP1, TMP2, TMP3, TMP4, DUM1, DUM2, DUM3,
262 $ dum4, elem1, elem4,
263 $ cs, sn, elem5, tmp, lwkopt
266 INTEGER DESCH2( DLEN_ )
267 DOUBLE PRECISION ( 1 ), ELEM3( 1 )
270 INTEGER PILAENVX, NUMROC, ICEIL
272 EXTERNAL pilaenvx, lsame, numroc, iceil
285 ictxt = desch( ctxt_ )
288 IF( nprow.EQ.-1 ) info = -(600+ctxt_)
290 wantt = lsame( job,
'S' )
291 initz = lsame( compz,
'I' )
292 wantz = initz .OR. lsame( compz,
'V' )
296 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
298 IF( .NOT.lsame( job,
'E' ) .AND. .NOT.wantt )
THEN
300 ELSE IF( .NOT.lsame( compz,
'N' ) .AND. .NOT.wantz )
THEN
302 ELSE IF( n.LT.0 )
THEN
304 ELSE IF( ilo.LT.1 .OR. ilo.GT.
max( 1, n ) )
THEN
306 ELSE IF( ihi.LT.
min( ilo, n ) .OR. ihi.GT.n )
THEN
308 ELSEIF( descz( ctxt_ ).NE.desch( ctxt_ ) )
THEN
309 info = -( 1000+ctxt_ )
310 ELSEIF( desch( mb_ ).NE.desch( nb_ ) )
THEN
312 ELSEIF( descz( mb_ ).NE.descz( nb_ ) )
THEN
314 ELSEIF( desch( mb_ ).NE.descz( mb_ ) )
THEN
316 ELSEIF( desch( mb_ ).LT.6 )
THEN
318 ELSEIF( descz( mb_ ).LT.6 )
THEN
321 CALL chk1mat( n, 3, n, 3, 1, 1, desch, 7, info )
323 $
CALL chk1mat( n, 3, n, 3, 1, 1, descz, 11, info )
325 $
CALL pchk2mat( n, 3, n, 3, 1, 1, desch, 7, n, 3, n, 3,
326 $ 1, 1, descz, 11, 0, iwork, iwork, info )
332 CALL pdlaqr1( wantt, wantz, n, ilo, ihi, h, desch, wr, wi,
333 $ ilo, ihi, z, descz, work, -1, iwork, -1, info )
336 CALL pdlaqr0( wantt, wantz, n, ilo, ihi, h, desch, wr, wi,
337 $ ilo, ihi, z, descz, work, -1, iwork, -1, info, 0 )
339 hrows = numroc( nl, nb, myrow, desch(rsrc_), nprow )
340 hcols = numroc( nl, nb, mycol, desch(csrc_), npcol )
341 work(1) = work(1) + dble(2*hrows*hcols)
343 lwkopt =
max( lwkopt, work(1) )
344 liwkopt =
max( liwkopt, iwork(1) )
348 IF( .NOT.lquery .AND. lwork.LT.int(lwkopt) )
THEN
350 ELSEIF( .NOT.lquery .AND. liwork.LT.liwkopt )
THEN
358 CALL pxerbla( ictxt,
'PDHSEQR', -info )
361 ELSE IF( n.EQ.0 )
THEN
367 ELSE IF( lquery )
THEN
378 CALL infog2l( i, i, desch, nprow, npcol, myrow, mycol, ii,
380 IF( myrow.EQ.hrsrc .AND. mycol.EQ.hcsrc )
THEN
381 wr( i ) = h( (jj-1)*lldh + ii )
388 $
CALL dgsum2d( ictxt,
'All',
'1-Tree', ilo-1, 1, wr, n, -1,
391 CALL infog2l( i, i, desch, nprow, npcol, myrow, mycol, ii,
393 IF( myrow.EQ.hrsrc .AND. mycol.EQ.hcsrc )
THEN
394 wr( i ) = h( (jj-1)*lldh + ii )
401 $
CALL dgsum2d( ictxt,
'All',
'1-Tree', n-ihi, 1, wr(ihi+1),
407 $
CALL pdlaset(
'A', n, n, zero, one, z, 1, 1, descz )
412 IF( ilo.EQ.ihi )
THEN
413 CALL infog2l( ilo, ilo, desch, nprow, npcol, myrow,
414 $ mycol, ii, jj, hrsrc, hcsrc )
415 IF( myrow.EQ.hrsrc .AND. mycol.EQ.hcsrc )
THEN
416 wr( ilo ) = h( (jj-1)*lldh + ii )
418 $
CALL dgebs2d( ictxt,
'All',
'1-Tree', 1, 1, wr(ilo),
421 CALL dgebr2d( ictxt,
'All',
'1-Tree', 1, 1, wr(ilo),
431 nmin = pilaenvx( ictxt, 12,
'PDHSEQR',
432 $ job( : 1 ) // compz( : 1 ), n, ilo, ihi, lwork )
433 nmin =
max( ntiny, nmin )
437 IF( (.NOT. crsover .AND. nh.GT.ntiny) .OR. nh.GT.nmin .OR.
438 $ desch(rsrc_).NE.0 .OR. desch(csrc_).NE.0 )
THEN
439 CALL pdlaqr0( wantt, wantz, n, ilo, ihi, h, desch, wr, wi,
440 $ ilo, ihi, z, descz, work, lwork, iwork, liwork, info,
442 IF( info.GT.0 .AND. ( desch(rsrc_).NE.0 .OR.
443 $ desch(csrc_).NE.0 ) )
THEN
449 CALL pdlaqr1( wantt, wantz, n, ilo, ihi, h, desch, wr,
450 $ wi, ilo, ihi, z, descz, work, lwork, iwork,
458 CALL pdlaqr1( wantt, wantz, n, ilo, ihi, h, desch, wr, wi,
459 $ ilo, ihi, z, descz, work, lwork, iwork, liwork, info )
473 CALL pdlaqr0( wantt, wantz, n, ilo, kbot, h, desch,
474 $ wr, wi, ilo, ihi, z, descz, work, lwork,
475 $ iwork, liwork, info, 0 )
483 hrows = numroc( nl, nb, myrow, desch(rsrc_), nprow )
484 hcols = numroc( nl, nb, mycol, desch(csrc_), npcol )
485 CALL descinit( desch2, nl, nl, nb, nb, desch(rsrc_),
486 $ desch(csrc_), ictxt,
max(1, hrows), info )
487 CALL pdlacpy(
'All', n, n, h, 1, 1, desch, work, 1,
489 CALL pdelset( work, n+1, n, desch2, zero )
490 CALL pdlaset(
'All', nl, nl-n, zero, zero, work, 1,
492 ipw = 1 + desch2(lld_)*hcols
493 CALL pdlaqr0( wantt, wantz, nl, ilo, kbot, work,
494 $ desch2, wr, wi, ilo, ihi, z, descz,
495 $ work(ipw), lwork-ipw+1, iwork,
497 IF( wantt .OR. info.NE.0 )
498 $
CALL pdlacpy(
'All', n, n, work, 1, 1, desch2,
507 IF( ( wantt .OR. info.NE.0 ) .AND. n.GT.2 )
508 $
CALL pdlaset(
'L', n-2, n-2, zero, zero, h, 3, 1, desch )
514 CALL pdelget(
'All',
' ', tmp3, h, i+1, i, desch )
515 IF( tmp3.NE.0.0d+00 )
THEN
516 CALL pdelget(
'All',
' ', tmp1, h, i, i, desch )
517 CALL pdelget( 'all
', ' ', TMP2, H, I, I+1, DESCH )
518 CALL PDELGET( 'all
', ' ', TMP4, H, I+1, I+1, DESCH )
519 CALL DLANV2( TMP1, TMP2, TMP3, TMP4, DUM1, DUM2, DUM3,
521.EQ.
IF( TMP30.0D+00 ) THEN
524 $ CALL PDROT( N-I-1, H, I, I+2, DESCH,
525 $ DESCH(M_), H, I+1, I+2, DESCH, DESCH(M_),
526 $ CS, SN, WORK, LWORK, INFO )
527 CALL PDROT( I-1, H, 1, I, DESCH, 1, H, 1, I+1,
528 $ DESCH, 1, CS, SN, WORK, LWORK, INFO )
531 CALL PDROT( N, Z, 1, I, DESCZ, 1, Z, 1, I+1, DESCZ,
532 $ 1, CS, SN, WORK, LWORK, INFO )
534 CALL PDELSET( H, I, I, DESCH, TMP1 )
535 CALL PDELSET( H, I, I+1, DESCH, TMP2 )
536 CALL PDELSET( H, I+1, I, DESCH, TMP3 )
537 CALL PDELSET( H, I+1, I+1, DESCH, TMP4 )
562.EQ..OR..NE..AND.
BORDER = MOD( K, NB )0 ( K1
563.EQ.
$ MOD( K, NB )1 )
564.NOT.
IF( BORDER ) THEN
565 CALL INFOG2L( K, K, DESCH, NPROW, NPCOL, MYROW,
566 $ MYCOL, ILOC1, JLOC1, HRSRC1, HCSRC1 )
567.EQ..AND..EQ.
IF( MYROWHRSRC1 MYCOLHCSRC1 ) THEN
568 ELEM1 = H((JLOC1-1)*LLDH+ILOC1)
570 ELEM3( 1 ) = H((JLOC1-1)*LLDH+ILOC1+1)
574.NE.
IF( ELEM3( 1 )ZERO ) THEN
575 ELEM2( 1 ) = H((JLOC1)*LLDH+ILOC1)
576 ELEM4 = H((JLOC1)*LLDH+ILOC1+1)
577 CALL DLANV2( ELEM1, ELEM2( 1 ), ELEM3( 1 ),
578 $ ELEM4, WR( K ), WI( K ), WR( K+1 ),
579 $ WI( K+1 ), SN, CS )
583 TMP = H((JLOC1-2)*LLDH+ILOC1)
584.NE.
IF( TMPZERO ) THEN
585 ELEM1 = H((JLOC1-2)*LLDH+ILOC1-1)
586 ELEM2( 1 ) = H((JLOC1-1)*LLDH+ILOC1-1)
587 ELEM3( 1 ) = H((JLOC1-2)*LLDH+ILOC1)
588 ELEM4 = H((JLOC1-1)*LLDH+ILOC1)
589 CALL DLANV2( ELEM1, ELEM2( 1 ),
590 $ ELEM3( 1 ), ELEM4, WR( K-1 ),
591 $ WI( K-1 ), WR( K ), WI( K ), SN, CS )
614 DO 60 K = ICEIL(ILO,NB)*NB, IHI-1, NB
615 CALL INFOG2L( K, K, DESCH, NPROW, NPCOL, MYROW, MYCOL,
616 $ ILOC1, JLOC1, HRSRC1, HCSRC1 )
617 CALL INFOG2L( K, K+1, DESCH, NPROW, NPCOL, MYROW, MYCOL,
618 $ ILOC2, JLOC2, HRSRC2, HCSRC2 )
619 CALL INFOG2L( K+1, K, DESCH, NPROW, NPCOL, MYROW, MYCOL,
620 $ ILOC3, JLOC3, HRSRC3, HCSRC3 )
621 CALL INFOG2L( K+1, K+1, DESCH, NPROW, NPCOL, MYROW, MYCOL,
622 $ ILOC4, JLOC4, HRSRC4, HCSRC4 )
623.EQ..AND..EQ.
IF( MYROWHRSRC2 MYCOLHCSRC2 ) THEN
624 ELEM2( 1 ) = H((JLOC2-1)*LLDH+ILOC2)
625.NE..OR..NE.
IF( HRSRC1HRSRC2 HCSRC1HCSRC2 )
626 $ CALL DGESD2D( ICTXT, 1, 1, ELEM2, 1, HRSRC1, HCSRC1)
628.EQ..AND..EQ.
IF( MYROWHRSRC3 MYCOLHCSRC3 ) THEN
629 ELEM3( 1 ) = H((JLOC3-1)*LLDH+ILOC3)
630.NE..OR..NE.
IF( HRSRC1HRSRC3 HCSRC1HCSRC3 )
631 $ CALL DGESD2D( ICTXT, 1, 1, ELEM3, 1, HRSRC1, HCSRC1)
633.EQ..AND..EQ.
IF( MYROWHRSRC4 MYCOLHCSRC4 ) THEN
634 WORK(1) = H((JLOC4-1)*LLDH+ILOC4)
636 WORK(2) = H((JLOC4-1)*LLDH+ILOC4+1)
640.NE..OR..NE.
IF( HRSRC1HRSRC4 HCSRC1HCSRC4 )
641 $ CALL DGESD2D( ICTXT, 2, 1, WORK, 2, HRSRC1, HCSRC1 )
643.EQ..AND..EQ.
IF( MYROWHRSRC1 MYCOLHCSRC1 ) THEN
644 ELEM1 = H((JLOC1-1)*LLDH+ILOC1)
645.NE..OR..NE.
IF( HRSRC1HRSRC2 HCSRC1HCSRC2 )
646 $ CALL DGERV2D( ICTXT, 1, 1, ELEM2, 1, HRSRC2, HCSRC2)
647.NE..OR..NE.
IF( HRSRC1HRSRC3 HCSRC1HCSRC3 )
648 $ CALL DGERV2D( ICTXT, 1, 1, ELEM3, 1, HRSRC3, HCSRC3)
649.NE..OR..NE.
IF( HRSRC1HRSRC4 HCSRC1HCSRC4 )
650 $ CALL DGERV2D( ICTXT, 2, 1, WORK, 2, HRSRC4, HCSRC4 )
653.EQ.
IF( ELEM5ZERO ) THEN
654.EQ..AND..EQ.
IF( WR( K )ZERO WI( K )ZERO ) THEN
655 CALL DLANV2( ELEM1, ELEM2( 1 ), ELEM3( 1 ), ELEM4,
656 $ WR( K ), WI( K ), WR( K+1 ), WI( K+1 ), SN,
658.EQ..AND..EQ.
ELSEIF( WR( K+1 )ZERO WI( K+1 )ZERO )
662.EQ..AND..EQ.
ELSEIF( WR( K )ZERO WI( K )ZERO )
669.GT.
IF( NPROCS1 ) THEN
670 CALL DGSUM2D( ICTXT, 'all
', ' ', IHI-ILO+1, 1, WR(ILO), N,
672 CALL DGSUM2D( ICTXT, 'all
', ' ', IHI-ILO+1, 1, WI(ILO), N,