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 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 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 sormrq(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMRQ
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 sgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
SGEMV
subroutine strtrs(UPLO, TRANS, DIAG, N, NRHS, A, LDA, B, LDB, INFO)
STRTRS