183 SUBROUTINE cggglm( N, M, P, A, LDA, B, LDB, D, X, Y, WORK, LWORK,
191 INTEGER INFO, LDA, LDB, LWORK, M, N, P
194 COMPLEX A( LDA, * ), B( LDB, * ), D( * ), WORK( * ),
202 parameter( czero = ( 0.0e+0, 0.0e+0 ),
203 $ cone = ( 1.0e+0, 0.0e+0 ) )
207 INTEGER I, LOPT, LWKMIN, LWKOPT, NB, NB1, NB2, NB3,
217 EXTERNAL ilaenv, sroundup_lwork
220 INTRINSIC int, max, min
228 lquery = ( lwork.EQ.-1 )
231 ELSE IF( m.LT.0 .OR. m.GT.n )
THEN
233 ELSE IF( p.LT.0 .OR. p.LT.n-m )
THEN
235 ELSE IF( lda.LT.max( 1, n ) )
THEN
237 ELSE IF( ldb.LT.max( 1, n ) )
THEN
248 nb1 = ilaenv( 1,
'CGEQRF',
' ', n, m, -1, -1 )
249 nb2 = ilaenv( 1,
'CGERQF',
' ', n, m, -1, -1 )
250 nb3 = ilaenv( 1,
'CUNMQR',
' ', n, m, p, -1 )
251 nb4 = ilaenv( 1,
'CUNMRQ',
' ', n, m, p, -1 )
252 nb = max( nb1, nb2, nb3, nb4 )
254 lwkopt = m + np + max( n, p )*nb
256 work( 1 ) = sroundup_lwork(lwkopt)
258 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
264 CALL xerbla(
'CGGGLM', -info )
266 ELSE IF( lquery )
THEN
291 CALL cggqrf( n, m, p, a, lda, work, b, ldb, work( m+1 ),
292 $ work( m+np+1 ), lwork-m-np, info )
293 lopt = int( work( m+np+1 ) )
298 CALL cunmqr(
'Left',
'Conjugate transpose', n, 1, m, a, lda, work,
299 $ d, max( 1, n ), work( m+np+1 ), lwork-m-np, info )
300 lopt = max( lopt, int( work( m+np+1 ) ) )
305 CALL ctrtrs(
'Upper',
'No transpose',
'Non unit', n-m, 1,
306 $ b( m+1, m+p-n+1 ), ldb, d( m+1 ), n-m, info )
313 CALL ccopy( n-m, d( m+1 ), 1, y( m+p-n+1 ), 1 )
318 DO 10 i = 1, m + p - n
324 CALL cgemv(
'No transpose', m, n-m, -cone, b( 1, m+p-n+1 ), ldb,
325 $ y( m+p-n+1 ), 1, cone, d, 1 )
330 CALL ctrtrs(
'Upper',
'No Transpose',
'Non unit', m, 1, a, lda,
340 CALL ccopy( m, d, 1, x, 1 )
345 CALL cunmrq(
'Left',
'Conjugate transpose', p, 1, np,
346 $ b( max( 1, n-p+1 ), 1 ), ldb, work( m+1 ), y,
347 $ max( 1, p ), work( m+np+1 ), lwork-m-np, info )
348 work( 1 ) = m + np + max( lopt, int( work( m+np+1 ) ) )
subroutine xerbla(srname, info)
subroutine ccopy(n, cx, incx, cy, incy)
CCOPY
subroutine cgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
CGEMV
subroutine cggglm(n, m, p, a, lda, b, ldb, d, x, y, work, lwork, info)
CGGGLM
subroutine cggqrf(n, m, p, a, lda, taua, b, ldb, taub, work, lwork, info)
CGGQRF
subroutine ctrtrs(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info)
CTRTRS
subroutine cunmqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
CUNMQR
subroutine cunmrq(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
CUNMRQ