186 SUBROUTINE sgglse( M, N, P, A, LDA, B, LDB, C, D, X, WORK,
195 INTEGER INFO, LDA, LDB, LWORK, M, N, P
198 REAL A( LDA, * ), B( LDB, * ), C( * ), D( * ),
206 PARAMETER ( ONE = 1.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,
'SGEQRF',
' ', m, n, -1, -1 )
253 nb2 = ilaenv( 1,
'SGERQF',
' ', m, n, -1, -1 )
254 nb3 = ilaenv( 1,
'SORMQR',
' ', m, n, p, -1 )
255 nb4 = ilaenv( 1,
'SORMRQ',
' ', 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(
'SGGLSE', -info )
270 ELSE IF( lquery )
THEN
288 CALL sggrqf( 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 sormqr(
'Left',
'Transpose', m, 1, mn, a, lda,
297 $ c, max( 1, m ), work( p+mn+1 ), lwork-p-mn, info )
298 lopt = max( lopt, int( work( p+mn+1 ) ) )
303 CALL strtrs(
'Upper',
'No transpose',
'Non-unit', p, 1,
304 $ b( 1, n-p+1 ), ldb, d, p, info )
313 CALL scopy( p, d, 1, x( n-p+1 ), 1 )
317 CALL sgemv(
'No transpose', n-p, p, -one, a( 1, n-p+1 ),
325 CALL strtrs(
'Upper',
'No transpose',
'Non-unit', n-p, 1,
326 $ a, lda, c, n-p, info )
335 CALL scopy( n-p, c, 1, x, 1 )
343 $
CALL sgemv(
'No transpose', nr, n-m, -one, a( n-p+1,
345 $ lda, d( nr+1 ), 1, one, c( n-p+1 ), 1 )
350 CALL strmv(
'Upper',
'No transpose',
'Non unit', nr,
351 $ a( n-p+1, n-p+1 ), lda, d, 1 )
352 CALL saxpy( nr, -one, d, 1, c( n-p+1 ), 1 )
357 CALL sormrq(
'Left',
'Transpose', n, 1, p, b, ldb, work( 1 ),
359 $ n, work( p+mn+1 ), lwork-p-mn, info )
360 work( 1 ) = real( p + mn + max( lopt, int( work( p+mn+1 ) ) ) )
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 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