110110* >
111111* > \param[out] WORK
112112* > \verbatim
113- * > (workspace) COMPLEX array, dimension (MAX(1,LWORK))
113+ * > (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
122- * > value as WORK(1), and no error message related to WORK
123+ * > value as WORK(1), and no error message related to WORK
123124* > is issued by XERBLA.
124125* > \endverbatim
125126* >
143144* >
144145* > \verbatim
145146* >
146- * > These details are particular for this LAPACK implementation. Users should not
147+ * > These details are particular for this LAPACK implementation. Users should not
147148* > take them for granted. These details may change in the future, and are not likely
148149* > true for another LAPACK implementation. These details are relevant if one wants
149150* > to try to understand the code. They are not part of the interface.
159160* > block sizes MB and NB returned by ILAENV, CGELQ will use either
160161* > CLASWLQ (if the matrix is wide-and-short) or CGELQT to compute
161162* > the LQ factorization.
162- * > This version of CGEMLQ will use either CLAMSWLQ or CGEMLQT to
163+ * > This version of CGEMLQ will use either CLAMSWLQ or CGEMLQT to
163164* > multiply matrix Q by another matrix.
164165* > Further Details in CLAMSWLQ or CGEMLQT.
165166* > \endverbatim
166167* >
168+ * > \ingroup gemlq
169+ * >
167170* =====================================================================
168171 SUBROUTINE CGEMLQ ( SIDE , TRANS , M , N , K , A , LDA , T , TSIZE ,
169172 $ C , LDC , WORK , LWORK , INFO )
@@ -185,11 +188,12 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
185188* ..
186189* .. Local Scalars ..
187190 LOGICAL LEFT, RIGHT, TRAN, NOTRAN, LQUERY
188- INTEGER MB, NB, LW, NBLCKS, MN
191+ INTEGER MB, NB, LW, NBLCKS, MN, MINMNK, LWMIN
189192* ..
190193* .. External Functions ..
191194 LOGICAL LSAME
192- EXTERNAL LSAME
195+ REAL SROUNDUP_LWORK
196+ EXTERNAL LSAME, SROUNDUP_LWORK
193197* ..
194198* .. External Subroutines ..
195199 EXTERNAL CLAMSWLQ, CGEMLQT, XERBLA
@@ -201,7 +205,7 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
201205*
202206* Test the input arguments
203207*
204- LQUERY = LWORK.EQ. - 1
208+ LQUERY = ( LWORK.EQ. - 1 )
205209 NOTRAN = LSAME( TRANS, ' N' )
206210 TRAN = LSAME( TRANS, ' C' )
207211 LEFT = LSAME( SIDE, ' L' )
@@ -216,6 +220,13 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
216220 LW = M * MB
217221 MN = N
218222 END IF
223+ *
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
219230*
220231 IF ( ( NB.GT. K ) .AND. ( MN.GT. K ) ) THEN
221232 IF ( MOD ( MN - K, NB - K ) .EQ. 0 ) THEN
@@ -244,12 +255,12 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
244255 INFO = - 9
245256 ELSE IF ( LDC.LT. MAX ( 1 , M ) ) THEN
246257 INFO = - 11
247- ELSE IF ( ( LWORK.LT. MAX ( 1 , LW ) ) .AND. ( .NOT. LQUERY ) ) THEN
258+ ELSE IF ( ( LWORK.LT. LWMIN ) .AND. ( .NOT. LQUERY ) ) THEN
248259 INFO = - 13
249260 END IF
250261*
251262 IF ( INFO.EQ. 0 ) THEN
252- WORK( 1 ) = REAL ( LW )
263+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
253264 END IF
254265*
255266 IF ( INFO.NE. 0 ) THEN
@@ -261,7 +272,7 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
261272*
262273* Quick return if possible
263274*
264- IF ( MIN ( M, N, K ) .EQ. 0 ) THEN
275+ IF ( MINMNK .EQ. 0 ) THEN
265276 RETURN
266277 END IF
267278*
@@ -274,7 +285,7 @@ SUBROUTINE CGEMLQ( SIDE, TRANS, M, N, K, A, LDA, T, TSIZE,
274285 $ MB, C, LDC, WORK, LWORK, INFO )
275286 END IF
276287*
277- WORK( 1 ) = REAL ( LW )
288+ WORK( 1 ) = SROUNDUP_LWORK( LWMIN )
278289*
279290 RETURN
280291*
0 commit comments