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,
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,
'SGEQRF',
' ', m, n, -1, -1 )
242 nb2 = ilaenv( 1,
'SGERQF',
' ', m, n, -1, -1 )
243 nb3 = ilaenv( 1,
'SORMQR',
' ', m, n, p, -1 )
244 nb4 = ilaenv( 1,
'SORMRQ',
' ', 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(
'SGGLSE', -info )
259 ELSE IF( lquery )
THEN
277 CALL sggrqf( p, m, n, b, ldb, work, a, lda, work( p+1 ),
278 $ work( p+mn+1 ), lwork-p-mn, info )
279 lopt = int( work( p+mn+1 ) )
284 CALL sormqr(
'Left',
'Transpose', m, 1, mn, a, lda, work( p+1 ),
285 $ c, max( 1, m ), work( p+mn+1 ), lwork-p-mn, info )
286 lopt = max( lopt, int( work( p+mn+1 ) ) )
291 CALL strtrs(
'Upper',
'No transpose',
'Non-unit', p, 1,
292 $ b( 1, n-p+1 ), ldb, d, p, info )
301 CALL scopy( p, d, 1, x( n-p+1 ), 1 )
305 CALL sgemv(
'No transpose', n-p, p, -one, a( 1, n-p+1 ), lda,
312 CALL strtrs(
'Upper',
'No transpose',
'Non-unit', n-p, 1,
313 $ a, lda, c, n-p, info )
322 CALL scopy( n-p, c, 1, x, 1 )
330 $
CALL sgemv(
'No transpose', nr, n-m, -one, a( n-p+1, m+1 ),
331 $ lda, d( nr+1 ), 1, one, c( n-p+1 ), 1 )
336 CALL strmv(
'Upper',
'No transpose',
'Non unit', nr,
337 $ a( n-p+1, n-p+1 ), lda, d, 1 )
338 CALL saxpy( nr, -one, d, 1, c( n-p+1 ), 1 )
343 CALL sormrq(
'Left',
'Transpose', n, 1, p, b, ldb, work( 1 ), x,
344 $ n, work( p+mn+1 ), lwork-p-mn, info )
345 work( 1 ) = p + mn + max( lopt, int( work( p+mn+1 ) ) )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sormrq(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMRQ
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 sggrqf(M, P, N, A, LDA, TAUA, B, LDB, TAUB, WORK, LWORK, INFO)
SGGRQF
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 scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine saxpy(N, SA, SX, INCX, SY, INCY)
SAXPY
subroutine strmv(UPLO, TRANS, DIAG, N, A, LDA, X, INCX)
STRMV
subroutine sgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
SGEMV