175 SUBROUTINE sgrqts( M, P, N, A, AF, Q, R, LDA, TAUA, B, BF, Z, T,
176 $ BWK, LDB, TAUB, WORK, LWORK, RWORK, RESULT )
183 INTEGER LDA, LDB, LWORK, M, P, N
186 REAL A( LDA, * ), AF( LDA, * ), R( LDA, * ),
188 $ b( ldb, * ), bf( ldb, * ), t( ldb, * ),
189 $ z( ldb, * ), bwk( ldb, * ),
190 $ taua( * ), taub( * ),
191 $ result( 4 ), rwork( * ), work( lwork )
198 parameter( zero = 0.0e+0, one = 1.0e+0 )
200 parameter( rogue = -1.0e+10 )
204 REAL ANORM, BNORM, ULP, UNFL, RESID
207 REAL SLAMCH, , SLANSY
208 EXTERNAL slamch,
slange, slansy
219 ulp = slamch(
'Precision' )
220 unfl = slamch(
'Safe minimum' )
224 CALL slacpy(
'Full', m, n, a, lda, af, lda )
225 CALL slacpy(
'Full', p, n, b, ldb, bf, ldb )
227 anorm =
max(
slange(
'1', m, n, a, lda, rwork ), unfl )
228 bnorm =
max(
slange(
'1', p, n, b, ldb, rwork ), unfl )
232 CALL sggrqf( m, p, n, af, lda, taua, bf, ldb, taub, work,
237 CALL slaset(
'Full', n, n, rogue, rogue, q, lda )
239 IF( m.GT.0 .AND. m.LT.n )
240 $
CALL slacpy(
'Full', m, n-m, af, lda, q( n-m+1, 1 ), lda )
243 $ q( n-m+2, n-m+1 ), lda )
246 $
CALL slacpy( 'lower
', N-1, N-1, AF( M-N+2, 1 ), LDA,
249 CALL SORGRQ( N, N, MIN( M, N ), Q, LDA, TAUA, WORK, LWORK, INFO )
253 CALL SLASET( 'full
', P, P, ROGUE, ROGUE, Z, LDB )
255 $ CALL SLACPY( 'lower
', P-1, N, BF( 2,1 ), LDB, Z( 2,1 ), LDB )
256 CALL SORGQR( P, P, MIN( P,N ), Z, LDB, TAUB, WORK, LWORK, INFO )
260 CALL SLASET( 'full
', M, N, ZERO, ZERO, R, LDA )
262 CALL SLACPY( 'upper
', M, M, AF( 1, N-M+1 ), LDA, R( 1, N-M+1 ),
265 CALL SLACPY( 'full
', M-N, N, AF, LDA, R, LDA )
266 CALL SLACPY( 'upper
', N, N, AF( M-N+1, 1 ), LDA, R( M-N+1, 1 ),
272 CALL SLASET( 'full
', P, N, ZERO, ZERO, T, LDB )
273 CALL SLACPY( 'upper
', P, N, BF, LDB, T, LDB )
277 CALL SGEMM( 'no transpose
', 'transpose
', M, N, N, -ONE, A, LDA, Q,
282 RESID = SLANGE( '1
', M, N, R, LDA, RWORK )
283.GT.
IF( ANORMZERO ) THEN
284 RESULT( 1 ) = ( ( RESID / REAL(MAX(1,M,N) ) ) / ANORM ) / ULP
291 CALL SGEMM( 'transpose
', 'no transpose
', P, N, P, ONE, Z, LDB, B,
292 $ LDB, ZERO, BWK, LDB )
293 CALL SGEMM( 'no transpose
', 'no transpose
', P, N, N, ONE, T, LDB,
294 $ Q, LDA, -ONE, BWK, LDB )
298 RESID = SLANGE( '1
', P, N, BWK, LDB, RWORK )
299.GT.
IF( BNORMZERO ) THEN
300 RESULT( 2 ) = ( ( RESID / REAL( MAX( 1,P,M ) ) )/BNORM ) / ULP
307 CALL SLASET( 'full
', N, N, ZERO, ONE, R, LDA )
308 CALL SSYRK( 'upper
', 'no transpose
', N, N, -ONE, Q, LDA, ONE, R,
313 RESID = SLANSY( '1
', 'upper
', N, R, LDA, RWORK )
314 RESULT( 3 ) = ( RESID / REAL( MAX( 1,N ) ) ) / ULP
318 CALL SLASET( 'full
', P, P, ZERO, ONE, T, LDB )
319 CALL SSYRK( 'upper
', 'transpose
', P, P, -ONE, Z, LDB, ONE, T,
324 RESID = SLANSY( '1
', 'upper
', P, T, LDB, RWORK )
325 RESULT( 4 ) = ( RESID / REAL( MAX( 1,P ) ) ) / ULP
subroutine slaset(uplo, m, n, alpha, beta, a, lda)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
real function slange(norm, m, n, a, lda, work)
SLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine sggrqf(m, p, n, a, lda, taua, b, ldb, taub, work, lwork, info)
SGGRQF
subroutine ssyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
SSYRK
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
subroutine sgrqts(m, p, n, a, af, q, r, lda, taua, b, bf, z, t, bwk, ldb, taub, work, lwork, rwork, result)
SGRQTS