183 SUBROUTINE sggglm( N, M, P, A, LDA, B, LDB, D, X, Y, WORK, LWORK,
191 INTEGER INFO, LDA, LDB, LWORK, M, N, P
194 REAL A( lda, * ), B( ldb, * ), D( * ), WORK( * ),
202 parameter( zero = 0.0e+0, one = 1.0e+0 )
206 INTEGER I, LOPT, LWKMIN, LWKOPT, NB, NB1, NB2, NB3,
218 INTRINSIC int, max, min
226 lquery = ( lwork.EQ.-1 )
229 ELSE IF( m.LT.0 .OR. m.GT.n )
THEN 231 ELSE IF( p.LT.0 .OR. p.LT.n-m )
THEN 233 ELSE IF( lda.LT.max( 1, n ) )
THEN 235 ELSE IF( ldb.LT.max( 1, n ) )
THEN 246 nb1 = ilaenv( 1,
'SGEQRF',
' ', n, m, -1, -1 )
247 nb2 = ilaenv( 1,
'SGERQF',
' ', n, m, -1, -1 )
248 nb3 = ilaenv( 1,
'SORMQR',
' ', n, m, p, -1 )
249 nb4 = ilaenv( 1,
'SORMRQ',
' ', n, m, p, -1 )
250 nb = max( nb1, nb2, nb3, nb4 )
252 lwkopt = m + np + max( n, p )*nb
256 IF( lwork.LT.lwkmin .AND. .NOT.lquery )
THEN 262 CALL xerbla(
'SGGGLM', -info )
264 ELSE IF( lquery )
THEN 289 CALL sggqrf( n, m, p, a, lda, work, b, ldb, work( m+1 ),
290 $ work( m+np+1 ), lwork-m-np, info )
291 lopt = int( work( m+np+1 ) )
296 CALL sormqr(
'Left',
'Transpose', n, 1, m, a, lda, work, d,
297 $ max( 1, n ), work( m+np+1 ), lwork-m-np, info )
298 lopt = max( lopt, int( work( m+np+1 ) ) )
303 CALL strtrs(
'Upper',
'No transpose',
'Non unit', n-m, 1,
304 $ b( m+1, m+p-n+1 ), ldb, d( m+1 ), n-m, info )
311 CALL scopy( n-m, d( m+1 ), 1, y( m+p-n+1 ), 1 )
316 DO 10 i = 1, m + p - n
322 CALL sgemv(
'No transpose', m, n-m, -one, b( 1, m+p-n+1 ), ldb,
323 $ y( m+p-n+1 ), 1, one, d, 1 )
328 CALL strtrs(
'Upper',
'No Transpose',
'Non unit', m, 1, a, lda,
338 CALL scopy( m, d, 1, x, 1 )
343 CALL sormrq(
'Left',
'Transpose', p, 1, np,
344 $ b( max( 1, n-p+1 ), 1 ), ldb, work( m+1 ), y,
345 $ max( 1, p ), work( m+np+1 ), lwork-m-np, info )
346 work( 1 ) = m + np + max( lopt, int( work( m+np+1 ) ) )
subroutine sggglm(N, M, P, A, LDA, B, LDB, D, X, Y, WORK, LWORK, INFO)
SGGGLM
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sormqr(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMQR
subroutine sggqrf(N, M, P, A, LDA, TAUA, B, LDB, TAUB, WORK, LWORK, INFO)
SGGQRF
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sormrq(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
SORMRQ
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