186 SUBROUTINE cgglse( M, N, P, A, LDA, B, LDB, C, D, X, WORK,
195 INTEGER INFO, LDA, LDB, LWORK, M, N, P
198 COMPLEX A( LDA, * ), B( LDB, * ), C( * ), D( * ),
206 PARAMETER ( CONE = ( 1.0e+0, 0.0e+0 ) )
210 INTEGER LOPT, LWKMIN, LWKOPT, MN, NB, NB1, NB2, NB3,
221 EXTERNAL ilaenv, sroundup_lwork
224 INTRINSIC int, max, min
232 lquery = ( lwork.EQ.-1 )
235 ELSE IF( n.LT.0 )
THEN
237 ELSE IF( p.LT.0 .OR. p.GT.n .OR. p.LT.n-m )
THEN
239 ELSE IF( lda.LT.max( 1, m ) )
THEN
241 ELSE IF( ldb.LT.max( 1, p ) )
THEN
252 nb1 = ilaenv( 1,
'CGEQRF',
' ', m, n, -1, -1 )
253 nb2 = ilaenv( 1,
'CGERQF',
' ', m, n, -1, -1 )
254 nb3 = ilaenv( 1,
'CUNMQR',
' ', m, n, p, -1 )
255 nb4 = ilaenv( 1,
'CUNMRQ',
' ', m, n, p, -1 )
256 nb = max( nb1, nb2, nb3, nb4 )
258 lwkopt = p + mn + max( m, n )*nb
260 work( 1 ) = sroundup_lwork(lwkopt)
262 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
268 CALL xerbla(
'CGGLSE', -info )
270 ELSE IF( lquery )
THEN
288 CALL cggrqf( p, m, n, b, ldb, work, a, lda, work( p+1 ),
289 $ work( p+mn+1 ), lwork-p-mn, info )
290 lopt = int( work( p+mn+1 ) )
295 CALL cunmqr(
'Left',
'Conjugate Transpose', m, 1, mn, a, lda,
296 $ work( p+1 ), c, max( 1, m ), work( p+mn+1 ),
298 lopt = max( lopt, int( work( p+mn+1 ) ) )
303 CALL ctrtrs(
'Upper',
'No transpose',
'Non-unit', p, 1,
304 $ b( 1, n-p+1 ), ldb, d, p, info )
313 CALL ccopy( p, d, 1, x( n-p+1 ), 1 )
317 CALL cgemv(
'No transpose', n-p, p, -cone, a( 1, n-p+1 ),
325 CALL ctrtrs(
'Upper',
'No transpose',
'Non-unit', n-p, 1,
326 $ a, lda, c, n-p, info )
335 CALL ccopy( n-p, c, 1, x, 1 )
343 $
CALL cgemv(
'No transpose', nr, n-m, -cone, a( n-p+1,
345 $ lda, d( nr+1 ), 1, cone, c( n-p+1 ), 1 )
350 CALL ctrmv(
'Upper',
'No transpose',
'Non unit', nr,
351 $ a( n-p+1, n-p+1 ), lda, d, 1 )
352 CALL caxpy( nr, -cone, d, 1, c( n-p+1 ), 1 )
357 CALL cunmrq(
'Left',
'Conjugate Transpose', n, 1, p, b, ldb,
358 $ work( 1 ), x, n, work( p+mn+1 ), lwork-p-mn, info )
359 work( 1 ) = cmplx( p + mn + max( lopt, int( work( p+mn+1 ) ) ) )
subroutine cgglse(m, n, p, a, lda, b, ldb, c, d, x, work, lwork, info)
CGGLSE solves overdetermined or underdetermined systems for OTHER matrices
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