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*
0 commit comments