178 SUBROUTINE sgglse( M, N, P, A, LDA, B, LDB, C, D, X, WORK, LWORK,
186 INTEGER INFO, LDA, LDB, LWORK, M, N, P
189 REAL A( LDA, * ), B( LDB, * ), C( * ), D( * ),
197 parameter( one = 1.0e+0 )
201 INTEGER LOPT, LWKMIN, LWKOPT, MN, NB, NB1, NB2, NB3,
211 EXTERNAL ilaenv, sroundup_lwork
214 INTRINSIC int, max, min
222 lquery = ( lwork.EQ.-1 )
225 ELSE IF( n.LT.0 )
THEN
227 ELSE IF( p.LT.0 .OR. p.GT.n .OR. p.LT.n-m )
THEN
229 ELSE IF( lda.LT.max( 1, m ) )
THEN
231 ELSE IF( ldb.LT.max( 1, p ) )
THEN
242 nb1 = ilaenv( 1,
'SGEQRF',
' ', m, n, -1, -1 )
243 nb2 = ilaenv( 1,
'SGERQF',
' ', m, n, -1, -1 )
244 nb3 = ilaenv( 1,
'SORMQR',
' ', m, n, p, -1 )
245 nb4 = ilaenv( 1,
'SORMRQ',
' ', m, n, p, -1 )
246 nb = max( nb1, nb2, nb3, nb4 )
248 lwkopt = p + mn + max( m, n )*nb
250 work( 1 ) = sroundup_lwork(lwkopt)
252 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN
258 CALL xerbla(
'SGGLSE', -info )
260 ELSE IF( lquery )
THEN
278 CALL sggrqf( p, m, n, b, ldb, work, a, lda, work( p+1 ),
279 $ work( p+mn+1 ), lwork-p-mn, info )
280 lopt = int( work( p+mn+1 ) )
285 CALL sormqr(
'Left',
'Transpose', m, 1, mn, a, lda, work( p+1 ),
286 $ c, max( 1, m ), work( p+mn+1 ), lwork-p-mn, info )
287 lopt = max( lopt, int( work( p+mn+1 ) ) )
292 CALL strtrs(
'Upper',
'No transpose',
'Non-unit', p, 1,
293 $ b( 1, n-p+1 ), ldb, d, p, info )
302 CALL scopy( p, d, 1, x( n-p+1 ), 1 )
306 CALL sgemv(
'No transpose', n-p, p, -one, a( 1, n-p+1 ), lda,
313 CALL strtrs(
'Upper',
'No transpose',
'Non-unit', n-p, 1,
314 $ a, lda, c, n-p, info )
323 CALL scopy( n-p, c, 1, x, 1 )
331 $
CALL sgemv(
'No transpose', nr, n-m, -one, a( n-p+1, m+1 ),
332 $ lda, d( nr+1 ), 1, one, c( n-p+1 ), 1 )
337 CALL strmv(
'Upper',
'No transpose',
'Non unit', nr,
338 $ a( n-p+1, n-p+1 ), lda, d, 1 )
339 CALL saxpy( nr, -one, d, 1, c( n-p+1 ), 1 )
344 CALL sormrq(
'Left',
'Transpose', n, 1, p, b, ldb, work( 1 ), x,
345 $ 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)
subroutine saxpy(n, sa, sx, incx, sy, incy)
SAXPY
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
subroutine sgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
SGEMV
subroutine sgglse(m, n, p, a, lda, b, ldb, c, d, x, work, lwork, info)
SGGLSE solves overdetermined or underdetermined systems for OTHER matrices
subroutine sggrqf(m, p, n, a, lda, taua, b, ldb, taub, work, lwork, info)
SGGRQF
subroutine strmv(uplo, trans, diag, n, a, lda, x, incx)
STRMV
subroutine strtrs(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info)
STRTRS
subroutine sormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
SORMQR
subroutine sormrq(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
SORMRQ