@@ -344,7 +344,8 @@ SUBROUTINE DSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
344
344
$ MINRGP = 1.0D-3 )
345
345
* ..
346
346
* .. Local Scalars ..
347
- LOGICAL ALLEIG, INDEIG, LQUERY, VALEIG, WANTZ, ZQUERY
347
+ LOGICAL ALLEIG, INDEIG, LQUERY, VALEIG, WANTZ, ZQUERY,
348
+ $ DLAESWAP
348
349
INTEGER I, IBEGIN, IEND, IFIRST, IIL, IINDBL, IINDW,
349
350
$ IINDWK, IINFO, IINSPL, IIU, ILAST, IN , INDD,
350
351
$ INDE2, INDERR, INDGP, INDGRS, INDWRK, ITMP,
@@ -380,6 +381,7 @@ SUBROUTINE DSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
380
381
*
381
382
LQUERY = ( ( LWORK.EQ. - 1 ).OR. ( LIWORK.EQ. - 1 ) )
382
383
ZQUERY = ( NZC.EQ. - 1 )
384
+ DLAESWAP = .FALSE.
383
385
384
386
* DSTEMR needs WORK of size 6*N, IWORK of size 3*N.
385
387
* In addition, DLARRE needs WORK of size 6*N, IWORK of size 5*N.
@@ -505,15 +507,11 @@ SUBROUTINE DSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
505
507
* DLAE2 and DLAEV2 outputs satisfy |R1| >= |R2|. However,
506
508
* the following DSTEMR requires R1 >= R2. Hence, we correct
507
509
* the order of R1, R2, CS, SN if R1 < R2 before further processing.
508
- IF (R1.LT. R2) THEN
510
+ IF ( R1.LT. R2 ) THEN
509
511
E(2 ) = R1
510
512
R1 = R2
511
513
R2 = E(2 )
512
- IF (WANTZ.AND. (.NOT. ZQUERY)) THEN
513
- E(2 ) = CS
514
- CS = - SN
515
- SN = E(2 )
516
- ENDIF
514
+ DLAESWAP = .TRUE.
517
515
ENDIF
518
516
IF ( ALLEIG.OR.
519
517
$ (VALEIG.AND. (R2.GT. WL).AND.
@@ -522,8 +520,13 @@ SUBROUTINE DSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
522
520
M = M+1
523
521
W( M ) = R2
524
522
IF ( WANTZ.AND. (.NOT. ZQUERY) ) THEN
525
- Z( 1 , M ) = - SN
526
- Z( 2 , M ) = CS
523
+ IF ( DLAESWAP ) THEN
524
+ Z( 1 , M ) = CS
525
+ Z( 2 , M ) = SN
526
+ ELSE
527
+ Z( 1 , M ) = - SN
528
+ Z( 2 , M ) = CS
529
+ ENDIF
527
530
* Note: At most one of SN and CS can be zero.
528
531
IF (SN.NE. ZERO) THEN
529
532
IF (CS.NE. ZERO) THEN
@@ -546,8 +549,13 @@ SUBROUTINE DSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
546
549
M = M+1
547
550
W( M ) = R1
548
551
IF ( WANTZ.AND. (.NOT. ZQUERY) ) THEN
549
- Z( 1 , M ) = CS
550
- Z( 2 , M ) = SN
552
+ IF ( DLAESWAP ) THEN
553
+ Z( 1 , M ) = - SN
554
+ Z( 2 , M ) = CS
555
+ ELSE
556
+ Z( 1 , M ) = CS
557
+ Z( 2 , M ) = SN
558
+ ENDIF
551
559
* Note: At most one of SN and CS can be zero.
552
560
IF (SN.NE. ZERO) THEN
553
561
IF (CS.NE. ZERO) THEN
0 commit comments