Fix workspace query in xGELQ (Reference-LAPACK PR443)

This commit is contained in:
Martin Kroeker 2020-09-18 09:19:46 +02:00 committed by GitHub
parent 8d12027a79
commit 7e4d5c237c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 88 additions and 40 deletions

View File

@ -26,7 +26,7 @@
*> where:
*>
*> Q is a N-by-N orthogonal matrix;
*> L is an lower-triangular M-by-M matrix;
*> L is a lower-triangular M-by-M matrix;
*> 0 is a M-by-(N-M) zero matrix, if M < N.
*>
*> \endverbatim
@ -187,7 +187,7 @@
* ..
* .. Local Scalars ..
LOGICAL LQUERY, LMINWS, MINT, MINW
INTEGER MB, NB, MINTSZ, NBLCKS
INTEGER MB, NB, MINTSZ, NBLCKS, LWMIN, LWOPT, LWREQ
* ..
* .. External Functions ..
LOGICAL LSAME
@ -243,20 +243,32 @@
*
* Determine if the workspace size satisfies minimal size
*
IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
LWMIN = MAX( 1, N )
LWOPT = MAX( 1, MB*N )
ELSE
LWMIN = MAX( 1, M )
LWOPT = MAX( 1, MB*M )
END IF
LMINWS = .FALSE.
IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.MB*M )
$ .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.MINTSZ )
IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.LWOPT )
$ .AND. ( LWORK.GE.LWMIN ) .AND. ( TSIZE.GE.MINTSZ )
$ .AND. ( .NOT.LQUERY ) ) THEN
IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN
LMINWS = .TRUE.
MB = 1
NB = N
END IF
IF( LWORK.LT.MB*M ) THEN
IF( LWORK.LT.LWOPT ) THEN
LMINWS = .TRUE.
MB = 1
END IF
END IF
IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
LWREQ = MAX( 1, MB*N )
ELSE
LWREQ = MAX( 1, MB*M )
END IF
*
IF( M.LT.0 ) THEN
INFO = -1
@ -267,7 +279,7 @@
ELSE IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 )
$ .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
INFO = -6
ELSE IF( ( LWORK.LT.MAX( 1, M*MB ) ) .AND .( .NOT.LQUERY )
ELSE IF( ( LWORK.LT.LWREQ ) .AND .( .NOT.LQUERY )
$ .AND. ( .NOT.LMINWS ) ) THEN
INFO = -8
END IF
@ -281,9 +293,9 @@
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
WORK( 1 ) = MAX( 1, N )
WORK( 1 ) = LWMIN
ELSE
WORK( 1 ) = MAX( 1, MB*M )
WORK( 1 ) = LWREQ
END IF
END IF
IF( INFO.NE.0 ) THEN
@ -308,7 +320,7 @@
$ LWORK, INFO )
END IF
*
WORK( 1 ) = MAX( 1, MB*M )
WORK( 1 ) = LWREQ
*
RETURN
*

View File

@ -261,7 +261,7 @@
TSZM = INT( TQ( 1 ) )
LWM = INT( WORKQ( 1 ) )
CALL CGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ,
$ TSZO, B, LDB, WORKQ, -1, INFO2 )
$ TSZM, B, LDB, WORKQ, -1, INFO2 )
LWM = MAX( LWM, INT( WORKQ( 1 ) ) )
WSIZEO = TSZO + LWO
WSIZEM = TSZM + LWM

View File

@ -26,7 +26,7 @@
*> where:
*>
*> Q is a N-by-N orthogonal matrix;
*> L is an lower-triangular M-by-M matrix;
*> L is a lower-triangular M-by-M matrix;
*> 0 is a M-by-(N-M) zero matrix, if M < N.
*>
*> \endverbatim
@ -187,7 +187,7 @@
* ..
* .. Local Scalars ..
LOGICAL LQUERY, LMINWS, MINT, MINW
INTEGER MB, NB, MINTSZ, NBLCKS
INTEGER MB, NB, MINTSZ, NBLCKS, LWMIN, LWOPT, LWREQ
* ..
* .. External Functions ..
LOGICAL LSAME
@ -243,20 +243,32 @@
*
* Determine if the workspace size satisfies minimal size
*
IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
LWMIN = MAX( 1, N )
LWOPT = MAX( 1, MB*N )
ELSE
LWMIN = MAX( 1, M )
LWOPT = MAX( 1, MB*M )
END IF
LMINWS = .FALSE.
IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.MB*M )
$ .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.MINTSZ )
IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.LWOPT )
$ .AND. ( LWORK.GE.LWMIN ) .AND. ( TSIZE.GE.MINTSZ )
$ .AND. ( .NOT.LQUERY ) ) THEN
IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN
LMINWS = .TRUE.
MB = 1
NB = N
END IF
IF( LWORK.LT.MB*M ) THEN
IF( LWORK.LT.LWOPT ) THEN
LMINWS = .TRUE.
MB = 1
END IF
END IF
IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
LWREQ = MAX( 1, MB*N )
ELSE
LWREQ = MAX( 1, MB*M )
END IF
*
IF( M.LT.0 ) THEN
INFO = -1
@ -267,7 +279,7 @@
ELSE IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 )
$ .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
INFO = -6
ELSE IF( ( LWORK.LT.MAX( 1, M*MB ) ) .AND .( .NOT.LQUERY )
ELSE IF( ( LWORK.LT.LWREQ ) .AND .( .NOT.LQUERY )
$ .AND. ( .NOT.LMINWS ) ) THEN
INFO = -8
END IF
@ -281,9 +293,9 @@
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
WORK( 1 ) = MAX( 1, N )
WORK( 1 ) = LWMIN
ELSE
WORK( 1 ) = MAX( 1, MB*M )
WORK( 1 ) = LWREQ
END IF
END IF
IF( INFO.NE.0 ) THEN
@ -308,7 +320,7 @@
$ LWORK, INFO )
END IF
*
WORK( 1 ) = MAX( 1, MB*M )
WORK( 1 ) = LWREQ
*
RETURN
*

View File

@ -258,7 +258,7 @@
TSZM = INT( TQ( 1 ) )
LWM = INT( WORKQ( 1 ) )
CALL DGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ,
$ TSZO, B, LDB, WORKQ, -1, INFO2 )
$ TSZM, B, LDB, WORKQ, -1, INFO2 )
LWM = MAX( LWM, INT( WORKQ( 1 ) ) )
WSIZEO = TSZO + LWO
WSIZEM = TSZM + LWM

View File

@ -26,7 +26,7 @@
*> where:
*>
*> Q is a N-by-N orthogonal matrix;
*> L is an lower-triangular M-by-M matrix;
*> L is a lower-triangular M-by-M matrix;
*> 0 is a M-by-(N-M) zero matrix, if M < N.
*>
*> \endverbatim
@ -187,7 +187,7 @@
* ..
* .. Local Scalars ..
LOGICAL LQUERY, LMINWS, MINT, MINW
INTEGER MB, NB, MINTSZ, NBLCKS
INTEGER MB, NB, MINTSZ, NBLCKS, LWMIN, LWOPT, LWREQ
* ..
* .. External Functions ..
LOGICAL LSAME
@ -243,20 +243,32 @@
*
* Determine if the workspace size satisfies minimal size
*
IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
LWMIN = MAX( 1, N )
LWOPT = MAX( 1, MB*N )
ELSE
LWMIN = MAX( 1, M )
LWOPT = MAX( 1, MB*M )
END IF
LMINWS = .FALSE.
IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.MB*M )
$ .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.MINTSZ )
IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.LWOPT )
$ .AND. ( LWORK.GE.LWMIN ) .AND. ( TSIZE.GE.MINTSZ )
$ .AND. ( .NOT.LQUERY ) ) THEN
IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN
LMINWS = .TRUE.
MB = 1
NB = N
END IF
IF( LWORK.LT.MB*M ) THEN
IF( LWORK.LT.LWOPT ) THEN
LMINWS = .TRUE.
MB = 1
END IF
END IF
IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
LWREQ = MAX( 1, MB*N )
ELSE
LWREQ = MAX( 1, MB*M )
END IF
*
IF( M.LT.0 ) THEN
INFO = -1
@ -267,7 +279,7 @@
ELSE IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 )
$ .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
INFO = -6
ELSE IF( ( LWORK.LT.MAX( 1, M*MB ) ) .AND .( .NOT.LQUERY )
ELSE IF( ( LWORK.LT.LWREQ ) .AND .( .NOT.LQUERY )
$ .AND. ( .NOT.LMINWS ) ) THEN
INFO = -8
END IF
@ -281,9 +293,9 @@
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
WORK( 1 ) = MAX( 1, N )
WORK( 1 ) = LWMIN
ELSE
WORK( 1 ) = MAX( 1, MB*M )
WORK( 1 ) = LWREQ
END IF
END IF
IF( INFO.NE.0 ) THEN
@ -308,7 +320,7 @@
$ LWORK, INFO )
END IF
*
WORK( 1 ) = MAX( 1, MB*M )
WORK( 1 ) = LWREQ
RETURN
*
* End of SGELQ

View File

@ -258,7 +258,7 @@
TSZM = INT( TQ( 1 ) )
LWM = INT( WORKQ( 1 ) )
CALL SGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ,
$ TSZO, B, LDB, WORKQ, -1, INFO2 )
$ TSZM, B, LDB, WORKQ, -1, INFO2 )
LWM = MAX( LWM, INT( WORKQ( 1 ) ) )
WSIZEO = TSZO + LWO
WSIZEM = TSZM + LWM

View File

@ -26,7 +26,7 @@
*> where:
*>
*> Q is a N-by-N orthogonal matrix;
*> L is an lower-triangular M-by-M matrix;
*> L is a lower-triangular M-by-M matrix;
*> 0 is a M-by-(N-M) zero matrix, if M < N.
*>
*> \endverbatim
@ -187,7 +187,7 @@
* ..
* .. Local Scalars ..
LOGICAL LQUERY, LMINWS, MINT, MINW
INTEGER MB, NB, MINTSZ, NBLCKS
INTEGER MB, NB, MINTSZ, NBLCKS, LWMIN, LWOPT, LWREQ
* ..
* .. External Functions ..
LOGICAL LSAME
@ -243,20 +243,32 @@
*
* Determine if the workspace size satisfies minimal size
*
IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
LWMIN = MAX( 1, N )
LWOPT = MAX( 1, MB*N )
ELSE
LWMIN = MAX( 1, M )
LWOPT = MAX( 1, MB*M )
END IF
LMINWS = .FALSE.
IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.MB*M )
$ .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.MINTSZ )
IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.LWOPT )
$ .AND. ( LWORK.GE.LWMIN ) .AND. ( TSIZE.GE.MINTSZ )
$ .AND. ( .NOT.LQUERY ) ) THEN
IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN
LMINWS = .TRUE.
MB = 1
NB = N
END IF
IF( LWORK.LT.MB*M ) THEN
IF( LWORK.LT.LWOPT ) THEN
LMINWS = .TRUE.
MB = 1
END IF
END IF
IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
LWREQ = MAX( 1, MB*N )
ELSE
LWREQ = MAX( 1, MB*M )
END IF
*
IF( M.LT.0 ) THEN
INFO = -1
@ -267,7 +279,7 @@
ELSE IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 )
$ .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
INFO = -6
ELSE IF( ( LWORK.LT.MAX( 1, M*MB ) ) .AND .( .NOT.LQUERY )
ELSE IF( ( LWORK.LT.LWREQ ) .AND .( .NOT.LQUERY )
$ .AND. ( .NOT.LMINWS ) ) THEN
INFO = -8
END IF
@ -281,9 +293,9 @@
T( 2 ) = MB
T( 3 ) = NB
IF( MINW ) THEN
WORK( 1 ) = MAX( 1, N )
WORK( 1 ) = LWMIN
ELSE
WORK( 1 ) = MAX( 1, MB*M )
WORK( 1 ) = LWREQ
END IF
END IF
IF( INFO.NE.0 ) THEN
@ -308,7 +320,7 @@
$ LWORK, INFO )
END IF
*
WORK( 1 ) = MAX( 1, MB*M )
WORK( 1 ) = LWREQ
*
RETURN
*

View File

@ -261,7 +261,7 @@
TSZM = INT( TQ( 1 ) )
LWM = INT( WORKQ( 1 ) )
CALL ZGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ,
$ TSZO, B, LDB, WORKQ, -1, INFO2 )
$ TSZM, B, LDB, WORKQ, -1, INFO2 )
LWM = MAX( LWM, INT( WORKQ( 1 ) ) )
WSIZEO = TSZO + LWO
WSIZEM = TSZM + LWM