1 RECURSIVE SUBROUTINE pslaqr3( 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, iloz, kbot, ktop, lwork, n, nd, nh, ns,
19 $ nv, nw, liwork, reclevel
23 INTEGER desch( * ), descz( * ), desct( * ), descv( * ),
24 $ descw( * ), iwork( * )
25 REAL h( * ), si( kbot ), sr( kbot ), t( * ),
26 $ v( * ), work( * ), wv( * ),
231 INTEGER block_cyclic_2d, 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. )
240 PARAMETER ( zero = 0.0, one = 1.0 )
243 REAL aa, bb, beta, cc, cs, dd, evi, evk, foo, s,
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, , lldz, , lldv, lldwv,
250 $ , nprow, nmax, npcol, , 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
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_ ),
283 INTRINSIC abs, float, 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,
'PSLAQR3',
'SV', jw, nb, -1, -1)
306 par(2) =
pilaenvx(ictxt, 18,
'PSLAQR3',
'SV', jw, nb, -1, -1)
307 par(3) =
pilaenvx(ictxt, 19,
'PSLAQR3',
'SV', jw, nb, -1, -1)
308 par(4) =
pilaenvx(ictxt, 20,
'PSLAQR3',
'SV', jw, nb, -1, -1)
309 par(5) =
pilaenvx(ictxt, 21,
'PSLAQR3',
'SV', jw, nb, -1, -1)
310 par(6) =
pilaenvx(ictxt, 22,
'PSLAQR3',
'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 psgehrd( jw, 1, jw, t, 1, 1, desct, work, work, -1,
329 lwk1 = int( work( 1 ) ) + taurows*taucols
333 CALL psormhr(
'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,
'PSLAQR3',
'SV', jw, 1, jw, lwork )
341 IF( jw+iroffh.GT.nmin .AND. jw+iroffh.LE.nmax
342 $ .AND. reclevel.LT.recmax )
THEN
343 CALL pslaqr0( .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 pslaqr1( .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
365 tzrows0 =
numroc( jw+iroffh, nb, myrow, 0, nprow )
366 tzcols0 =
numroc( jw+iroffh, nb, mycol
367 lwk4 = 2 * tzrows0*tzcols0
372 $ desct, v, 1, 1, descv, ddum, ddum, mloc, work, -1,
373 $ iwork, liwork-nsel, info )
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 +
398 tzrows =
numroc( jw+iroffh, nb, myrow, desct(rsrc_), nprow )
399 tzcols =
numroc( jw+iroffh, nb, mycol, desct(csrc_), npcol )
400 lwk8 = 2*tzrows*tzcols
404 lwkopt =
max( lwk1, lwk2, lwk3+lwk4, lwk5, lwk6, lwk7, lwk8 )
405 ilwkopt =
max( iwrk1, iwrk2 )
410 work( 1 ) = float( lwkopt )
414 iwork( 1 ) = ilwkopt + nsel
430 safmin =
slamch(
'SAFE MINIMUM' )
431 safmax = one / safmin
432 CALL slabad( safmin, safmax )
433 ulp =
slamch(
'PRECISION' )
434 smlnum = safmin*( float( n ) / ulp )
438 jw =
min( nw, kbot-ktop+1 )
439 kwtop = kbot - jw + 1
440 IF( kwtop.EQ.ktop )
THEN
443 CALL pselget(
'All',
'1-Tree', s, h, kwtop, kwtop-1, desch )
446 IF( kbot.EQ.kwtop )
THEN
450 CALL pselget(
'All', '1-tree
', SR( KWTOP ), H, KWTOP, KWTOP,
455.LE.
IF( ABS( S )MAX( SMLNUM, ULP*ABS( SR( KWTOP ) ) ) )
460 $ CALL PSELSET( H, KWTOP, KWTOP-1 , DESCH, ZERO )
465.EQ..AND..EQ.
IF( KWTOPKTOP KBOT-KWTOP1 ) THEN
469 CALL PSELGET( 'all
', '1-tree
', AA, H, KWTOP, KWTOP, DESCH )
470 CALL PSELGET( 'all
', '1-tree
', BB, H, KWTOP, KWTOP+1, DESCH )
471 CALL PSELGET( 'all
', '1-tree
', CC, H, KWTOP+1, KWTOP, DESCH )
472 CALL PSELGET( 'all
', '1-tree
', DD, H, KWTOP+1, KWTOP+1, DESCH )
473 CALL SLANV2( AA, BB, CC, DD, SR(KWTOP), SI(KWTOP),
474 $ SR(KWTOP+1), SI(KWTOP+1), CS, SN )
477.EQ.
IF( CCZERO ) THEN
479.LE..AND.
IF( I+2N WANTT )
480 $ CALL PSROT( N-I-1, H, I, I+2, DESCH, DESCH(M_), H, I+1,
481 $ I+2, DESCH, DESCH(M_), CS, SN, WORK, LWORK, INFO )
483 $ CALL PSROT( I-1, H, 1, I, DESCH, 1, H, 1, I+1, DESCH, 1,
484 $ CS, SN, WORK, LWORK, INFO )
486 $ CALL PSROT( IHIZ-ILOZ+1, Z, ILOZ, I, DESCZ, 1, Z, ILOZ,
487 $ I+1, DESCZ, 1, CS, SN, WORK, LWORK, INFO )
488 CALL PSELSET( H, I, I, DESCH, AA )
489 CALL PSELSET( H, I, I+1, DESCH, BB )
490 CALL PSELSET( H, I+1, I, DESCH, CC )
491 CALL PSELSET( H, I+1, I+1, DESCH, DD )
493 WORK( 1 ) = FLOAT( LWKOPT )
500 IROFFH = MOD( KWTOP - 1, NB )
505 DESCT( M_ ) = JW+IROFFH
506 DESCT( N_ ) = JW+IROFFH
515 CALL PSLASET( 'all
', IROFFH, JW+IROFFH, ZERO, ONE, T, 1, 1,
517 CALL PSLASET( 'all
', JW, IROFFH, ZERO, ZERO, T, 1+IROFFH, 1,
519 CALL PSLACPY( 'all
', 1, JW, H, KWTOP, KWTOP, DESCH, T, 1+IROFFH,
521 CALL PSLACPY( 'upper
', JW-1, JW-1, H, KWTOP+1, KWTOP, DESCH, T,
522 $ 1+IROFFH+1, 1+IROFFH, DESCT )
524 $ CALL PSLASET( 'lower
', JW-2, JW-2, ZERO, ZERO, T, 1+IROFFH+2,
526 CALL PSLACPY( 'all
', JW-1, 1, H, KWTOP+1, KWTOP+JW-1, DESCH, T,
527 $ 1+IROFFH+1, 1+IROFFH+JW-1, DESCT )
531 CALL PSLASET( 'all
', JW+IROFFH, JW+IROFFH, ZERO, ONE, V, 1, 1,
536 NPMIN = PILAENVX( ICTXT, 23, 'pslaqr3', 'sv
', JW, NB, NPROW,
538 NMIN = PILAENVX( ICTXT, 12, 'pslaqr3', 'sv
', JW, 1, JW, LWORK )
540.LE..OR..GE.
IF( MIN(NPROW, NPCOL)NPMIN+1 RECLEVEL1 ) THEN
545.GT..AND..LE.
IF( JW+IROFFHNMIN JW+IROFFHNMAX
546.AND..LT.
$ RECLEVELRECMAX ) THEN
547 CALL PSLAQR0( .TRUE., .TRUE., JW+IROFFH, 1+IROFFH,
548 $ JW+IROFFH, T, DESCT, SR( KWTOP-IROFFH ),
549 $ SI( KWTOP-IROFFH ), 1+IROFFH, JW+IROFFH, V, DESCV,
550 $ WORK, LWORK, IWORK(NSEL+1), LIWORK-NSEL, INFQR,
553.EQ..AND..EQ.
IF( DESCT(RSRC_)0 DESCT(CSRC_)0 ) THEN
554.GT.
IF( JW+IROFFHDESCT( MB_ ) ) THEN
555 CALL PSLAQR1( .TRUE., .TRUE., JW+IROFFH, 1,
556 $ JW+IROFFH, T, DESCT, SR( KWTOP-IROFFH ),
557 $ SI( KWTOP-IROFFH ), 1, JW+IROFFH, V,
558 $ DESCV, WORK, LWORK, IWORK(NSEL+1), LIWORK-NSEL,
561.EQ..AND..EQ.
IF( MYROW0 MYCOL0 ) THEN
562 CALL SLAHQR( .TRUE., .TRUE., JW+IROFFH, 1+IROFFH,
563 $ JW+IROFFH, T, DESCT(LLD_),
564 $ SR( KWTOP-IROFFH ), SI( KWTOP-IROFFH ),
565 $ 1+IROFFH, JW+IROFFH, V, DESCV(LLD_), INFQR )
570 $ CALL IGAMN2D( ICTXT, 'all
', '1-tree
', 1, 1, INFQR,
571 $ 1, -1, -1, -1, -1, -1 )
573.LE.
ELSEIF( JW+IROFFHDESCT( MB_ ) ) THEN
574.EQ..AND..EQ.
IF( MYROWDESCT(RSRC_) MYCOLDESCT(CSRC_) )
576 CALL SLAHQR( .TRUE., .TRUE., JW+IROFFH, 1+IROFFH,
577 $ JW+IROFFH, T, DESCT(LLD_),
578 $ SR( KWTOP-IROFFH ), SI( KWTOP-IROFFH ),
579 $ 1+IROFFH, JW+IROFFH, V, DESCV(LLD_), INFQR )
584 $ CALL IGAMN2D( ICTXT, 'all
', '1-tree
', 1, 1, INFQR,
585 $ 1, -1, -1, -1, -1, -1 )
587 TZROWS0 = NUMROC( JW+IROFFH, NB, MYROW, 0, NPROW )
588 TZCOLS0 = NUMROC( JW+IROFFH, NB, MYCOL, 0, NPCOL )
589 CALL DESCINIT( DESCTZ0, JW+IROFFH, JW+IROFFH, NB, NB, 0,
590 $ 0, ICTXT, MAX(1,TZROWS0), IERR0 )
592 IPZ0 = IPT0 + MAX(1,TZROWS0)*TZCOLS0
593 IPW0 = IPZ0 + MAX(1,TZROWS0)*TZCOLS0
594 CALL PSLAMVE( 'all
', JW+IROFFH, JW+IROFFH, T, 1, 1,
595 $ DESCT, WORK(IPT0), 1, 1, DESCTZ0, WORK(IPW0) )
596 CALL PSLASET( 'all
', JW+IROFFH, JW+IROFFH, ZERO, ONE,
597 $ WORK(IPZ0), 1, 1, DESCTZ0 )
598 CALL PSLAQR1( .TRUE., .TRUE., JW+IROFFH, 1,
599 $ JW+IROFFH, WORK(IPT0), DESCTZ0,
600 $ SR( KWTOP-IROFFH ), SI( KWTOP-IROFFH ),
601 $ 1, JW+IROFFH, WORK(IPZ0),
602 $ DESCTZ0, WORK(IPW0), LWORK-IPW0+1, IWORK(NSEL+1),
603 $ LIWORK-NSEL, INFQR )
604 CALL PSLAMVE( 'all
', JW+IROFFH, JW+IROFFH, WORK(IPT0), 1,
605 $ 1, DESCTZ0, T, 1, 1, DESCT, WORK(IPW0) )
606 CALL PSLAMVE( 'all
', JW+IROFFH, JW+IROFFH, WORK(IPZ0), 1,
607 $ 1, DESCTZ0, V, 1, 1, DESCV, WORK(IPW0) )
619 PMAP( J+1+I*NPMIN ) = BLACS_PNUM( ICTXT, I, J )
622 CALL BLACS_GRIDMAP( ICTXT_NEW, PMAP, NPMIN, NPMIN, NPMIN )
623 CALL BLACS_GRIDINFO( ICTXT_NEW, NPMIN, NPMIN, MYROW_NEW,
625.GE..OR..GE.
IF( MYROWNPMIN MYCOLNPMIN ) ICTXT_NEW = -1
626.GE.
IF( ICTXT_NEW0 ) THEN
627 TZROWS0 = NUMROC( JW, NB, MYROW_NEW, 0, NPMIN )
628 TZCOLS0 = NUMROC( JW, NB, MYCOL_NEW, 0, NPMIN )
629 CALL DESCINIT( DESCTZ0, JW, JW, NB, NB, 0,
630 $ 0, ICTXT_NEW, MAX(1,TZROWS0), IERR0 )
632 IPZ0 = IPT0 + MAX(1,TZROWS0)*MAX(1,TZCOLS0)
633 IPW0 = IPZ0 + MAX(1,TZROWS0)*MAX(1,TZCOLS0)
638 DESCTZ0( CTXT_ ) = -1
641 CALL PSGEMR2D( JW, JW, T, 1+IROFFH, 1+IROFFH, DESCT,
642 $ WORK(IPT0), 1, 1, DESCTZ0, ICTXT )
643.GE.
IF( ICTXT_NEW0 ) THEN
644 CALL PSLASET( 'all
', JW, JW, ZERO, ONE, WORK(IPZ0), 1, 1,
646 NMIN = PILAENVX( ICTXT_NEW, 12, 'pslaqr3', 'sv
', JW, 1, JW,
648.GT..AND..LE..AND..LT.
IF( JWNMIN JWNMAX RECLEVEL1 ) THEN
649 CALL PSLAQR0( .TRUE., .TRUE., JW, 1, JW, WORK(IPT0),
650 $ DESCTZ0, SR( KWTOP ), SI( KWTOP ), 1, JW,
651 $ WORK(IPZ0), DESCTZ0, WORK(IPW0), LWORK-IPW0+1,
652 $ IWORK(NSEL+1), LIWORK-NSEL, INFQR,
655 CALL PSLAQR1( .TRUE., .TRUE., JW, 1, JW, WORK(IPT0),
656 $ DESCTZ0, SR( KWTOP ), SI( KWTOP ), 1, JW,
657 $ WORK(IPZ0), DESCTZ0, WORK(IPW0), LWORK-IPW0+1,
658 $ IWORK(NSEL+1), LIWORK-NSEL, INFQR )
661 CALL PSGEMR2D( JW, JW, WORK(IPT0), 1, 1, DESCTZ0, T, 1+IROFFH,
662 $ 1+IROFFH, DESCT, ICTXT )
663 CALL PSGEMR2D( JW, JW, WORK(IPZ0), 1, 1, DESCTZ0, V, 1+IROFFH,
664 $ 1+IROFFH, DESCV, ICTXT )
666 $ CALL BLACS_GRIDEXIT( ICTXT_NEW )
667.GT.
IF( MYROW+MYCOL0 ) THEN
673 CALL IGAMN2D( ICTXT, 'all
', '1-tree
', 1, 1, INFQR, 1, -1, -1,
675 CALL SGSUM2D( ICTXT, 'all
', ' ', JW, 1, SR(KWTOP), JW, -1, -1 )
676 CALL SGSUM2D( ICTXT, 'all
', ' ', JW, 1, SI(KWTOP), JW, -1, -1 )
682 $ INFQR = INFQR - IROFFH
687 CALL PSELSET( T, J+2, J, DESCT, ZERO )
688 CALL PSELSET( T, J+3, J, DESCT, ZERO )
691 $ CALL PSELSET( T, JW, JW-2, DESCT, ZERO )
711 DO 70 J = 1, IROFFH + INFQR
716 ILST = INFQR + 1 + IROFFH
718 CALL PSELGET( 'all
', '1-tree
', ELEM, T, ILST, ILST-1, DESCT )
720 IF( BULGE ) ILST = ILST+1
724.LE.
IF( ILSTNS+IROFFH ) THEN
728 LILST = MAX(ILST,NS+IROFFH-NB+1)
729.GT.
IF( LILST1 ) THEN
730 CALL PSELGET( 'all
', '1-tree
', ELEM, T, LILST, LILST-1,
733 IF( BULGE ) LILST = LILST+1
738 DO 90 J = IROFFH+1, LILST-1
748.LE.
IF( LILSTNS+IROFFH ) THEN
752 CALL PSELGET( 'all
', '1-tree
', ELEM, T, NS+IROFFH,
753 $ NS+IROFFH-1, DESCT )
759.NOT.
IF( BULGE ) THEN
763 CALL PSELGET( 'all
', '1-tree
', ELEM, T, NS+IROFFH,
768 CALL PSELGET( 'all
', '1-tree
', ELEM, V, 1+IROFFH,
770.LE.
IF( ABS( S*ELEM )MAX( SMLNUM, ULP*FOO ) ) THEN
780 DO 110 J = LILST, JW+IROFFH
783 IWORK( IFST+IROFFH ) = 1
784 CALL PSTRORD( 'vectors
', IWORK, PAR, JW+IROFFH, T, 1,
785 $ 1, DESCT, V, 1, 1, DESCV, WORK,
786 $ WORK(JW+IROFFH+1), MLOC,
787 $ WORK(2*(JW+IROFFH)+1), LWORK-2*(JW+IROFFH),
788 $ IWORK(NSEL+1), LIWORK-NSEL, INFO )
793 IWORK( IFST+IROFFH ) = 0
802 LILST = MAX(INFO, LILST)
803 ILST = MAX(INFO, ILST)
810 CALL PSELGET( 'all
', '1-tree
', ELEM1, T, NS+IROFFH,
812 CALL PSELGET( 'all
', '1-tree
', ELEM2, T, NS+IROFFH,
813 $ NS+IROFFH-1, DESCT )
814 CALL PSELGET( 'all
', '1-tree
', ELEM3, T, NS+IROFFH-1,
816 FOO = ABS( ELEM1 ) + SQRT( ABS( ELEM2 ) )*
817 $ SQRT( ABS( ELEM3 ) )
820 CALL PSELGET( 'all
', '1-tree
', ELEM1, V, 1+IROFFH,
822 CALL PSELGET( 'all
', '1-tree
', ELEM2, V, 1+IROFFH,
823 $ NS+IROFFH-1, DESCV )
824.LE.
IF( MAX( ABS( S*ELEM1 ), ABS( S*ELEM2 ) )
825 $ MAX( SMLNUM, ULP*FOO ) ) THEN
835 DO 120 J = LILST, JW+IROFFH
838 IWORK( IFST+IROFFH ) = 1
839 IWORK( IFST+IROFFH-1 ) = 1
840 CALL PSTRORD( 'vectors
', IWORK, PAR, JW+IROFFH, T, 1,
841 $ 1, DESCT, V, 1, 1, DESCV, WORK,
842 $ WORK(JW+IROFFH+1), MLOC,
843 $ WORK(2*(JW+IROFFH)+1), LWORK-2*(JW+IROFFH),
844 $ IWORK(NSEL+1), LIWORK-NSEL, INFO )
849 IWORK( IFST+IROFFH ) = 0
850 IWORK( IFST+IROFFH-1 ) = 0
860 LILST = MAX(INFO, LILST)
861 ILST = MAX(INFO, ILST)
874 DO 130 J = ILST, LILST0-1
877 CALL PSTRORD( 'vectors
', IWORK, PAR, JW+IROFFH, T, 1, 1,
878 $ DESCT, V, 1, 1, DESCV, WORK, WORK(JW+IROFFH+1),
879 $ M, WORK(2*(JW+IROFFH)+1), LWORK-2*(JW+IROFFH),
880 $ IWORK(NSEL+1), LIWORK-NSEL, INFO )
887 $ ILST = MAX(INFO, ILST)
897 CALL SCOPY( JW, WORK(1+IROFFH), 1, SR( KWTOP ), 1 )
898 CALL SCOPY( JW, WORK(JW+2*IROFFH+1), 1, SI( KWTOP ), 1 )
909.LT..AND.
IF( NSJW SORTGRAD ) THEN
925 I = INFQR + 1 + IROFFH
926.EQ.
IF( INS+IROFFH ) THEN
928.EQ.
ELSE IF( SI( KWTOP-IROFFH + I-1 )ZERO ) THEN
936 EVI = ABS( SR( KWTOP-IROFFH+I-1 ) )
938 EVI = ABS( SR( KWTOP-IROFFH+I-1 ) ) +
939 $ ABS( SI( KWTOP-IROFFH+I-1 ) )
943 EVK = ABS( SR( KWTOP-IROFFH+K-1 ) )
944.EQ.
ELSEIF( SI( KWTOP-IROFFH+K-1 )ZERO ) THEN
945 EVK = ABS( SR( KWTOP-IROFFH+K-1 ) )
947 EVK = ABS( SR( KWTOP-IROFFH+K-1 ) ) +
948 $ ABS( SI( KWTOP-IROFFH+K-1 ) )
951.GE.
IF( EVIEVK ) THEN
968.NE..AND..NE.
IF( KKEND SI( KWTOP-IROFFH+K-1 )ZERO ) THEN
974.LT.
IF( KKEND ) IWORK(K+1) = 0
977 DO 170 J = K+2, JW+IROFFH
980 CALL PSTRORD( 'vectors
', IWORK, PAR, JW+IROFFH, T, 1, 1,
981 $ DESCT, V, 1, 1, DESCV, WORK, WORK(JW+IROFFH+1), M,
982 $ WORK(2*(JW+IROFFH)+1), LWORK-2*(JW+IROFFH),
983 $ IWORK(NSEL+1), LIWORK-NSEL, IERR )
984 CALL SCOPY( JW, WORK(1+IROFFH), 1, SR( KWTOP ), 1 )
985 CALL SCOPY( JW, WORK(JW+2*IROFFH+1), 1, SI( KWTOP ), 1 )
994.EQ.
ELSE IF( SI( KWTOP-IROFFH+I-1 )ZERO ) THEN
1007 DESCT( M_ ) = NW+IROFFH
1008 DESCT( N_ ) = NH+IROFFH
1010.LT..OR..EQ.
IF( NSJW SZERO ) THEN
1011.GT..AND..NE.
IF( NS1 SZERO ) THEN
1015 RROWS = NUMROC( NS+IROFFH, NB, MYROW, DESCV(RSRC_), NPROW )
1016 RCOLS = NUMROC( 1, 1, MYCOL, DESCV(CSRC_), NPCOL )
1017 CALL DESCINIT( DESCR, NS+IROFFH, 1, NB, 1, DESCV(RSRC_),
1018 $ DESCV(CSRC_), ICTXT, MAX(1, RROWS), INFO )
1019 TAUROWS = NUMROC( 1, 1, MYCOL, DESCV(RSRC_), NPROW )
1020 TAUCOLS = NUMROC( JW+IROFFH, NB, MYCOL, DESCV(CSRC_),
1022 CALL DESCINIT( DESCTAU, 1, JW+IROFFH, 1, NB, DESCV(RSRC_),
1023 $ DESCV(CSRC_), ICTXT, MAX(1, TAUROWS), INFO )
1026 ITAU = IR + DESCR( LLD_ ) * RCOLS
1027 IPW = ITAU + DESCTAU( LLD_ ) * TAUCOLS
1029 CALL PSLASET( 'all
', NS+IROFFH, 1, ZERO, ZERO, WORK(ITAU),
1032 CALL PSCOPY( NS, V, 1+IROFFH, 1+IROFFH, DESCV, DESCV(M_),
1033 $ WORK(IR), 1+IROFFH, 1, DESCR, 1 )
1034 CALL PSLARFG( NS, BETA, 1+IROFFH, 1, WORK(IR), 2+IROFFH, 1,
1035 $ DESCR, 1, WORK(ITAU+IROFFH) )
1036 CALL PSELSET( WORK(IR), 1+IROFFH, 1, DESCR, ONE )
1038 CALL PSLASET( 'lower
', JW-2, JW-2, ZERO, ZERO, T, 3+IROFFH,
1041 CALL PSLARF( 'left
', NS, JW, WORK(IR), 1+IROFFH, 1, DESCR,
1042 $ 1, WORK(ITAU+IROFFH), T, 1+IROFFH, 1+IROFFH,
1043 $ DESCT, WORK( IPW ) )
1044 CALL PSLARF( 'right
', NS, NS, WORK(IR), 1+IROFFH, 1, DESCR,
1045 $ 1, WORK(ITAU+IROFFH), T, 1+IROFFH, 1+IROFFH,
1046 $ DESCT, WORK( IPW ) )
1047 CALL PSLARF( 'right
', JW, NS, WORK(IR), 1+IROFFH, 1, DESCR,
1048 $ 1, WORK(ITAU+IROFFH), V, 1+IROFFH, 1+IROFFH,
1049 $ DESCV, WORK( IPW ) )
1052 IPW = ITAU + DESCTAU( LLD_ ) * TAUCOLS
1053 CALL PSGEHRD( JW+IROFFH, 1+IROFFH, NS+IROFFH, T, 1, 1,
1054 $ DESCT, WORK(ITAU), WORK( IPW ), LWORK-IPW+1, INFO )
1059.GT.
IF( KWTOP1 ) THEN
1060 CALL PSELGET( 'all
', '1-tree
', ELEM, V, 1+IROFFH,
1062 CALL PSELSET( H, KWTOP, KWTOP-1, DESCH, S*ELEM )
1064 CALL PSLACPY( 'upper
', JW-1, JW-1, T, 1+IROFFH+1, 1+IROFFH,
1065 $ DESCT, H, KWTOP+1, KWTOP, DESCH )
1066 CALL PSLACPY( 'all
', 1, JW, T, 1+IROFFH, 1+IROFFH, DESCT, H,
1067 $ KWTOP, KWTOP, DESCH )
1068 CALL PSLACPY( 'all
', JW-1, 1, T, 1+IROFFH+1, 1+IROFFH+JW-1,
1069 $ DESCT, H, KWTOP+1, KWTOP+JW-1, DESCH )
1074.GT..AND..NE.
IF( NS1 SZERO ) THEN
1075 CALL PSORMHR( 'right
', 'no
', JW+IROFFH, NS+IROFFH, 1+IROFFH,
1076 $ NS+IROFFH, T, 1, 1, DESCT, WORK(ITAU), V, 1,
1077 $ 1, DESCV, WORK( IPW ), LWORK-IPW+1, INFO )
1087 KLN = MAX( 0, KWTOP-LTOP )
1088 IROFFHH = MOD( LTOP-1, NB )
1089 ICOFFHH = MOD( KWTOP-1, NB )
1090 HHRSRC = INDXG2P( LTOP, NB, MYROW, DESCH(RSRC_), NPROW )
1091 HHCSRC = INDXG2P( KWTOP, NB, MYCOL, DESCH(CSRC_), NPCOL )
1092 HHROWS = NUMROC( KLN+IROFFHH, NB, MYROW, HHRSRC, NPROW )
1093 HHCOLS = NUMROC( JW+ICOFFHH, NB, MYCOL, HHCSRC, NPCOL )
1094 CALL DESCINIT( DESCHH, KLN+IROFFHH, JW+ICOFFHH, NB, NB,
1095 $ HHRSRC, HHCSRC, ICTXT, MAX(1, HHROWS), IERR )
1096 CALL PSGEMM( 'no',
'No', kln, jw, jw, one, h, ltop,
1097 $ kwtop, desch, v, 1+iroffh, 1+iroffh, descv, zero,
1098 $ work, 1+iroffhh, 1+icoffhh, deschh )
1099 CALL pslacpy(
'All', kln, jw, work, 1+iroffhh, 1+icoffhh,
1100 $ deschh, h, ltop, kwtop, desch )
1106 iroffhh = mod( kwtop-1, nb )
1107 icoffhh = mod( kbot, nb )
1108 hhrsrc =
indxg2p( kwtop, nb, myrow, desch(rsrc_), nprow )
1109 hhcsrc =
indxg2p( kbot+1, nb, mycol, desch(csrc_), npcol )
1110 hhrows =
numroc( jw+iroffhh, nb, myrow, hhrsrc, nprow )
1111 hhcols =
numroc( kln+icoffhh, nb, mycol, hhcsrc, npcol )
1112 CALL descinit( deschh, jw+iroffhh, kln+icoffhh, nb, nb,
1113 $ hhrsrc, hhcsrc, ictxt,
max(1, hhrows), ierr )
1114 CALL psgemm(
'Tr',
'No', jw, kln, jw, one, v,
1115 $ 1+iroffh, 1+iroffh, descv, h, kwtop, kbot+1,
1116 $ desch, zero, work, 1+iroffhh, 1+icoffhh, deschh )
1117 CALL pslacpy(
'All', jw, kln, work, 1+iroffhh, 1+icoffhh,
1118 $ deschh, h, kwtop, kbot+1, desch )
1125 iroffzz = mod( iloz-1, nb )
1126 icoffzz = mod( kwtop-1, nb )
1127 zzrsrc =
indxg2p( iloz, nb, myrow, descz(rsrc_), nprow )
1128 zzcsrc =
indxg2p( kwtop, nb, mycol, descz(csrc_), npcol )
1129 zzrows =
numroc( kln+iroffzz, nb, myrow, zzrsrc, nprow )
1130 zzcols =
numroc( jw+icoffzz, nb, mycol, zzcsrc, npcol )
1131 CALL descinit( desczz, kln+iroffzz, jw+icoffzz, nb, nb,
1132 $ zzrsrc, zzcsrc, ictxt,
max(1, zzrows), ierr )
1133 CALL psgemm(
'No',
'No', kln, jw, jw, one, z, iloz
1134 $ kwtop, descz, v, 1+iroffh, 1+iroffh, descv,
1135 $ zero, work, 1+iroffzz, 1+icoffzz, desczz )
1136 CALL pslacpy(
'All', kln, jw, work, 1+iroffzz, 1+icoffzz
1137 $ desczz, z, iloz, kwtop, descz )
1152 iwork( 1 ) = ilwkopt + nsel