Handle corner cases of LWORK (Reference-LAPACK PR 942)
This commit is contained in:
@@ -111,16 +111,17 @@
|
||||
*>
|
||||
*> \param[out] WORK
|
||||
*> \verbatim
|
||||
*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
|
||||
*> (workspace) COMPLEX array, dimension (MAX(1,LWORK))
|
||||
*> On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
|
||||
*> \endverbatim
|
||||
*>
|
||||
*> \param[in] LWORK
|
||||
*> \verbatim
|
||||
*> LWORK is INTEGER
|
||||
*> The dimension of the array WORK.
|
||||
*> The dimension of the array WORK. LWORK >= 1.
|
||||
*> If LWORK = -1, then a workspace query is assumed. The routine
|
||||
*> only calculates the size of the WORK array, returns this
|
||||
*> value as WORK(1), and no error message related to WORK
|
||||
*> value as WORK(1), and no error message related to WORK
|
||||
*> is issued by XERBLA.
|
||||
*> \endverbatim
|
||||
*>
|
||||
@@ -144,7 +145,7 @@
|
||||
*>
|
||||
*> \verbatim
|
||||
*>
|
||||
*> These details are particular for this LAPACK implementation. Users should not
|
||||
*> These details are particular for this LAPACK implementation. Users should not
|
||||
*> take them for granted. These details may change in the future, and are not likely
|
||||
*> true for another LAPACK implementation. These details are relevant if one wants
|
||||
*> to try to understand the code. They are not part of the interface.
|
||||
@@ -166,6 +167,8 @@
|
||||
*>
|
||||
*> \endverbatim
|
||||
*>
|
||||
*> \ingroup gemqr
|
||||
*>
|
||||
* =====================================================================
|
||||
SUBROUTINE CGEMQR( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
|
||||
$ C, LDC, WORK, LWORK, INFO )
|
||||
@@ -187,11 +190,12 @@
|
||||
* ..
|
||||
* .. Local Scalars ..
|
||||
LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
|
||||
INTEGER MB, NB, LW, NBLCKS, MN
|
||||
INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
|
||||
* ..
|
||||
* .. External Functions ..
|
||||
LOGICAL LSAME
|
||||
EXTERNAL LSAME
|
||||
REAL SROUNDUP_LWORK
|
||||
EXTERNAL LSAME, SROUNDUP_LWORK
|
||||
* ..
|
||||
* .. External Subroutines ..
|
||||
EXTERNAL CGEMQRT, CLAMTSQR, XERBLA
|
||||
@@ -203,7 +207,7 @@
|
||||
*
|
||||
* Test the input arguments
|
||||
*
|
||||
LQUERY = LWORK.EQ.-1
|
||||
LQUERY = ( LWORK.EQ.-1 )
|
||||
NOTRAN = LSAME( TRANS, 'N' )
|
||||
TRAN = LSAME( TRANS, 'C' )
|
||||
LEFT = LSAME( SIDE, 'L' )
|
||||
@@ -218,6 +222,13 @@
|
||||
LW = MB * NB
|
||||
MN = N
|
||||
END IF
|
||||
*
|
||||
MINMNK = MIN( M, N, K )
|
||||
IF( MINMNK.EQ.0 ) THEN
|
||||
LWMIN = 1
|
||||
ELSE
|
||||
LWMIN = MAX( 1, LW )
|
||||
END IF
|
||||
*
|
||||
IF( ( MB.GT.K ) .AND. ( MN.GT.K ) ) THEN
|
||||
IF( MOD( MN - K, MB - K ).EQ.0 ) THEN
|
||||
@@ -251,7 +262,7 @@
|
||||
END IF
|
||||
*
|
||||
IF( INFO.EQ.0 ) THEN
|
||||
WORK( 1 ) = LW
|
||||
WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
|
||||
END IF
|
||||
*
|
||||
IF( INFO.NE.0 ) THEN
|
||||
@@ -263,7 +274,7 @@
|
||||
*
|
||||
* Quick return if possible
|
||||
*
|
||||
IF( MIN( M, N, K ).EQ.0 ) THEN
|
||||
IF( MINMNK.EQ.0 ) THEN
|
||||
RETURN
|
||||
END IF
|
||||
*
|
||||
@@ -276,7 +287,7 @@
|
||||
$ NB, C, LDC, WORK, LWORK, INFO )
|
||||
END IF
|
||||
*
|
||||
WORK( 1 ) = LW
|
||||
WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
|
||||
*
|
||||
RETURN
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user