178 SUBROUTINE dgglse( M, N, P, A, LDA, B, LDB, C, D, X, WORK, LWORK,
186 INTEGER INFO, LDA, LDB, LWORK, M, N, P
189 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), C( * ), D( * ),
197 parameter( one = 1.0d+0 )
201 INTEGER LOPT, LWKMIN, LWKOPT, MN, NB, NB1, NB2, NB3,
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, '
dgeqrf', ' ', M, N, -1, -1 )
242 NB2 = ILAENV( 1, 'dgerqf', ' ', M, N, -1, -1 )
243 NB3 = ILAENV( 1, 'dormqr', ' ', M, N, P, -1 )
244 NB4 = ILAENV( 1, 'dormrq', ' ', M, N, P, -1 )
245 NB = MAX( NB1, NB2, NB3, NB4 )
247 LWKOPT = P + MN + MAX( M, N )*NB
251.LT..AND..NOT.
IF( LWORKLWKMIN LQUERY ) THEN
257 CALL XERBLA( 'dgglse', -INFO )
259 ELSE IF( LQUERY ) THEN
277 CALL DGGRQF( P, M, N, B, LDB, WORK, A, LDA, WORK( P+1 ),
278 $ WORK( P+MN+1 ), LWORK-P-MN, INFO )
279 LOPT = WORK( P+MN+1 )
284 CALL DORMQR( '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 DTRTRS( 'upper
', 'no transpose
', 'non-unit
', P, 1,
292 $ B( 1, N-P+1 ), LDB, D, P, INFO )
301 CALL DCOPY( P, D, 1, X( N-P+1 ), 1 )
305 CALL DGEMV( 'no transpose
', N-P, P, -ONE, A( 1, N-P+1 ), LDA,
312 CALL DTRTRS( 'upper
', 'no transpose
', 'non-unit
', N-P, 1,
313 $ A, LDA, C, N-P, INFO )
322 CALL DCOPY( N-P, C, 1, X, 1 )
330 $ CALL DGEMV( '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 DTRMV( 'upper
', 'no transpose
', 'non unit
', NR,
337 $ A( N-P+1, N-P+1 ), LDA, D, 1 )
338 CALL DAXPY( NR, -ONE, D, 1, C( N-P+1 ), 1 )
343 CALL DORMRQ( '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 dgerqf(m, n, a, lda, tau, work, lwork, info)
DGERQF
subroutine dgeqrf(m, n, a, lda, tau, work, lwork, info)
DGEQRF
subroutine dormqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
DORMQR
subroutine dggrqf(m, p, n, a, lda, taua, b, ldb, taub, work, lwork, info)
DGGRQF
subroutine dtrtrs(uplo, trans, diag, n, nrhs, a, lda, b, ldb, info)
DTRTRS
subroutine dormrq(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
DORMRQ
subroutine dgglse(m, n, p, a, lda, b, ldb, c, d, x, work, lwork, info)
DGGLSE solves overdetermined or underdetermined systems for OTHER matrices
subroutine daxpy(n, da, dx, incx, dy, incy)
DAXPY
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV
subroutine dtrmv(uplo, trans, diag, n, a, lda, x, incx)
DTRMV