Skip to content

Commit 6811c56

Browse files
committed
sort shifts to avoid splitting imaginary double shift
1 parent e9d5504 commit 6811c56

File tree

2 files changed

+50
-4
lines changed

2 files changed

+50
-4
lines changed

SRC/dlaqz0.f

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,12 +322,12 @@ RECURSIVE SUBROUTINE DLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
322322

323323
* Local scalars
324324
DOUBLE PRECISION :: SMLNUM, ULP, ESHIFT, SAFMIN, SAFMAX, C1, S1,
325-
$ TEMP
325+
$ TEMP, SWAP
326326
INTEGER :: ISTART, ISTOP, IITER, MAXIT, ISTART2, K, LD, NSHIFTS,
327327
$ NBLOCK, NW, NMIN, NIBBLE, N_UNDEFLATED, N_DEFLATED,
328328
$ NS, SWEEP_INFO, SHIFTPOS, LWORKREQ, K2, ISTARTM,
329329
$ ISTOPM, IWANTS, IWANTQ, IWANTZ, NORM_INFO, AED_INFO,
330-
$ NWR, NBR, NSR, ITEMP1, ITEMP2, RCOST
330+
$ NWR, NBR, NSR, ITEMP1, ITEMP2, RCOST, I
331331
LOGICAL :: ILSCHUR, ILQ, ILZ
332332
CHARACTER :: JBCMPZ*3
333333

@@ -683,6 +683,29 @@ RECURSIVE SUBROUTINE DLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
683683
NS = MIN( NSHIFTS, ISTOP-ISTART2 )
684684
NS = MIN( NS, N_UNDEFLATED )
685685
SHIFTPOS = ISTOP-N_DEFLATED-N_UNDEFLATED+1
686+
*
687+
* Shuffle shifts to put double shifts in front
688+
* This ensures that we don't split up a double shift
689+
*
690+
DO I = SHIFTPOS, SHIFTPOS+N_UNDEFLATED-1, 2
691+
IF( ALPHAI( I ).NE.-ALPHAI( I+1 ) ) THEN
692+
*
693+
SWAP = ALPHAR( I )
694+
ALPHAR( I ) = ALPHAR( I+1 )
695+
ALPHAR( I+1 ) = ALPHAR( I+2 )
696+
ALPHAR( I+2 ) = SWAP
697+
698+
SWAP = ALPHAI( I )
699+
ALPHAI( I ) = ALPHAI( I+1 )
700+
ALPHAI( I+1 ) = ALPHAI( I+2 )
701+
ALPHAI( I+2 ) = SWAP
702+
703+
SWAP = BETA( I )
704+
BETA( I ) = BETA( I+1 )
705+
BETA( I+1 ) = BETA( I+2 )
706+
BETA( I+2 ) = SWAP
707+
END IF
708+
END DO
686709

687710
IF ( MOD( LD, 6 ) .EQ. 0 ) THEN
688711
*

SRC/slaqz0.f

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -318,12 +318,12 @@ RECURSIVE SUBROUTINE SLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
318318
PARAMETER( ZERO = 0.0, ONE = 1.0, HALF = 0.5 )
319319

320320
* Local scalars
321-
REAL :: SMLNUM, ULP, ESHIFT, SAFMIN, SAFMAX, C1, S1, TEMP
321+
REAL :: SMLNUM, ULP, ESHIFT, SAFMIN, SAFMAX, C1, S1, TEMP, SWAP
322322
INTEGER :: ISTART, ISTOP, IITER, MAXIT, ISTART2, K, LD, NSHIFTS,
323323
$ NBLOCK, NW, NMIN, NIBBLE, N_UNDEFLATED, N_DEFLATED,
324324
$ NS, SWEEP_INFO, SHIFTPOS, LWORKREQ, K2, ISTARTM,
325325
$ ISTOPM, IWANTS, IWANTQ, IWANTZ, NORM_INFO, AED_INFO,
326-
$ NWR, NBR, NSR, ITEMP1, ITEMP2, RCOST
326+
$ NWR, NBR, NSR, ITEMP1, ITEMP2, RCOST, I
327327
LOGICAL :: ILSCHUR, ILQ, ILZ
328328
CHARACTER :: JBCMPZ*3
329329

@@ -679,6 +679,29 @@ RECURSIVE SUBROUTINE SLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
679679
NS = MIN( NSHIFTS, ISTOP-ISTART2 )
680680
NS = MIN( NS, N_UNDEFLATED )
681681
SHIFTPOS = ISTOP-N_DEFLATED-N_UNDEFLATED+1
682+
*
683+
* Shuffle shifts to put double shifts in front
684+
* This ensures that we don't split up a double shift
685+
*
686+
DO I = SHIFTPOS, SHIFTPOS+N_UNDEFLATED-1, 2
687+
IF( ALPHAI( I ).NE.-ALPHAI( I+1 ) ) THEN
688+
*
689+
SWAP = ALPHAR( I )
690+
ALPHAR( I ) = ALPHAR( I+1 )
691+
ALPHAR( I+1 ) = ALPHAR( I+2 )
692+
ALPHAR( I+2 ) = SWAP
693+
694+
SWAP = ALPHAI( I )
695+
ALPHAI( I ) = ALPHAI( I+1 )
696+
ALPHAI( I+1 ) = ALPHAI( I+2 )
697+
ALPHAI( I+2 ) = SWAP
698+
699+
SWAP = BETA( I )
700+
BETA( I ) = BETA( I+1 )
701+
BETA( I+1 ) = BETA( I+2 )
702+
BETA( I+2 ) = SWAP
703+
END IF
704+
END DO
682705

683706
IF ( MOD( LD, 6 ) .EQ. 0 ) THEN
684707
*

0 commit comments

Comments
 (0)