Skip to content

Commit 42fe66c

Browse files
committed
Fix #135
Thanks Cezary Dendek!
1 parent 6a229fb commit 42fe66c

2 files changed

Lines changed: 45 additions & 12 deletions

File tree

SRC/dbdsqr.f

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,17 @@
212212
*> algorithm through its inner loop. The algorithms stops
213213
*> (and so fails to converge) if the number of passes
214214
*> through the inner loop exceeds MAXITR*N**2.
215+
*>
216+
*> \endverbatim
217+
*
218+
*> \par Note:
219+
* ===========
220+
*>
221+
*> \verbatim
222+
*> Bug report from Cezary Dendek.
223+
*> On March 23rd 2017, the INTEGER variable MAXIT = MAXITR*N**2 is
224+
*> removed since it can overflow pretty easily (for N larger or equal
225+
*> than 18,919). We instead use MAXITDIVN = MAXITR*N.
215226
*> \endverbatim
216227
*
217228
* Authors:
@@ -266,8 +277,8 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
266277
* ..
267278
* .. Local Scalars ..
268279
LOGICAL LOWER, ROTATE
269-
INTEGER I, IDIR, ISUB, ITER, J, LL, LLL, M, MAXIT, NM1,
270-
$ NM12, NM13, OLDLL, OLDM
280+
INTEGER I, IDIR, ISUB, ITER, ITERDIVN, J, LL, LLL, M,
281+
$ MAXITDIVN, NM1, NM12, NM13, OLDLL, OLDM
271282
DOUBLE PRECISION ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
272283
$ OLDCS, OLDSN, R, SHIFT, SIGMN, SIGMX, SINL,
273284
$ SINR, SLL, SMAX, SMIN, SMINL, SMINOA,
@@ -412,8 +423,9 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
412423
* (MAXIT is the maximum number of passes through the inner
413424
* loop permitted before nonconvergence signalled.)
414425
*
415-
MAXIT = MAXITR*N*N
416-
ITER = 0
426+
MAXITDIVN = MAXITR*N
427+
ITERDIVN = 0
428+
ITER = -1
417429
OLDLL = -1
418430
OLDM = -1
419431
*
@@ -429,8 +441,13 @@ SUBROUTINE DBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
429441
*
430442
IF( M.LE.1 )
431443
$ GO TO 160
432-
IF( ITER.GT.MAXIT )
433-
$ GO TO 200
444+
*
445+
IF( ITER.GE.N ) THEN
446+
ITER = ITER - N
447+
ITERDIVN = ITERDIVN + 1
448+
IF( ITERDIVN.GE.MAXITDIVN )
449+
$ GO TO 200
450+
END IF
434451
*
435452
* Find diagonal block of matrix to work on
436453
*

SRC/sbdsqr.f

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,16 @@
214214
*> through the inner loop exceeds MAXITR*N**2.
215215
*> \endverbatim
216216
*
217+
*> \par Note:
218+
* ===========
219+
*>
220+
*> \verbatim
221+
*> Bug report from Cezary Dendek.
222+
*> On March 23rd 2017, the INTEGER variable MAXIT = MAXITR*N**2 is
223+
*> removed since it can overflow pretty easily (for N larger or equal
224+
*> than 18,919). We instead use MAXITDIVN = MAXITR*N.
225+
*> \endverbatim
226+
*
217227
* Authors:
218228
* ========
219229
*
@@ -266,8 +276,8 @@ SUBROUTINE SBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
266276
* ..
267277
* .. Local Scalars ..
268278
LOGICAL LOWER, ROTATE
269-
INTEGER I, IDIR, ISUB, ITER, J, LL, LLL, M, MAXIT, NM1,
270-
$ NM12, NM13, OLDLL, OLDM
279+
INTEGER I, IDIR, ISUB, ITER, ITERDIVN, J, LL, LLL, M,
280+
$ MAXITDIVN, NM1, NM12, NM13, OLDLL, OLDM
271281
REAL ABSE, ABSS, COSL, COSR, CS, EPS, F, G, H, MU,
272282
$ OLDCS, OLDSN, R, SHIFT, SIGMN, SIGMX, SINL,
273283
$ SINR, SLL, SMAX, SMIN, SMINL, SMINOA,
@@ -412,8 +422,9 @@ SUBROUTINE SBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
412422
* (MAXIT is the maximum number of passes through the inner
413423
* loop permitted before nonconvergence signalled.)
414424
*
415-
MAXIT = MAXITR*N*N
416-
ITER = 0
425+
MAXITDIVN = MAXITR*N
426+
ITERDIVN = 0
427+
ITER = -1
417428
OLDLL = -1
418429
OLDM = -1
419430
*
@@ -429,8 +440,13 @@ SUBROUTINE SBDSQR( UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U,
429440
*
430441
IF( M.LE.1 )
431442
$ GO TO 160
432-
IF( ITER.GT.MAXIT )
433-
$ GO TO 200
443+
*
444+
IF( ITER.GE.N ) THEN
445+
ITER = ITER - N
446+
ITERDIVN = ITERDIVN + 1
447+
IF( ITERDIVN.GE.MAXITDIVN )
448+
$ GO TO 200
449+
END IF
434450
*
435451
* Find diagonal block of matrix to work on
436452
*

0 commit comments

Comments
 (0)