Skip to content

Commit 7ce9bf5

Browse files
committed
Set SCALE early for robust triangular solvers
1) The docs define SCALE as an output argument. Set SCALE *before* the quick return case to have SCALE defined in all cases. This is how the similar routine TRSYL handles the case already. 2) Remove invocations of LABAD in complex routines and be consistent with their real counterparts, which do not call LABAD.
1 parent 4f5e185 commit 7ce9bf5

File tree

8 files changed

+16
-28
lines changed

8 files changed

+16
-28
lines changed

SRC/clatbs.f

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ SUBROUTINE CLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
278278
$ CDOTU, CLADIV
279279
* ..
280280
* .. External Subroutines ..
281-
EXTERNAL CAXPY, CSSCAL, CTBSV, SLABAD, SSCAL, XERBLA
281+
EXTERNAL CAXPY, CSSCAL, CTBSV, SSCAL, XERBLA
282282
* ..
283283
* .. Intrinsic Functions ..
284284
INTRINSIC ABS, AIMAG, CMPLX, CONJG, MAX, MIN, REAL
@@ -324,17 +324,14 @@ SUBROUTINE CLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
324324
*
325325
* Quick return if possible
326326
*
327+
SCALE = ONE
327328
IF( N.EQ.0 )
328329
$ RETURN
329330
*
330331
* Determine machine dependent parameters to control overflow.
331332
*
332-
SMLNUM = SLAMCH( 'Safe minimum' )
333-
BIGNUM = ONE / SMLNUM
334-
CALL SLABAD( SMLNUM, BIGNUM )
335-
SMLNUM = SMLNUM / SLAMCH( 'Precision' )
333+
SMLNUM = SLAMCH( 'Safe minimum' ) / SLAMCH( 'Precision' )
336334
BIGNUM = ONE / SMLNUM
337-
SCALE = ONE
338335
*
339336
IF( LSAME( NORMIN, 'N' ) ) THEN
340337
*

SRC/clatrs.f

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ SUBROUTINE CLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
274274
$ CDOTU, CLADIV
275275
* ..
276276
* .. External Subroutines ..
277-
EXTERNAL CAXPY, CSSCAL, CTRSV, SLABAD, SSCAL, XERBLA
277+
EXTERNAL CAXPY, CSSCAL, CTRSV, SSCAL, XERBLA
278278
* ..
279279
* .. Intrinsic Functions ..
280280
INTRINSIC ABS, AIMAG, CMPLX, CONJG, MAX, MIN, REAL
@@ -318,17 +318,14 @@ SUBROUTINE CLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
318318
*
319319
* Quick return if possible
320320
*
321+
SCALE = ONE
321322
IF( N.EQ.0 )
322323
$ RETURN
323324
*
324325
* Determine machine dependent parameters to control overflow.
325326
*
326-
SMLNUM = SLAMCH( 'Safe minimum' )
327-
BIGNUM = ONE / SMLNUM
328-
CALL SLABAD( SMLNUM, BIGNUM )
329-
SMLNUM = SMLNUM / SLAMCH( 'Precision' )
327+
SMLNUM = SLAMCH( 'Safe minimum' ) / SLAMCH( 'Precision' )
330328
BIGNUM = ONE / SMLNUM
331-
SCALE = ONE
332329
*
333330
IF( LSAME( NORMIN, 'N' ) ) THEN
334331
*

SRC/dlatbs.f

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,14 +310,14 @@ SUBROUTINE DLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
310310
*
311311
* Quick return if possible
312312
*
313+
SCALE = ONE
313314
IF( N.EQ.0 )
314315
$ RETURN
315316
*
316317
* Determine machine dependent parameters to control overflow.
317318
*
318319
SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
319320
BIGNUM = ONE / SMLNUM
320-
SCALE = ONE
321321
*
322322
IF( LSAME( NORMIN, 'N' ) ) THEN
323323
*

SRC/dlatrs.f

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,14 +304,14 @@ SUBROUTINE DLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
304304
*
305305
* Quick return if possible
306306
*
307+
SCALE = ONE
307308
IF( N.EQ.0 )
308309
$ RETURN
309310
*
310311
* Determine machine dependent parameters to control overflow.
311312
*
312313
SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
313314
BIGNUM = ONE / SMLNUM
314-
SCALE = ONE
315315
*
316316
IF( LSAME( NORMIN, 'N' ) ) THEN
317317
*

SRC/slatbs.f

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,14 +310,14 @@ SUBROUTINE SLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
310310
*
311311
* Quick return if possible
312312
*
313+
SCALE = ONE
313314
IF( N.EQ.0 )
314315
$ RETURN
315316
*
316317
* Determine machine dependent parameters to control overflow.
317318
*
318319
SMLNUM = SLAMCH( 'Safe minimum' ) / SLAMCH( 'Precision' )
319320
BIGNUM = ONE / SMLNUM
320-
SCALE = ONE
321321
*
322322
IF( LSAME( NORMIN, 'N' ) ) THEN
323323
*

SRC/slatrs.f

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,14 +304,14 @@ SUBROUTINE SLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
304304
*
305305
* Quick return if possible
306306
*
307+
SCALE = ONE
307308
IF( N.EQ.0 )
308309
$ RETURN
309310
*
310311
* Determine machine dependent parameters to control overflow.
311312
*
312313
SMLNUM = SLAMCH( 'Safe minimum' ) / SLAMCH( 'Precision' )
313314
BIGNUM = ONE / SMLNUM
314-
SCALE = ONE
315315
*
316316
IF( LSAME( NORMIN, 'N' ) ) THEN
317317
*

SRC/zlatbs.f

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ SUBROUTINE ZLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
278278
$ ZDOTU, ZLADIV
279279
* ..
280280
* .. External Subroutines ..
281-
EXTERNAL DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTBSV, DLABAD
281+
EXTERNAL DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTBSV
282282
* ..
283283
* .. Intrinsic Functions ..
284284
INTRINSIC ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN
@@ -324,17 +324,14 @@ SUBROUTINE ZLATBS( UPLO, TRANS, DIAG, NORMIN, N, KD, AB, LDAB, X,
324324
*
325325
* Quick return if possible
326326
*
327+
SCALE = ONE
327328
IF( N.EQ.0 )
328329
$ RETURN
329330
*
330331
* Determine machine dependent parameters to control overflow.
331332
*
332-
SMLNUM = DLAMCH( 'Safe minimum' )
333-
BIGNUM = ONE / SMLNUM
334-
CALL DLABAD( SMLNUM, BIGNUM )
335-
SMLNUM = SMLNUM / DLAMCH( 'Precision' )
333+
SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
336334
BIGNUM = ONE / SMLNUM
337-
SCALE = ONE
338335
*
339336
IF( LSAME( NORMIN, 'N' ) ) THEN
340337
*

SRC/zlatrs.f

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ SUBROUTINE ZLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
274274
$ ZDOTU, ZLADIV
275275
* ..
276276
* .. External Subroutines ..
277-
EXTERNAL DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTRSV, DLABAD
277+
EXTERNAL DSCAL, XERBLA, ZAXPY, ZDSCAL, ZTRSV
278278
* ..
279279
* .. Intrinsic Functions ..
280280
INTRINSIC ABS, DBLE, DCMPLX, DCONJG, DIMAG, MAX, MIN
@@ -318,17 +318,14 @@ SUBROUTINE ZLATRS( UPLO, TRANS, DIAG, NORMIN, N, A, LDA, X, SCALE,
318318
*
319319
* Quick return if possible
320320
*
321+
SCALE = ONE
321322
IF( N.EQ.0 )
322323
$ RETURN
323324
*
324325
* Determine machine dependent parameters to control overflow.
325326
*
326-
SMLNUM = DLAMCH( 'Safe minimum' )
327-
BIGNUM = ONE / SMLNUM
328-
CALL DLABAD( SMLNUM, BIGNUM )
329-
SMLNUM = SMLNUM / DLAMCH( 'Precision' )
327+
SMLNUM = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
330328
BIGNUM = ONE / SMLNUM
331-
SCALE = ONE
332329
*
333330
IF( LSAME( NORMIN, 'N' ) ) THEN
334331
*

0 commit comments

Comments
 (0)