111111* > \param[out] WORK
112112* > \verbatim
113113* > (workspace) COMPLEX array, dimension (MAX(1,LWORK))
114+ * > On exit, if INFO = 0, WORK(1) returns the minimal LWORK.
114115* > \endverbatim
115116* >
116117* > \param[in] LWORK
117118* > \verbatim
118119* > LWORK is INTEGER
119- * > The dimension of the array WORK.
120+ * > The dimension of the array WORK. LWORK >= 1.
120121* > If LWORK = -1, then a workspace query is assumed. The routine
121122* > only calculates the size of the WORK array, returns this
122123* > value as WORK(1), and no error message related to WORK
@@ -187,11 +188,12 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
187188* ..
188189* .. Local Scalars ..
189190 LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
190- INTEGER MB, NB, LW, NBLCKS, MN
191+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
191192* ..
192193* .. External Functions ..
193194 LOGICAL LSAME
194- EXTERNAL LSAME
195+ REAL SROUNDUP_LWORK
196+ EXTERNAL LSAME, SROUNDUP_LWORK
195197* ..
196198* .. External Subroutines ..
197199 EXTERNAL CLAMSWLQ, CGEMLQT, XERBLA
@@ -203,7 +205,7 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
203205*
204206* Test the input arguments
205207*
206- LQUERY = LWORK.EQ. - 1
208+ LQUERY = ( LWORK.EQ. - 1 )
207209 NOTRAN = LSAME( TRANS, ' N' )
208210 TRAN = LSAME( TRANS, ' C' )
209211 LEFT = LSAME( SIDE, ' L' )
@@ -219,6 +221,13 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
219221 MN = N
220222 END IF
221223*
224+ MINMNK = MIN ( M, N, K )
225+ IF ( MINMNK.EQ. 0 ) THEN
226+ LWMIN = 1
227+ ELSE
228+ LWMIN = MAX ( 1 , LW )
229+ END IF
230+
222231 IF ( ( NB.GT. K ) .AND. ( MN.GT. K ) ) THEN
223232 IF ( MOD ( MN - K, NB - K ) .EQ. 0 ) THEN
224233 NBLCKS = ( MN - K ) / ( NB - K )
@@ -246,12 +255,12 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
246255 INFO = - 9
247256 ELSE IF ( LDC.LT. MAX ( 1 , M ) ) THEN
248257 INFO = - 11
249- ELSE IF ( ( LWORK.LT. MAX ( 1 , LW ) ) .AND. ( .NOT. LQUERY ) ) THEN
258+ ELSE IF ( ( LWORK.LT. LWMIN ) .AND. ( .NOT. LQUERY ) ) THEN
250259 INFO = - 13
251260 END IF
252261*
253262 IF ( INFO.EQ. 0 ) THEN
254- WORK( 1 ) = REAL ( LW )
263+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
255264 END IF
256265*
257266 IF ( INFO.NE. 0 ) THEN
@@ -263,7 +272,7 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
263272*
264273* Quick return if possible
265274*
266- IF ( MIN ( M, N, K ) .EQ. 0 ) THEN
275+ IF ( MINMNK .EQ. 0 ) THEN
267276 RETURN
268277 END IF
269278*
@@ -276,7 +285,7 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
276285 $ MB, C, LDC, WORK, LWORK, INFO )
277286 END IF
278287*
279- WORK( 1 ) = REAL ( LW )
288+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
280289*
281290 RETURN
282291*
0 commit comments