178 SUBROUTINE cgglse( M, N, P, A, LDA, B, LDB, C, D, X, WORK, LWORK,
186 INTEGER INFO, LDA, LDB, LWORK, M, N, P
189 COMPLEX A( LDA, * ), B( LDB, * ), C( * ), D( * ),
197 parameter( cone = ( 1.0e+0, 0.0e+0 ) )
201 INTEGER LOPT, LWKMIN, LWKOPT, MN, NB, NB1, NB2, NB3,
213 INTRINSIC int, max, min
221 lquery = ( lwork.EQ.-1 )
224 ELSE IF( n.LT.0 )
THEN
226 ELSE IF( p.LT.0 .OR. p.GT.n .OR. p.LT.n-m )
THEN
228 ELSE IF( lda.LT.max( 1, m ) )
THEN
230 ELSE IF( ldb.LT.max( 1, p ) )
THEN
241 nb1 = ilaenv( 1,
'CGEQRF',
' ', m, n, -1, -1 )
242 nb2 = ilaenv( 1,
'CGERQF',
' ', m, n, -1, -1 )
243 nb3 = ilaenv( 1,
'CUNMQR',
' ', m, n, p, -1 )
244 nb4 = ilaenv( 1,
'CUNMRQ',
' ', m, n, p, -1 )
245 nb = max( nb1, nb2, nb3, nb4 )
247 lwkopt = p + mn + max( m, n )*nb
251 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
257 CALL xerbla(
'CGGLSE', -info )
259 ELSE IF( lquery )
THEN
277 CALL cggrqf( p, m, n, b, ldb, work, a, lda, work( p+1 ),
278 $ work( p+mn+1 ), lwork-p-mn, info )
279 lopt = real( work( p+mn+1 ) )
284 CALL cunmqr(
'Left',
'Conjugate Transpose', m, 1, mn, a, lda,
285 $ work( p+1 ), c, max( 1, m ), work( p+mn+1 ),
287 lopt = max( lopt, int( work( p+mn+1 ) ) )
292 CALL ctrtrs(
'Upper',
'No transpose',
'Non-unit', p, 1,
293 $ b( 1, n-p+1 ), ldb, d, p, info )
302 CALL ccopy( p, d, 1, x( n-p+1 ), 1 )
306 CALL cgemv(
'No transpose', n-p, p, -cone, a( 1, n-p+1 ), lda,
313 CALL ctrtrs(
'Upper',
'No transpose',
'Non-unit', n-p, 1,
314 $ a, lda, c, n-p, info )
323 CALL ccopy( n-p, c, 1, x, 1 )
331 $
CALL cgemv(
'No transpose', nr, n-m, -cone, a( n-p+1, m+1 ),
332 $ lda, d( nr+1 ), 1, cone, c( n-p+1 ), 1 )
337 CALL ctrmv(
'Upper',
'No transpose',
'Non unit', nr,
338 $ a( n-p+1, n-p+1 ), lda, d, 1 )
339 CALL caxpy( nr, -cone, d, 1, c( n-p+1 ), 1 )
344 CALL cunmrq(
'Left',
'Conjugate Transpose', n, 1, p, b, ldb,
345 $ work( 1 ), x, n, work( p+mn+1 ), lwork-p-mn, info )
346 work( 1 ) = p + mn + max( lopt, int( work( p+mn+1 ) ) )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine caxpy(N, CA, CX, INCX, CY, INCY)
CAXPY
subroutine cgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
CGEMV
subroutine ctrmv(UPLO, TRANS, DIAG, N, A, LDA, X, INCX)
CTRMV
subroutine ctrtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
CTRTRS
subroutine cggrqf(M, P, N, A, LDA, TAUA, B, LDB, TAUB, WORK, LWORK, INFO)
CGGRQF
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
subroutine cgglse(M, N, P, A, LDA, B, LDB, C, D, X, WORK, LWORK, INFO)
CGGLSE solves overdetermined or underdetermined systems for OTHER matrices