1 RECURSIVE SUBROUTINE pdlaqr3( WANTT, WANTZ, N, KTOP, KBOT, NW, H,
2 $ DESCH, ILOZ, IHIZ, Z, DESCZ, NS, ND,
3 $ SR, SI, V, DESCV, NH, T, DESCT, NV,
4 $ WV, DESCW, WORK, LWORK, IWORK,
18 INTEGER ihiz, , kbot, ktop, lwork, n, nd, nh, ns,
19 $ nv, nw, liwork, reclevel
23 INTEGER desch( * ), descz( * ), desct( * ), descv( * ),
24 $ descw( * ), iwork( * )
25 DOUBLE PRECISION h( * ), si( kbot ), sr( kbot ), t( * ),
26 $ v( * ), work( * ), wv( * ),
231 INTEGER , csrc_, ctxt_, dlen_, dtype_,
232 $ lld_, mb_, m_, nb_, n_, rsrc_
235 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
236 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
237 $ rsrc_ = 7, csrc_ = 8, lld_ = 9, recmax = 3,
238 $ sortgrad = .false. )
239 DOUBLE PRECISION zero, one
240 PARAMETER ( zero = 0.0d0, one = 1.0d0 )
243 DOUBLE PRECISION aa, bb, beta, cc, cs, dd, evi, evk, foo, s,
244 $ safmax, safmin, smlnum, sn, tau, ulp,
245 $ elem, elem1, elem2, elem3, r1, anorm, rnorm,
247 INTEGER i, ifst, ilst, info, infqr, j, jw, k, kcol,
248 $ kend, kln, krow, kwtop, ltop, lwk1, lwk2, lwk3,
249 $ lwkopt, nmin, lldh, lldz, lldt, lldv, lldwv,
250 $ ictxt, nprow, nmax, npcol, myrow, mycol, nb,
251 $ iroffh, m, rcols, taurows, rrows, taucols,
252 $ itau, ir, ipw, nprocs, mloc, iroffhh,
253 $ icoffhh, hhrsrc, hhcsrc, hhrows, hhcols,
254 $ iroffzz, icoffzz, zzrsrc, zzcsrc, zzrows,
255 $ zzcols, ierr, tzrows0, tzcols0, ierr0, ipt0
256 $ ipz0, ipw0, nb2, round, lilst, kk, lilst0,
257 $ iwrk1, rsrc, csrc, lwk4, lwk5, iwrk2, lwk6,
258 $ lwk7, lwk8, ilwkopt, tzrows, tzcols, nsel,
259 $ npmin, ictxt_new, myrow_new, mycol_new
260 LOGICAL bulge, sorted, lquery
263 INTEGER par( 6 ), descr( dlen_ ),
264 $ desctau( dlen_ ), deschh( dlen_ ),
265 $ desczz( dlen_ ), desctz0( dlen_ ),
267 DOUBLE PRECISION ddum( 1 )
283 INTRINSIC abs, dble, int,
max,
min, sqrt
286 ictxt = desch( ctxt_ )
297 lldwv = descw( lld_ )
299 iroffh = mod( ktop - 1, nb )
300 jw =
min( nw, kbot-ktop+1 )
305 par(1) =
pilaenvx(ictxt, 17,
'PDLAQR3',
'SV', jw, nb, -1, -1)
306 par(2) =
pilaenvx(ictxt, 18,
'PDLAQR3',
'SV', jw, nb, -1, -1)
307 par(3) =
pilaenvx(ictxt, 19,
'PDLAQR3',
'SV', jw, nb, -1, -1)
308 par(4) =
pilaenvx(ictxt, 20,
'PDLAQR3',
'SV', jw, nb, -1, -1)
309 par(5) =
pilaenvx(ictxt, 21,
'PDLAQR3',
'SV', jw, nb, -1, -1)
310 par(6) =
pilaenvx(ictxt, 22,
'PDLAQR3',
'SV', jw, nb, -1, -1)
314 lquery = lwork.EQ.-1 .OR. liwork.EQ.-1
324 taurows =
numroc( 1, 1, mycol, descv(rsrc_), nprow )
325 taucols =
numroc( jw+iroffh, nb, mycol, descv(csrc_),
327 CALL pdgehrd( jw, 1, jw, t, 1, 1, desct, work, work, -1,
329 lwk1 = int( work( 1 ) ) + taurows*taucols
333 CALL pdormhr(
'Right',
'No', jw, jw, 1, jw, t, 1, 1, desct,
334 $ work, v, 1, 1, descv, work, -1, info )
335 lwk2 = int( work( 1 ) )
339 nmin =
pilaenvx( ictxt, 12,
'PDLAQR3',
'SV', jw, 1, jw, lwork )
341 IF( jw+iroffh.GT.nmin .AND. jw+iroffh.LE.nmax
342 $ .AND. reclevel.LT.recmax )
THEN
343 CALL pdlaqr0( .true., .true., jw+iroffh, 1+iroffh,
344 $ jw+iroffh, t, desct, sr, si, 1, jw, v, descv,
345 $ work, -1, iwork, liwork-nsel, infqr,
347 lwk3 = int( work( 1 ) )
350 rsrc = desct( rsrc_ )
351 csrc = desct( csrc_ )
354 CALL pdlaqr1( .true., .true., jw+iroffh, 1, jw+iroffh, t,
355 $ desct, sr, si, 1, jw+iroffh, v, descv, work, -1,
356 $ iwork, liwork-nsel, infqr )
357 desct( rsrc_ ) = rsrc
358 desct( csrc_ ) = csrc
359 lwk3 = int( work( 1 ) )
365 tzrows0 =
numroc( jw+iroffh, nb, myrow, 0, nprow )
366 tzcols0 =
numroc( jw+iroffh, nb, mycol, 0, npcol )
367 lwk4 = 2 * tzrows0*tzcols0
371 CALL pdtrord(
'Vectors', iwork, par, jw+iroffh, t, 1, 1,
372 $ desct, v, 1, 1, descv, ddum, ddum, mloc, work, -1,
373 $ iwork, liwork-nsel, info )
374 lwk5 = int( work( 1 ) )
380 rrows =
numroc( n+iroffh, nb, myrow, descv(rsrc_), nprow )
381 rcols =
numroc( 1, 1, mycol, descv(csrc_), npcol )
382 lwk6 = rrows*rcols + taurows*taucols +
402 lwkopt =
max( lwk1, lwk2, lwk3+lwk4, lwk5, lwk6, lwk7, lwk8 )
403 ilwkopt =
max( iwrk1, iwrk2 )
408 work( 1 ) = dble( lwkopt )
412 iwork( 1 ) = ilwkopt + nsel
428 safmin =
dlamch(
'SAFE MINIMUM' )
429 safmax = one / safmin
430 CALL dlabad( safmin, safmax )
431 ulp =
dlamch(
'PRECISION' )
432 smlnum = safmin*( dble( n ) / ulp )
436 jw =
min( nw, kbot-ktop+1 )
437 kwtop = kbot - jw + 1
438 IF( kwtop.EQ.ktop )
THEN
441 CALL pdelget(
'All',
'1-Tree', s, h, kwtop, kwtop-1, desch )
444 IF( kbot.EQ.kwtop )
THEN
448 CALL pdelget(
'All',
'1-Tree', sr( kwtop
453 IF( abs( s ).LE.
max( smlnum, ulp*abs( sr( kwtop ) ) ) )
458 $
CALL pdelset( h, kwtop, kwtop-1 , desch, zero )
463 IF( kwtop.EQ.ktop .AND. kbot-kwtop.EQ.1 )
THEN
467 CALL pdelget(
'All',
'1-Tree', aa, h, kwtop, kwtop, desch )
468 CALL pdelget(
'All',
'1-Tree', bb, h, kwtop, kwtop+1, desch )
469 CALL pdelget(
'All',
'1-Tree', cc, h, kwtop+1, kwtop, desch )
470 CALL pdelget(
'All',
'1-Tree', dd, h, kwtop+1, kwtop+1, desch )
472 $ sr(kwtop+1), si(kwtop+1), cs, sn )
478 $
CALL pdrot( n-i-1, h, i, i+2, desch, desch
479 $ i+2, desch, desch(m_), cs, sn, work, lwork, info )
481 $
CALL pdrot( i-1, h, 1, i, desch, 1, h, 1, i+1, desch, 1,
482 $ cs, sn, work, lwork, info )
484 $
CALL pdrot( ihiz-iloz+1, z, iloz, i, descz, 1, z, iloz,
486 CALL pdelset( h, i, i, desch, aa )
487 CALL pdelset( h, i, i+1, desch, bb )
488 CALL pdelset( h, i+1, i, desch, cc )
489 CALL pdelset( h, i+1, i+1, desch, dd )
491 work( 1 ) = dble( lwkopt )
498 iroffh = mod( kwtop - 1, nb )
503 desct( m_ ) = jw+iroffh
504 desct( n_ ) = jw+iroffh
513 CALL pdlaset(
'All', iroffh, jw+iroffh, zero, one, t, 1, 1,
515 CALL pdlaset(
'All', jw, iroffh, zero, zero, t, 1+iroffh, 1,
517 CALL pdlacpy(
'All', 1, jw, h, kwtop, kwtop, desch, t, 1+iroffh,
519 CALL pdlacpy(
'Upper', jw-1, jw-1, h, kwtop+1, kwtop, desch, t,
520 $ 1+iroffh+1, 1+iroffh, desct )
522 $
CALL pdlaset(
'Lower', jw-2, jw-2, zero, zero, t, 1+iroffh+2,
524 CALL pdlacpy(
'All', jw-1, 1, h, kwtop+1, kwtop+jw-1, desch, t,
525 $ 1+iroffh+1, 1+iroffh+jw-1, desct )
529 CALL pdlaset(
'All', jw+iroffh, jw+iroffh, zero, one, v, 1, 1,
534 npmin =
pilaenvx( ictxt, 23,
'PDLAQR3',
'SV', jw, nb, nprow,
536 nmin =
pilaenvx( ictxt, 12,
'PDLAQR3',
'SV', jw, 1, jw, lwork )
538 IF(
min(nprow, npcol).LE.npmin+1 .OR. reclevel.GE.1 )
THEN
543 IF( jw+iroffh.GT.nmin .AND. jw+iroffh.LE.nmax
544 $ .AND. reclevel.LT.recmax )
THEN
545 CALL pdlaqr0( .true., .true., jw+iroffh, 1+iroffh,
546 $ jw+iroffh, t, desct, sr( kwtop-iroffh ),
547 $ si( kwtop-iroffh ), 1+iroffh, jw+iroffh, v, descv,
548 $ work, lwork, iwork(nsel+1), liwork-nsel, infqr,
551 IF( desct(rsrc_).EQ.0 .AND. desct(csrc_).EQ.0 )
THEN
552 IF( jw+iroffh.GT.desct( mb_ ) )
THEN
553 CALL pdlaqr1( .true., .true., jw+iroffh, 1,
554 $ jw+iroffh, t, desct, sr( kwtop-iroffh ),
555 $ si( kwtop-iroffh ), 1, jw+iroffh, v,
556 $ descv, work, lwork, iwork(nsel+1), liwork-nsel,
559 IF( myrow.EQ.0 .AND. mycol.EQ.0 )
THEN
560 CALL dlahqr( .true., .true., jw+iroffh, 1+iroffh,
561 $ jw+iroffh, t, desct(lld_),
562 $ sr( kwtop-iroffh ), si( kwtop-iroffh ),
563 $ 1+iroffh, jw+iroffh, v, descv(lld_), infqr )
568 $
CALL igamn2d( ictxt,
'All',
'1-Tree', 1, 1, infqr,
569 $ 1, -1, -1, -1, -1, -1 )
571 ELSEIF( jw+iroffh.LE.desct( mb_ ) )
THEN
572 IF( myrow.EQ.desct(rsrc_) .AND. mycol.EQ.desct(csrc_) )
574 CALL dlahqr( .true., .true., jw+iroffh, 1+iroffh,
575 $ jw+iroffh, t, desct(lld_),
576 $ sr( kwtop-iroffh ), si( kwtop-iroffh ),
577 $ 1+iroffh, jw+iroffh, v, descv(lld_), infqr )
582 $
CALL igamn2d( ictxt,
'All',
'1-Tree', 1, 1, infqr,
583 $ 1, -1, -1, -1, -1, -1 )
585 tzrows0 =
numroc( jw+iroffh, nb, myrow, 0, nprow )
586 tzcols0 =
numroc( jw+iroffh, nb, mycol, 0, npcol )
587 CALL descinit( desctz0, jw+iroffh, jw
588 $ 0, ictxt,
max(1,tzrows0), ierr0 )
590 ipz0 = ipt0 +
max(1,tzrows0)*tzcols0
591 ipw0 = ipz0 +
max(1,tzrows0)*tzcols0
592 CALL pdlamve(
'All', jw+iroffh, jw+iroffh, t, 1, 1,
593 $ desct, work(ipt0), 1, 1, desctz0, work(ipw0) )
594 CALL pdlaset(
'All', jw+iroffh, jw+iroffh, zero, one,
595 $ work(ipz0), 1, 1, desctz0 )
596 CALL pdlaqr1( .true., .true., jw+iroffh, 1,
597 $ jw+iroffh, work(ipt0), desctz0,
598 $ sr( kwtop-iroffh ), si( kwtop-iroffh ),
599 $ 1, jw+iroffh, work(ipz0),
600 $ desctz0, work(ipw0), lwork-ipw0+1, iwork(nsel+1),
601 $ liwork-nsel, infqr )
602 CALL pdlamve(
'All', jw+iroffh, jw+iroffh, work(ipt0), 1,
603 $ 1, desctz0, t, 1, 1, desct, work(ipw0) )
604 CALL pdlamve(
'All', jw+iroffh, jw+iroffh, work(ipz0), 1,
605 $ 1, desctz0, v, 1, 1, descv, work(ipw0) )
617 pmap( j+1+i*npmin ) = blacs_pnum( ictxt, i, j )
620 CALL blacs_gridmap( ictxt_new, pmap, npmin, npmin, npmin )
623 IF( myrow.GE.npmin .OR. mycol.GE.npmin ) ictxt_new = -1
624 IF( ictxt_new.GE.0 )
THEN
625 tzrows0 =
numroc( jw, nb, myrow_new, 0, npmin )
626 tzcols0 =
numroc( jw, nb, mycol_new, 0, npmin )
627 CALL descinit( desctz0, jw, jw, nb, nb, 0,
628 $ 0, ictxt_new,
max(1,tzrows0), ierr0 )
630 ipz0 = ipt0 +
max(1,tzrows0)*
max(1,tzcols0)
631 ipw0 = ipz0 +
max(1,tzrows0)*
max(1,tzcols0)
636 desctz0( ctxt_ ) = -1
639 CALL pdgemr2d( jw, jw, t, 1+iroffh, 1+iroffh, desct,
640 $ work(ipt0), 1, 1, desctz0, ictxt )
641 IF( ictxt_new.GE.0 )
THEN
642 CALL pdlaset(
'All', jw, jw, zero, one, work(ipz0), 1, 1,
644 nmin =
pilaenvx( ictxt_new, 12,
'PDLAQR3',
'SV', jw, 1, jw,
646 IF( jw.GT.nmin .AND.
THEN
647 CALL pdlaqr0( .true., .true., jw, 1, jw, work(ipt0),
648 $ desctz0, sr( kwtop ), si( kwtop ), 1, jw,
649 $ work(ipz0), desctz0, work(ipw0), lwork-ipw0+1,
650 $ iwork(nsel+1), liwork-nsel, infqr,
653 CALL pdlaqr1( .true., .true., jw, 1, jw, work(ipt0),
654 $ desctz0, sr( kwtop ), si( kwtop ), 1, jw,
655 $ work(ipz0), desctz0, work(ipw0), lwork-ipw0+1,
656 $ iwork(nsel+1), liwork-nsel, infqr )
659 CALL pdgemr2d( jw, jw, work(ipt0), 1, 1, desctz0, t, 1+iroffh,
660 $ 1+iroffh, desct, ictxt )
661 CALL pdgemr2d( jw, jw, work(ipz0), 1, 1, desctz0, v, 1+iroffh,
662 $ 1+iroffh, descv, ictxt )
671 CALL igamn2d( ictxt,
'All',
'1-Tree', 1, 1, infqr, 1, -1, -1,
673 CALL dgsum2d( ictxt,
'All',
' ', jw, 1, sr(kwtop), jw, -1, -1 )
674 CALL dgsum2d
'All',
' ', jw, 1, si(kwtop),
685 CALL pdelset( t, j+2, j, desct, zero )
686 CALL pdelset( t, j+3, j, desct, zero
689 $
CALL pdelset( t, jw, jw-2, desct, zero )
714 ilst = infqr + 1 + iroffh
716 CALL pdelget(
'All',
'1-Tree', elem, t, ilst, ilst-1, desct )
718 IF( bulge ) ilst = ilst+1
722 IF( ilst.LE.ns+iroffh )
THEN
726 lilst =
max(ilst,ns+iroffh-nb+1)
727 IF( lilst.GT.1 )
THEN
728 CALL pdelget(
'All',
'1-Tree', elem, t, lilst, lilst-1,
731 IF( bulge ) lilst = lilst+1
736 DO 90 j = iroffh+1, lilst-1
746 IF( lilst.LE.ns+iroffh )
THEN
750 CALL pdelget(
'All', '1-tree
', ELEM, T, NS+IROFFH,
751 $ NS+IROFFH-1, DESCT )
757.NOT.
IF( BULGE ) THEN
761 CALL PDELGET( 'all
', '1-tree
', ELEM, T, NS+IROFFH,
766 CALL PDELGET( 'all
', '1-tree
', ELEM, V, 1+IROFFH,
768.LE.
IF( ABS( S*ELEM )MAX( SMLNUM, ULP*FOO ) ) THEN
778 DO 110 J = LILST, JW+IROFFH
781 IWORK( IFST+IROFFH ) = 1
782 CALL PDTRORD( 'vectors
', IWORK, PAR, JW+IROFFH, T, 1,
783 $ 1, DESCT, V, 1, 1, DESCV, WORK,
784 $ WORK(JW+IROFFH+1), MLOC,
785 $ WORK(2*(JW+IROFFH)+1), LWORK-2*(JW+IROFFH),
786 $ IWORK(NSEL+1), LIWORK-NSEL, INFO )
791 IWORK( IFST+IROFFH ) = 0
800 LILST = MAX(INFO, LILST)
801 ILST = MAX(INFO, ILST)
808 CALL PDELGET( 'all
', '1-tree
', ELEM1, T, NS+IROFFH,
810 CALL PDELGET( 'all
', '', ELEM2, T, NS+IROFFH,
811 $ NS+IROFFH-1, DESCT )
812 CALL PDELGET( 'all
', '1-tree
', ELEM3, T, NS+IROFFH-1,
814 FOO = ABS( ELEM1 ) + SQRT( ABS( ELEM2 ) )*
815 $ SQRT( ABS( ELEM3 ) )
818 CALL PDELGET( 'all
', '1-tree
', ELEM1, V, 1+IROFFH,
820 CALL PDELGET( 'all
', '1-tree
', ELEM2, V, 1+IROFFH,
821 $ NS+IROFFH-1, DESCV )
822.LE.
IF( MAX( ABS( S*ELEM1 ), ABS( S*ELEM2 ) )
823 $ MAX( SMLNUM, ULP*FOO ) ) THEN
833 DO 120 J = LILST, JW+IROFFH
836 IWORK( IFST+IROFFH ) = 1
837 IWORK( IFST+IROFFH-1 ) = 1
838 CALL PDTRORD( 'vectors
', IWORK, PAR, JW+IROFFH, T, 1,
839 $ 1, DESCT, V, 1, 1, DESCV, WORK,
840 $ WORK(JW+IROFFH+1), MLOC,
841 $ WORK(2*(JW+IROFFH)+1), LWORK-2*(JW+IROFFH),
842 $ IWORK(NSEL+1), LIWORK-NSEL, INFO )
847 IWORK( IFST+IROFFH ) = 0
848 IWORK( IFST+IROFFH-1 ) = 0
858 LILST = MAX(INFO, LILST)
859 ILST = MAX(INFO, ILST)
872 DO 130 J = ILST, LILST0-1
875 CALL PDTRORD( 'vectors
', IWORK, PAR, JW+IROFFH, T, 1, 1,
876 $ DESCT, V, 1, 1, DESCV, WORK, WORK(JW+IROFFH+1),
877 $ M, WORK(2*(JW+IROFFH)+1), LWORK-2*(JW+IROFFH),
878 $ IWORK(NSEL+1), LIWORK-NSEL, INFO )
885 $ ILST = MAX(INFO, ILST)
895 CALL DCOPY( JW, WORK(1+IROFFH), 1, SR( KWTOP ), 1 )
896 CALL DCOPY( JW, WORK(JW+2*IROFFH+1), 1, SI( KWTOP ), 1 )
907.LT..AND.
IF( NSJW SORTGRAD ) THEN
923 I = INFQR + 1 + IROFFH
924.EQ.
IF( INS+IROFFH ) THEN
926.EQ.
ELSE IF( SI( KWTOP-IROFFH + I-1 )ZERO ) THEN
934 EVI = ABS( SR( KWTOP-IROFFH+I-1 ) )
936 EVI = ABS( SR( KWTOP-IROFFH+I-1 ) ) +
937 $ ABS( SI( KWTOP-IROFFH+I-1 ) )
941 EVK = ABS( SR( KWTOP-IROFFH+K-1 ) )
942.EQ.
ELSEIF( SI( KWTOP-IROFFH+K-1 )ZERO ) THEN
943 EVK = ABS( SR( KWTOP-IROFFH+K-1 ) )
945 EVK = ABS( SR( KWTOP-IROFFH+K-1 ) ) +
946 $ ABS( SI( KWTOP-IROFFH+K-1 ) )
949.GE.
IF( EVIEVK ) THEN
966.NE..AND..NE.
IF( KKEND SI( KWTOP-IROFFH+K-1 )ZERO ) THEN
972.LT.
IF( KKEND ) IWORK(K+1) = 0
975 DO 170 J = K+2, JW+IROFFH
978 CALL PDTRORD( 'vectors
', IWORK, PAR, JW+IROFFH, T, 1, 1,
979 $ DESCT, V, 1, 1, DESCV, WORK, WORK(JW+IROFFH+1), M,
980 $ WORK(2*(JW+IROFFH)+1), LWORK-2*(JW+IROFFH),
981 $ IWORK(NSEL+1), LIWORK-NSEL, IERR )
982 CALL DCOPY( JW, WORK(1+IROFFH), 1, SR( KWTOP ), 1 )
983 CALL DCOPY( JW, WORK(JW+2*IROFFH+1), 1, SI( KWTOP ), 1 )
992.EQ.
ELSE IF( SI( KWTOP-IROFFH+I-1 )ZERO ) THEN
1005 DESCT( M_ ) = NW+IROFFH
1006 DESCT( N_ ) = NH+IROFFH
1008.LT..OR..EQ.
IF( NSJW SZERO ) THEN
1009.GT..AND..NE.
IF( NS1 SZERO ) THEN
1013 RROWS = NUMROC( NS+IROFFH, NB, MYROW, DESCV(RSRC_), NPROW )
1014 RCOLS = NUMROC( 1, 1, MYCOL, DESCV(CSRC_), NPCOL )
1015 CALL DESCINIT( DESCR, NS+IROFFH, 1, NB, 1, DESCV(RSRC_),
1016 $ DESCV(CSRC_), ICTXT, MAX(1, RROWS), INFO )
1017 TAUROWS = NUMROC( 1, 1, MYCOL, DESCV(RSRC_), NPROW )
1018 TAUCOLS = NUMROC( JW+IROFFH, NB, MYCOL, DESCV(CSRC_),
1020 CALL DESCINIT( DESCTAU, 1, JW+IROFFH, 1, NB, DESCV(RSRC_),
1021 $ DESCV(CSRC_), ICTXT, MAX(1, TAUROWS), INFO )
1024 ITAU = IR + DESCR( LLD_ ) * RCOLS
1025 IPW = ITAU + DESCTAU( LLD_ ) * TAUCOLS
1027 CALL PDLASET( 'all
', NS+IROFFH, 1, ZERO, ZERO, WORK(ITAU),
1030 CALL PDCOPY( NS, V, 1+IROFFH, 1+IROFFH, DESCV, DESCV(M_),
1031 $ WORK(IR), 1+IROFFH, 1, DESCR, 1 )
1032 CALL PDLARFG( NS, BETA, 1+IROFFH, 1, WORK(IR), 2+IROFFH, 1,
1033 $ DESCR, 1, WORK(ITAU+IROFFH) )
1034 CALL PDELSET( WORK(IR), 1+IROFFH, 1, DESCR, ONE )
1036 CALL PDLASET( 'lower
', JW-2, JW-2, ZERO, ZERO, T, 3+IROFFH,
1039 CALL PDLARF( 'left
', NS, JW, WORK(IR), 1+IROFFH, 1, DESCR,
1040 $ 1, WORK(ITAU+IROFFH), T, 1+IROFFH, 1+IROFFH,
1041 $ DESCT, WORK( IPW ) )
1042 CALL PDLARF( 'right
', NS, NS, WORK(IR), 1+IROFFH, 1, DESCR,
1043 $ 1, WORK(ITAU+IROFFH), T, 1+IROFFH, 1+IROFFH,
1044 $ DESCT, WORK( IPW ) )
1045 CALL PDLARF( 'right
', JW, NS, WORK(IR), 1+IROFFH, 1, DESCR,
1046 $ 1, WORK(ITAU+IROFFH), V, 1+IROFFH, 1+IROFFH,
1047 $ DESCV, WORK( IPW ) )
1050 IPW = ITAU + DESCTAU( LLD_ ) * TAUCOLS
1051 CALL PDGEHRD( JW+IROFFH, 1+IROFFH, NS+IROFFH, T, 1, 1,
1052 $ DESCT, WORK(ITAU), WORK( IPW ), LWORK-IPW+1, INFO )
1057.GT.
IF( KWTOP1 ) THEN
1058 CALL PDELGET( 'all
', '1-tree
', ELEM, V, 1+IROFFH,
1060 CALL PDELSET( H, KWTOP, KWTOP-1, DESCH, S*ELEM )
1062 CALL PDLACPY( 'upper
', JW-1, JW-1, T, 1+IROFFH+1, 1+IROFFH,
1063 $ DESCT, H, KWTOP+1, KWTOP, DESCH )
1064 CALL PDLACPY( 'all
', 1, JW, T, 1+IROFFH, 1+IROFFH, DESCT, H,
1065 $ KWTOP, KWTOP, DESCH )
1066 CALL PDLACPY( 'all
', JW-1, 1, T, 1+IROFFH+1, 1+IROFFH+JW-1,
1067 $ DESCT, H, KWTOP+1, KWTOP+JW-1, DESCH )
1072.GT..AND..NE.
IF( NS1 SZERO ) THEN
1073 CALL PDORMHR( 'right
', 'no
', JW+IROFFH, NS+IROFFH, 1+IROFFH,
1074 $ NS+IROFFH, T, 1, 1, DESCT, WORK(ITAU), V, 1,
1075 $ 1, DESCV, WORK( IPW ), LWORK-IPW+1, INFO )
1085 KLN = MAX( 0, KWTOP-LTOP )
1086 IROFFHH = MOD( LTOP-1, NB )
1087 ICOFFHH = MOD( KWTOP-1, NB )
1088 HHRSRC = INDXG2P( LTOP, NB, MYROW, DESCH(RSRC_), NPROW )
1089 HHCSRC = INDXG2P( KWTOP, NB, MYCOL, DESCH(CSRC_), NPCOL )
1090 HHROWS = NUMROC( KLN+IROFFHH, NB, MYROW, HHRSRC, NPROW )
1091 HHCOLS = NUMROC( JW+ICOFFHH, NB, MYCOL, HHCSRC, NPCOL )
1092 CALL DESCINIT( DESCHH, KLN+IROFFHH, JW+ICOFFHH, NB, NB,
1093 $ HHRSRC, HHCSRC, ICTXT, MAX(1, HHROWS), IERR )
1094 CALL PDGEMM( 'no
', 'no
', KLN, JW, JW, ONE, H, LTOP,
1095 $ KWTOP, DESCH, V, 1+IROFFH, 1+IROFFH, DESCV, ZERO,
1096 $ WORK, 1+IROFFHH, 1+ICOFFHH, DESCHH )
1097 CALL PDLACPY( 'all
', KLN, JW, WORK, 1+IROFFHH, 1+ICOFFHH,
1098 $ DESCHH, H, LTOP, KWTOP, DESCH )
1104 IROFFHH = MOD( KWTOP-1, NB )
1105 ICOFFHH = MOD( KBOT, NB )
1106 HHRSRC = INDXG2P( KWTOP, NB, MYROW, DESCH(RSRC_), NPROW )
1107 HHCSRC = INDXG2P( KBOT+1, NB, MYCOL, DESCH(CSRC_), NPCOL )
1108 HHROWS = NUMROC( JW+IROFFHH, NB, MYROW, HHRSRC, NPROW )
1109 HHCOLS = NUMROC( KLN+ICOFFHH, NB, MYCOL, HHCSRC, NPCOL )
1110 CALL DESCINIT( DESCHH, JW+IROFFHH, KLN+ICOFFHH, NB, NB,
1111 $ HHRSRC, HHCSRC, ICTXT, MAX(1, HHROWS), IERR )
1112 CALL PDGEMM( 'tr
', 'no
', JW, KLN, JW, ONE, V,
1113 $ 1+IROFFH, 1+IROFFH, DESCV, H, KWTOP, KBOT+1,
1114 $ DESCH, ZERO, WORK, 1+IROFFHH, 1+ICOFFHH, DESCHH )
1115 CALL PDLACPY( 'all
', JW, KLN, WORK, 1+IROFFHH, 1+ICOFFHH,
1116 $ DESCHH, H, KWTOP, KBOT+1, DESCH )
1123 IROFFZZ = MOD( ILOZ-1, NB )
1124 ICOFFZZ = MOD( KWTOP-1, NB )
1125 ZZRSRC = INDXG2P( ILOZ, NB, MYROW, DESCZ(RSRC_), NPROW )
1126 ZZCSRC = INDXG2P( KWTOP, NB, MYCOL, DESCZ(CSRC_), NPCOL )
1127 ZZROWS = NUMROC( KLN+IROFFZZ, NB, MYROW, ZZRSRC, NPROW )
1128 ZZCOLS = NUMROC( JW+ICOFFZZ, NB, MYCOL, ZZCSRC, NPCOL )
1129 CALL DESCINIT( DESCZZ, KLN+IROFFZZ, JW+ICOFFZZ, NB, NB,
1130 $ ZZRSRC, ZZCSRC, ICTXT, MAX(1, ZZROWS), IERR )
1131 CALL PDGEMM( 'no
', 'no
', KLN, JW, JW, ONE, Z, ILOZ,
1132 $ KWTOP, DESCZ, V, 1+IROFFH, 1+IROFFH, DESCV,
1133 $ ZERO, WORK, 1+IROFFZZ, 1+ICOFFZZ, DESCZZ )
1134 CALL PDLACPY( 'all
', KLN, JW, WORK, 1+IROFFZZ, 1+ICOFFZZ,
1135 $ DESCZZ, Z, ILOZ, KWTOP, DESCZ )
1149 WORK( 1 ) = DBLE( LWKOPT )
1150 IWORK( 1 ) = ILWKOPT + NSEL