191 SUBROUTINE zggglm( N, M, P, A, LDA, B, LDB, D, X, Y, WORK,
200 INTEGER INFO, LDA, LDB, LWORK, M, N, P
203 COMPLEX*16 A( LDA, * ), B( LDB, * ), D( * ), WORK( * ),
210 COMPLEX*16 CZERO, CONE
211 PARAMETER ( CZERO = ( 0.0d+0, 0.0d+0 ),
212 $ cone = ( 1.0d+0, 0.0d+0 ) )
216 INTEGER I, LOPT, LWKMIN, LWKOPT, NB, NB1, NB2, NB3,
229 INTRINSIC int, max, min
237 lquery = ( lwork.EQ.-1 )
240 ELSE IF( m.LT.0 .OR. m.GT.n )
THEN
242 ELSE IF( p.LT.0 .OR. p.LT.n-m )
THEN
244 ELSE IF( lda.LT.max( 1, n ) )
THEN
246 ELSE IF( ldb.LT.max( 1, n ) )
THEN
257 nb1 = ilaenv( 1,
'ZGEQRF',
' ', n, m, -1, -1 )
258 nb2 = ilaenv( 1,
'ZGERQF',
' ', n, m, -1, -1 )
259 nb3 = ilaenv( 1,
'ZUNMQR',
' ', n, m, p, -1 )
260 nb4 = ilaenv( 1,
'ZUNMRQ',
' ', n, m, p, -1 )
261 nb = max( nb1, nb2, nb3, nb4 )
263 lwkopt = m + np + max( n, p )*nb
267 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
273 CALL xerbla(
'ZGGGLM', -info )
275 ELSE IF( lquery )
THEN
300 CALL zggqrf( n, m, p, a, lda, work, b, ldb, work( m+1 ),
301 $ work( m+np+1 ), lwork-m-np, info )
302 lopt = int( work( m+np+1 ) )
307 CALL zunmqr(
'Left',
'Conjugate transpose', n, 1, m, a, lda,
309 $ d, max( 1, n ), work( m+np+1 ), lwork-m-np, info )
310 lopt = max( lopt, int( work( m+np+1 ) ) )
315 CALL ztrtrs(
'Upper',
'No transpose',
'Non unit', n-m, 1,
316 $ b( m+1, m+p-n+1 ), ldb, d( m+1 ), n-m, info )
323 CALL zcopy( n-m, d( m+1 ), 1, y( m+p-n+1 ), 1 )
328 DO 10 i = 1, m + p - n
334 CALL zgemv(
'No transpose', m, n-m, -cone, b( 1, m+p-n+1 ),
336 $ y( m+p-n+1 ), 1, cone, d, 1 )
341 CALL ztrtrs(
'Upper',
'No Transpose',
'Non unit', m, 1, a,
352 CALL zcopy( m, d, 1, x, 1 )
357 CALL zunmrq(
'Left',
'Conjugate transpose', p, 1, np,
358 $ b( max( 1, n-p+1 ), 1 ), ldb, work( m+1 ), y,
359 $ max( 1, p ), work( m+np+1 ), lwork-m-np, info )
360 work( 1 ) = m + np + max( lopt, int( work( m+np+1 ) ) )
subroutine zgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
ZGEMV
subroutine zggglm(n, m, p, a, lda, b, ldb, d, x, y, work, lwork, info)
ZGGGLM
subroutine zggqrf(n, m, p, a, lda, taua, b, ldb, taub, work, lwork, info)
ZGGQRF
subroutine zunmqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
ZUNMQR
subroutine zunmrq(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
ZUNMRQ