186 SUBROUTINE zgglse( M, N, P, A, LDA, B, LDB, C, D, X, WORK,
195 INTEGER INFO, LDA, LDB, LWORK, M, N, P
198 COMPLEX*16 A( LDA, * ), B( LDB, * ), C( * ), D( * ),
206 PARAMETER ( CONE = ( 1.0d+0, 0.0d+0 ) )
210 INTEGER LOPT, LWKMIN, LWKOPT, MN, NB, NB1, NB2, NB3,
223 INTRINSIC int, max, min
231 lquery = ( lwork.EQ.-1 )
234 ELSE IF( n.LT.0 )
THEN
236 ELSE IF( p.LT.0 .OR. p.GT.n .OR. p.LT.n-m )
THEN
238 ELSE IF( lda.LT.max( 1, m ) )
THEN
240 ELSE IF( ldb.LT.max( 1, p ) )
THEN
251 nb1 = ilaenv( 1,
'ZGEQRF',
' ', m, n, -1, -1 )
252 nb2 = ilaenv( 1,
'ZGERQF',
' ', m, n, -1, -1 )
253 nb3 = ilaenv( 1,
'ZUNMQR',
' ', m, n, p, -1 )
254 nb4 = ilaenv( 1,
'ZUNMRQ',
' ', m, n, p, -1 )
255 nb = max( nb1, nb2, nb3, nb4 )
257 lwkopt = p + mn + max( m, n )*nb
261 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
267 CALL xerbla(
'ZGGLSE', -info )
269 ELSE IF( lquery )
THEN
287 CALL zggrqf( p, m, n, b, ldb, work, a, lda, work( p+1 ),
288 $ work( p+mn+1 ), lwork-p-mn, info )
289 lopt = int( work( p+mn+1 ) )
294 CALL zunmqr(
'Left',
'Conjugate Transpose', m, 1, mn, a, lda,
295 $ work( p+1 ), c, max( 1, m ), work( p+mn+1 ),
297 lopt = max( lopt, int( work( p+mn+1 ) ) )
302 CALL ztrtrs(
'Upper',
'No transpose',
'Non-unit', p, 1,
303 $ b( 1, n-p+1 ), ldb, d, p, info )
312 CALL zcopy( p, d, 1, x( n-p+1 ), 1 )
316 CALL zgemv(
'No transpose', n-p, p, -cone, a( 1, n-p+1 ),
324 CALL ztrtrs(
'Upper',
'No transpose',
'Non-unit', n-p, 1,
325 $ a, lda, c, n-p, info )
334 CALL zcopy( n-p, c, 1, x, 1 )
342 $
CALL zgemv(
'No transpose', nr, n-m, -cone, a( n-p+1,
344 $ lda, d( nr+1 ), 1, cone, c( n-p+1 ), 1 )
349 CALL ztrmv(
'Upper',
'No transpose',
'Non unit', nr,
350 $ a( n-p+1, n-p+1 ), lda, d, 1 )
351 CALL zaxpy( nr, -cone, d, 1, c( n-p+1 ), 1 )
356 CALL zunmrq(
'Left',
'Conjugate Transpose', n, 1, p, b, ldb,
357 $ work( 1 ), x, n, work( p+mn+1 ), lwork-p-mn, info )
358 work( 1 ) = p + mn + max( lopt, int( work( p+mn+1 ) ) )
subroutine zgglse(m, n, p, a, lda, b, ldb, c, d, x, work, lwork, info)
ZGGLSE solves overdetermined or underdetermined systems for OTHER matrices
subroutine zggrqf(m, p, n, a, lda, taua, b, ldb, taub, work, lwork, info)
ZGGRQF
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