Skip to content

Commit a3262e5

Browse files
committed
Fix returned workspace size
* [dz]getsls: cast workspace size with dble, not real * Move workspace write to precede xerbla. Follow the documentation and return the optimal workspace in work(1) even on quick return * Remove unused variables
1 parent 2f132ee commit a3262e5

4 files changed

Lines changed: 26 additions & 38 deletions

File tree

SRC/cgetsls.f

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -183,17 +183,16 @@ SUBROUTINE CGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
183183
* ..
184184
* .. Local Scalars ..
185185
LOGICAL LQUERY, TRAN
186-
INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
187-
$ SCLLEN, MNK, TSZO, TSZM, LWO, LWM, LW1, LW2,
186+
INTEGER I, IASCL, IBSCL, J, MAXMN, BROW,
187+
$ SCLLEN, TSZO, TSZM, LWO, LWM, LW1, LW2,
188188
$ WSIZEO, WSIZEM, INFO2
189189
REAL ANRM, BIGNUM, BNRM, SMLNUM, DUM( 1 )
190190
COMPLEX TQ( 5 ), WORKQ( 1 )
191191
* ..
192192
* .. External Functions ..
193193
LOGICAL LSAME
194-
INTEGER ILAENV
195194
REAL SLAMCH, CLANGE
196-
EXTERNAL LSAME, ILAENV, SLABAD, SLAMCH, CLANGE
195+
EXTERNAL LSAME, SLABAD, SLAMCH, CLANGE
197196
* ..
198197
* .. External Subroutines ..
199198
EXTERNAL CGEQR, CGEMQR, CLASCL, CLASET,
@@ -207,9 +206,7 @@ SUBROUTINE CGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
207206
* Test the input arguments.
208207
*
209208
INFO = 0
210-
MINMN = MIN( M, N )
211209
MAXMN = MAX( M, N )
212-
MNK = MAX( MINMN, NRHS )
213210
TRAN = LSAME( TRANS, 'C' )
214211
*
215212
LQUERY = ( LWORK.EQ.-1 .OR. LWORK.EQ.-2 )
@@ -230,7 +227,7 @@ SUBROUTINE CGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
230227
*
231228
IF( INFO.EQ.0 ) THEN
232229
*
233-
* Determine the block size and minimum LWORK
230+
* Determine the optimum and minimum LWORK
234231
*
235232
IF( M.GE.N ) THEN
236233
CALL CGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 )
@@ -267,16 +264,16 @@ SUBROUTINE CGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
267264
IF( ( LWORK.LT.WSIZEM ).AND.( .NOT.LQUERY ) ) THEN
268265
INFO = -10
269266
END IF
267+
*
268+
WORK( 1 ) = REAL( WSIZEO )
270269
*
271270
END IF
272271
*
273272
IF( INFO.NE.0 ) THEN
274273
CALL XERBLA( 'CGETSLS', -INFO )
275-
WORK( 1 ) = REAL( WSIZEO )
276274
RETURN
277275
END IF
278276
IF( LQUERY ) THEN
279-
IF( LWORK.EQ.-1 ) WORK( 1 ) = REAL( WSIZEO )
280277
IF( LWORK.EQ.-2 ) WORK( 1 ) = REAL( WSIZEM )
281278
RETURN
282279
END IF

SRC/dgetsls.f

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,15 @@ SUBROUTINE DGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
181181
* ..
182182
* .. Local Scalars ..
183183
LOGICAL LQUERY, TRAN
184-
INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
185-
$ SCLLEN, MNK, TSZO, TSZM, LWO, LWM, LW1, LW2,
184+
INTEGER I, IASCL, IBSCL, J, MAXMN, BROW,
185+
$ SCLLEN, TSZO, TSZM, LWO, LWM, LW1, LW2,
186186
$ WSIZEO, WSIZEM, INFO2
187187
DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM, TQ( 5 ), WORKQ( 1 )
188188
* ..
189189
* .. External Functions ..
190190
LOGICAL LSAME
191-
INTEGER ILAENV
192191
DOUBLE PRECISION DLAMCH, DLANGE
193-
EXTERNAL LSAME, ILAENV, DLABAD, DLAMCH, DLANGE
192+
EXTERNAL LSAME, DLABAD, DLAMCH, DLANGE
194193
* ..
195194
* .. External Subroutines ..
196195
EXTERNAL DGEQR, DGEMQR, DLASCL, DLASET,
@@ -204,9 +203,7 @@ SUBROUTINE DGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
204203
* Test the input arguments.
205204
*
206205
INFO = 0
207-
MINMN = MIN( M, N )
208206
MAXMN = MAX( M, N )
209-
MNK = MAX( MINMN, NRHS )
210207
TRAN = LSAME( TRANS, 'T' )
211208
*
212209
LQUERY = ( LWORK.EQ.-1 .OR. LWORK.EQ.-2 )
@@ -227,7 +224,7 @@ SUBROUTINE DGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
227224
*
228225
IF( INFO.EQ.0 ) THEN
229226
*
230-
* Determine the block size and minimum LWORK
227+
* Determine the optimum and minimum LWORK
231228
*
232229
IF( M.GE.N ) THEN
233230
CALL DGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 )
@@ -264,17 +261,17 @@ SUBROUTINE DGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
264261
IF( ( LWORK.LT.WSIZEM ).AND.( .NOT.LQUERY ) ) THEN
265262
INFO = -10
266263
END IF
264+
*
265+
WORK( 1 ) = DBLE( WSIZEO )
267266
*
268267
END IF
269268
*
270269
IF( INFO.NE.0 ) THEN
271270
CALL XERBLA( 'DGETSLS', -INFO )
272-
WORK( 1 ) = DBLE( WSIZEO )
273271
RETURN
274272
END IF
275273
IF( LQUERY ) THEN
276-
IF( LWORK.EQ.-1 ) WORK( 1 ) = REAL( WSIZEO )
277-
IF( LWORK.EQ.-2 ) WORK( 1 ) = REAL( WSIZEM )
274+
IF( LWORK.EQ.-2 ) WORK( 1 ) = DBLE( WSIZEM )
278275
RETURN
279276
END IF
280277
IF( LWORK.LT.WSIZEO ) THEN

SRC/sgetsls.f

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -181,16 +181,15 @@ SUBROUTINE SGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
181181
* ..
182182
* .. Local Scalars ..
183183
LOGICAL LQUERY, TRAN
184-
INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
185-
$ SCLLEN, MNK, TSZO, TSZM, LWO, LWM, LW1, LW2,
184+
INTEGER I, IASCL, IBSCL, J, MAXMN, BROW,
185+
$ SCLLEN, TSZO, TSZM, LWO, LWM, LW1, LW2,
186186
$ WSIZEO, WSIZEM, INFO2
187187
REAL ANRM, BIGNUM, BNRM, SMLNUM, TQ( 5 ), WORKQ( 1 )
188188
* ..
189189
* .. External Functions ..
190190
LOGICAL LSAME
191-
INTEGER ILAENV
192191
REAL SLAMCH, SLANGE
193-
EXTERNAL LSAME, ILAENV, SLABAD, SLAMCH, SLANGE
192+
EXTERNAL LSAME, SLABAD, SLAMCH, SLANGE
194193
* ..
195194
* .. External Subroutines ..
196195
EXTERNAL SGEQR, SGEMQR, SLASCL, SLASET,
@@ -204,9 +203,7 @@ SUBROUTINE SGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
204203
* Test the input arguments.
205204
*
206205
INFO = 0
207-
MINMN = MIN( M, N )
208206
MAXMN = MAX( M, N )
209-
MNK = MAX( MINMN, NRHS )
210207
TRAN = LSAME( TRANS, 'T' )
211208
*
212209
LQUERY = ( LWORK.EQ.-1 .OR. LWORK.EQ.-2 )
@@ -227,7 +224,7 @@ SUBROUTINE SGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
227224
*
228225
IF( INFO.EQ.0 ) THEN
229226
*
230-
* Determine the block size and minimum LWORK
227+
* Determine the optimum and minimum LWORK
231228
*
232229
IF( M.GE.N ) THEN
233230
CALL SGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 )
@@ -264,16 +261,16 @@ SUBROUTINE SGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
264261
IF( ( LWORK.LT.WSIZEM ).AND.( .NOT.LQUERY ) ) THEN
265262
INFO = -10
266263
END IF
264+
*
265+
WORK( 1 ) = REAL( WSIZEO )
267266
*
268267
END IF
269268
*
270269
IF( INFO.NE.0 ) THEN
271270
CALL XERBLA( 'SGETSLS', -INFO )
272-
WORK( 1 ) = REAL( WSIZEO )
273271
RETURN
274272
END IF
275273
IF( LQUERY ) THEN
276-
IF( LWORK.EQ.-1 ) WORK( 1 ) = REAL( WSIZEO )
277274
IF( LWORK.EQ.-2 ) WORK( 1 ) = REAL( WSIZEM )
278275
RETURN
279276
END IF

SRC/zgetsls.f

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -183,17 +183,16 @@ SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
183183
* ..
184184
* .. Local Scalars ..
185185
LOGICAL LQUERY, TRAN
186-
INTEGER I, IASCL, IBSCL, J, MINMN, MAXMN, BROW,
187-
$ SCLLEN, MNK, TSZO, TSZM, LWO, LWM, LW1, LW2,
186+
INTEGER I, IASCL, IBSCL, J, MAXMN, BROW,
187+
$ SCLLEN, TSZO, TSZM, LWO, LWM, LW1, LW2,
188188
$ WSIZEO, WSIZEM, INFO2
189189
DOUBLE PRECISION ANRM, BIGNUM, BNRM, SMLNUM, DUM( 1 )
190190
COMPLEX*16 TQ( 5 ), WORKQ( 1 )
191191
* ..
192192
* .. External Functions ..
193193
LOGICAL LSAME
194-
INTEGER ILAENV
195194
DOUBLE PRECISION DLAMCH, ZLANGE
196-
EXTERNAL LSAME, ILAENV, DLABAD, DLAMCH, ZLANGE
195+
EXTERNAL LSAME, DLABAD, DLAMCH, ZLANGE
197196
* ..
198197
* .. External Subroutines ..
199198
EXTERNAL ZGEQR, ZGEMQR, ZLASCL, ZLASET,
@@ -207,9 +206,7 @@ SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
207206
* Test the input arguments.
208207
*
209208
INFO = 0
210-
MINMN = MIN( M, N )
211209
MAXMN = MAX( M, N )
212-
MNK = MAX( MINMN, NRHS )
213210
TRAN = LSAME( TRANS, 'C' )
214211
*
215212
LQUERY = ( LWORK.EQ.-1 .OR. LWORK.EQ.-2 )
@@ -230,7 +227,7 @@ SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
230227
*
231228
IF( INFO.EQ.0 ) THEN
232229
*
233-
* Determine the block size and minimum LWORK
230+
* Determine the optimum and minimum LWORK
234231
*
235232
IF( M.GE.N ) THEN
236233
CALL ZGEQR( M, N, A, LDA, TQ, -1, WORKQ, -1, INFO2 )
@@ -267,17 +264,17 @@ SUBROUTINE ZGETSLS( TRANS, M, N, NRHS, A, LDA, B, LDB,
267264
IF( ( LWORK.LT.WSIZEM ).AND.( .NOT.LQUERY ) ) THEN
268265
INFO = -10
269266
END IF
267+
*
268+
WORK( 1 ) = DBLE( WSIZEO )
270269
*
271270
END IF
272271
*
273272
IF( INFO.NE.0 ) THEN
274273
CALL XERBLA( 'ZGETSLS', -INFO )
275-
WORK( 1 ) = DBLE( WSIZEO )
276274
RETURN
277275
END IF
278276
IF( LQUERY ) THEN
279-
IF( LWORK.EQ.-1 ) WORK( 1 ) = REAL( WSIZEO )
280-
IF( LWORK.EQ.-2 ) WORK( 1 ) = REAL( WSIZEM )
277+
IF( LWORK.EQ.-2 ) WORK( 1 ) = DBLE( WSIZEM )
281278
RETURN
282279
END IF
283280
IF( LWORK.LT.WSIZEO ) THEN

0 commit comments

Comments
 (0)