329329* > Jim Demmel, University of California, Berkeley, USA \n
330330* > Inderjit Dhillon, University of Texas, Austin, USA \n
331331* > Osni Marques, LBNL/NERSC, USA \n
332- * > Christof Voemel, University of California, Berkeley, USA
332+ * > Christof Voemel, University of California, Berkeley, USA \n
333+ * > Aravindh Krishnamoorthy, FAU, Erlangen, Germany \n
333334*
334335* =====================================================================
335336 SUBROUTINE CSTEMR ( JOBZ , RANGE , N , D , E , VL , VU , IL , IU ,
@@ -361,7 +362,8 @@ SUBROUTINE CSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
361362 $ MINRGP = 3.0E-3 )
362363* ..
363364* .. Local Scalars ..
364- LOGICAL ALLEIG, INDEIG, LQUERY, VALEIG, WANTZ, ZQUERY
365+ LOGICAL ALLEIG, INDEIG, LQUERY, VALEIG, WANTZ, ZQUERY,
366+ $ LAESWAP
365367 INTEGER I, IBEGIN, IEND, IFIRST, IIL, IINDBL, IINDW,
366368 $ IINDWK, IINFO, IINSPL, IIU, ILAST, IN , INDD,
367369 $ INDE2, INDERR, INDGP, INDGRS, INDWRK, ITMP,
@@ -397,6 +399,7 @@ SUBROUTINE CSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
397399*
398400 LQUERY = ( ( LWORK.EQ. - 1 ).OR. ( LIWORK.EQ. - 1 ) )
399401 ZQUERY = ( NZC.EQ. - 1 )
402+ LAESWAP = .FALSE.
400403
401404* SSTEMR needs WORK of size 6*N, IWORK of size 3*N.
402405* In addition, SLARRE needs WORK of size 6*N, IWORK of size 5*N.
@@ -519,15 +522,29 @@ SUBROUTINE CSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
519522 ELSE IF ( WANTZ.AND. (.NOT. ZQUERY) ) THEN
520523 CALL SLAEV2( D(1 ), E(1 ), D(2 ), R1, R2, CS, SN )
521524 END IF
525+ * D/S/LAE2 and D/S/LAEV2 outputs satisfy |R1| >= |R2|. However,
526+ * the following code requires R1 >= R2. Hence, we correct
527+ * the order of R1, R2, CS, SN if R1 < R2 before further processing.
528+ IF ( R1.LT. R2 ) THEN
529+ E(2 ) = R1
530+ R1 = R2
531+ R2 = E(2 )
532+ LAESWAP = .TRUE.
533+ ENDIF
522534 IF ( ALLEIG.OR.
523535 $ (VALEIG.AND. (R2.GT. WL).AND.
524536 $ (R2.LE. WU)).OR.
525537 $ (INDEIG.AND. (IIL.EQ. 1 )) ) THEN
526538 M = M+1
527539 W( M ) = R2
528540 IF ( WANTZ.AND. (.NOT. ZQUERY) ) THEN
529- Z( 1 , M ) = - SN
530- Z( 2 , M ) = CS
541+ IF ( LAESWAP ) THEN
542+ Z( 1 , M ) = CS
543+ Z( 2 , M ) = SN
544+ ELSE
545+ Z( 1 , M ) = - SN
546+ Z( 2 , M ) = CS
547+ ENDIF
531548* Note: At most one of SN and CS can be zero.
532549 IF (SN.NE. ZERO) THEN
533550 IF (CS.NE. ZERO) THEN
@@ -550,8 +567,13 @@ SUBROUTINE CSTEMR( JOBZ, RANGE, N, D, E, VL, VU, IL, IU,
550567 M = M+1
551568 W( M ) = R1
552569 IF ( WANTZ.AND. (.NOT. ZQUERY) ) THEN
553- Z( 1 , M ) = CS
554- Z( 2 , M ) = SN
570+ IF ( LAESWAP ) THEN
571+ Z( 1 , M ) = - SN
572+ Z( 2 , M ) = CS
573+ ELSE
574+ Z( 1 , M ) = CS
575+ Z( 2 , M ) = SN
576+ ENDIF
555577* Note: At most one of SN and CS can be zero.
556578 IF (SN.NE. ZERO) THEN
557579 IF (CS.NE. ZERO) THEN
0 commit comments