diff options
author | julie <julielangou@users.noreply.github.com> | 2014-10-07 04:21:49 +0000 |
---|---|---|
committer | julie <julielangou@users.noreply.github.com> | 2014-10-07 04:21:49 +0000 |
commit | f04a5811b7233661a393718717041a5ba2384864 (patch) | |
tree | 561017a7948eae37e74fcf10f2144d3dc749f73e /SRC/slaed6.f | |
parent | bbe0f64dbb8a9fd1996294011a86338d89696ab8 (diff) | |
download | lapack-f04a5811b7233661a393718717041a5ba2384864.tar.gz lapack-f04a5811b7233661a393718717041a5ba2384864.tar.bz2 lapack-f04a5811b7233661a393718717041a5ba2384864.zip |
Commit fix from Osni Marquez for Bug 115 reported from Duncan Po (Mathworks)
Description of bug http://icl.utk.edu/lapack-forum/viewtopic.php?f=13&t=4391,
It turns out to be related to bug http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=5&t=4498 as well. Further, I suspect that the problem reported in an e-mail sent by Justin Weiguang Si to lapack@cs.utk.edu on Sep 22 is also related to those, although Justin has not yet replied to my request for the offending matrix...
The bug has been traced to [d/s]laed6, which computes the root closest to the origin of a secular equation and is used in the D&C tridiagonal eigensolver (DSTEDC) and D&C least squares solver (DGELSD). We have interacted with Ren-Cang Li (the original developer of [d/s]laed6) about possible fixes, and I am attaching a new version of [d/s]laed6. This version has been tested with our 'torture cases' (more on this below) in:
- single and double precision
- Intel Xeon Westmere with gnu (gfortran) and intel (ifort) compilers
- AMD MagnyCours with pgi, cray, intel and gnu compilers
The bug was related to a too stringent tolerance convergence criterion, line 390 in laed6. The fix is
390 IF( ( ABS( F ).LE.FOUR*EPS*ERRETM ) .OR.
391 $ ( (UBD-LBD).LE.FOUR*EPS*ABS(TAU) ) )
to replace
390 IF( ABS( F ).LE.EPS*ERRETM )
corrected bugs: 115 and 121
Diffstat (limited to 'SRC/slaed6.f')
-rw-r--r-- | SRC/slaed6.f | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/SRC/slaed6.f b/SRC/slaed6.f index 10e36412..0f403063 100644 --- a/SRC/slaed6.f +++ b/SRC/slaed6.f @@ -387,7 +387,8 @@ F = FINIT + TAU*FC ERRETM = EIGHT*( ABS( FINIT )+ABS( TAU )*ERRETM ) + $ ABS( TAU )*DF - IF( ABS( F ).LE.EPS*ERRETM ) + IF( ( ABS( F ).LE.FOUR*EPS*ERRETM ) .OR. + $ ( (UBD-LBD).LE.FOUR*EPS*ABS(TAU) ) ) $ GO TO 60 IF( F .LE. ZERO )THEN LBD = TAU |