83 SUBROUTINE stsqr01(TSSW, M, N, MB, NB, RESULT)
100 REAL,
ALLOCATABLE :: AF(:,:), Q(:,:),
101 $ R(:,:), RWORK(:), WORK( : ), T(:),
102 $ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:), LQ(:,:)
106 parameter( zero = 0.0, one = 1.0 )
109 LOGICAL TESTZEROS, TS
110 INTEGER INFO, J, K, L, LWORK, TSIZE, MNB
111 REAL ANORM, EPS, RESID, CNORM, DNORM
115 REAL TQUERY( 5 ), WORKQUERY( 1 )
118 REAL SLAMCH, SLANGE, SLANSY
121 EXTERNAL slamch,
slarnv, slange, slansy, lsame, ilaenv
129 COMMON / srnamc / srnamt
132 DATA iseed / 1988, 1989, 1990, 1991 /
136 ts = lsame(tssw,
'TS')
142 eps = slamch(
'Epsilon' )
150 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
152 $ d(n,m), df(n,m), lq(l,n) )
157 CALL slarnv( 2, iseed, m, a( 1, j ) )
162 CALL slarnv( 2, iseed, m/2, a( m/4, j ) )
166 CALL slacpy(
'Full', m, n, a, m, af, m )
172 CALL sgeqr( m, n, af, m, tquery, -1, workquery, -1, info )
173 tsize = int( tquery( 1 ) )
174 lwork = int( workquery( 1 ) )
175 CALL sgemqr(
'L',
'N', m, m, k, af, m, tquery, tsize, cf, m,
176 $ workquery, -1, info)
177 lwork =
max( lwork, int( workquery( 1 ) ) )
178 CALL sgemqr(
'L',
'N', m, n, k, af, m, tquery, tsize, cf, m,
179 $ workquery, -1, info)
180 lwork =
max( lwork, int( workquery( 1 ) ) )
181 CALL sgemqr(
'L',
'T', m, n, k, af, m, tquery, tsize, cf, m,
182 $ workquery, -1, info)
183 lwork =
max( lwork, int( workquery( 1 ) ) )
184 CALL sgemqr(
'R',
'N', n, m, k, af, m, tquery, tsize, df, n,
185 $ workquery, -1, info)
186 lwork =
max( lwork, int( workquery( 1 ) ) )
187 CALL sgemqr(
'R',
'T', n, m, k, af, m, tquery, tsize, df, n,
188 $ workquery, -1, info)
189 lwork =
max( lwork, int( workquery( 1 ) ) )
190 ALLOCATE ( t( tsize ) )
191 ALLOCATE ( work( lwork ) )
193 CALL sgeqr( m, n, af, m, t, tsize, work, lwork, info )
197 CALL slaset(
'Full', m, m, zero, one, q, m )
199 CALL sgemqr(
'L',
'N', m, m, k, af, m, t, tsize, q, m,
200 $ work, lwork, info )
204 CALL slaset(
'Full', m, n, zero, zero, r, m )
205 CALL slacpy(
'Upper', m, n, af, m, r, m )
209 CALL sgemm(
'T',
'N', m, n, m, -one, q, m, a, m, one, r, m )
210 anorm = slange(
'1', m, n, a, m, rwork )
211 resid = slange(
'1', m, n, r, m, rwork )
212 IF( anorm.GT.zero )
THEN
213 result( 1 ) = resid / (eps*
max(1,m)*anorm)
220 CALL slaset(
'Full', m, m, zero, one, r, m )
221 CALL ssyrk(
'U',
'C', m, m, -one, q, m, one, r, m )
222 resid = slansy(
'1',
'Upper', m, r, m, rwork )
223 result( 2 ) = resid / (eps*
max(1,m))
228 CALL slarnv( 2, iseed, m, c( 1, j ) )
230 cnorm = slange(
'1', m, n, c, m, rwork)
231 CALL slacpy(
'Full', m, n, c, m, cf, m )
236 CALL sgemqr( 'l
', 'n
', M, N, K, AF, M, T, TSIZE, CF, M,
241 CALL SGEMM( 'n
', 'n
', M, N, M, -ONE, Q, M, C, M, ONE, CF, M )
242 RESID = SLANGE( '1
', M, N, CF, M, RWORK )
243.GT.
IF( CNORMZERO ) THEN
244 RESULT( 3 ) = RESID / (EPS*MAX(1,M)*CNORM)
251 CALL SLACPY( 'full
', M, N, C, M, CF, M )
256 CALL SGEMQR( 'l
', 't
', M, N, K, AF, M, T, TSIZE, CF, M,
261 CALL SGEMM( 't
', 'n
', M, N, M, -ONE, Q, M, C, M, ONE, CF, M )
262 RESID = SLANGE( '1
', M, N, CF, M, RWORK )
263.GT.
IF( CNORMZERO ) THEN
264 RESULT( 4 ) = RESID / (EPS*MAX(1,M)*CNORM)
272 CALL SLARNV( 2, ISEED, N, D( 1, J ) )
274 DNORM = SLANGE( '1
', N, M, D, N, RWORK)
275 CALL SLACPY( 'full
', N, M, D, N, DF, N )
280 CALL SGEMQR( 'r
', 'n
', N, M, K, AF, M, T, TSIZE, DF, N,
285 CALL SGEMM( 'n
', 'n
', N, M, M, -ONE, D, N, Q, M, ONE, DF, N )
286 RESID = SLANGE( '1
', N, M, DF, N, RWORK )
287.GT.
IF( DNORMZERO ) THEN
288 RESULT( 5 ) = RESID / (EPS*MAX(1,M)*DNORM)
295 CALL SLACPY( 'full
', N, M, D, N, DF, N )
299 CALL SGEMQR( 'r
', 't
', N, M, K, AF, M, T, TSIZE, DF, N,
304 CALL SGEMM( 'n
', 't
', N, M, M, -ONE, D, N, Q, M, ONE, DF, N )
305 RESID = SLANGE( '1
', N, M, DF, N, RWORK )
306.GT.
IF( CNORMZERO ) THEN
307 RESULT( 6 ) = RESID / (EPS*MAX(1,M)*DNORM)
315 CALL SGELQ( M, N, AF, M, TQUERY, -1, WORKQUERY, -1, INFO )
316 TSIZE = INT( TQUERY( 1 ) )
317 LWORK = INT( WORKQUERY( 1 ))
318 CALL SGEMLQ( 'r
', 'n
', N, N, K, AF, M, TQUERY, TSIZE, Q, N,
319 $ WORKQUERY, -1, INFO )
320 LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) )
321 CALL SGEMLQ( 'l
', 'n
', N, M, K, AF, M, TQUERY, TSIZE, DF, N,
322 $ WORKQUERY, -1, INFO)
323 LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) )
324 CALL SGEMLQ( 'l
', 't
', N, M, K, AF, M, TQUERY, TSIZE, DF, N,
325 $ WORKQUERY, -1, INFO)
326 LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) )
327 CALL SGEMLQ( 'r
', 'n
', M, N, K, AF, M, TQUERY, TSIZE, CF, M,
328 $ WORKQUERY, -1, INFO)
329 LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) )
330 CALL SGEMLQ( 'r
', 't
', M, N, K, AF, M, TQUERY, TSIZE, CF, M,
331 $ WORKQUERY, -1, INFO)
332 LWORK = MAX( LWORK, INT( WORKQUERY( 1 ) ) )
333 ALLOCATE ( T( TSIZE ) )
334 ALLOCATE ( WORK( LWORK ) )
336 CALL SGELQ( M, N, AF, M, T, TSIZE, WORK, LWORK, INFO )
341 CALL SLASET( 'full
', N, N, ZERO, ONE, Q, N )
343 CALL SGEMLQ( 'r
', 'n
', N, N, K, AF, M, T, TSIZE, Q, N,
344 $ WORK, LWORK, INFO )
348 CALL SLASET( 'full
', M, N, ZERO, ZERO, LQ, L )
349 CALL SLACPY( 'lower
', M, N, AF, M, LQ, L )
353 CALL SGEMM( 'n
', 't
', M, N, N, -ONE, A, M, Q, N, ONE, LQ, L )
354 ANORM = SLANGE( '1
', M, N, A, M, RWORK )
355 RESID = SLANGE( '1
', M, N, LQ, L, RWORK )
356.GT.
IF( ANORMZERO ) THEN
357 RESULT( 1 ) = RESID / (EPS*MAX(1,N)*ANORM)
364 CALL SLASET( 'full
', N, N, ZERO, ONE, LQ, L )
365 CALL SSYRK( 'u
', 'c
', N, N, -ONE, Q, N, ONE, LQ, L )
366 RESID = SLANSY( '1
', 'upper
', N, LQ, L, RWORK )
367 RESULT( 2 ) = RESID / (EPS*MAX(1,N))
372 CALL SLARNV( 2, ISEED, N, D( 1, J ) )
374 DNORM = SLANGE( '1
', N, M, D, N, RWORK)
375 CALL SLACPY( 'full
', N, M, D, N, DF, N )
379 CALL SGEMLQ( 'l
', 'n
', N, M, K, AF, M, T, TSIZE, DF, N,
384 CALL SGEMM( 'n
', 'n
', N, M, N, -ONE, Q, N, D, N, ONE, DF, N )
385 RESID = SLANGE( '1
', N, M, DF, N, RWORK )
386.GT.
IF( DNORMZERO ) THEN
387 RESULT( 3 ) = RESID / (EPS*MAX(1,N)*DNORM)
394 CALL SLACPY( 'full
', N, M, D, N, DF, N )
398 CALL SGEMLQ( 'l
', 't
', N, M, K, AF, M, T, TSIZE, DF, N,
403 CALL SGEMM( 't
', 'n
', N, M, N, -ONE, Q, N, D, N, ONE, DF, N )
404 RESID = SLANGE( '1
', N, M, DF, N, RWORK )
405.GT.
IF( DNORMZERO ) THEN
406 RESULT( 4 ) = RESID / (EPS*MAX(1,N)*DNORM)
414 CALL SLARNV( 2, ISEED, M, C( 1, J ) )
416 CNORM = SLANGE( '1
', M, N, C, M, RWORK)
417 CALL SLACPY( 'full
', M, N, C, M, CF, M )
421 CALL SGEMLQ( 'r
', 'n
', M, N, K, AF, M, T, TSIZE, CF, M,
426 CALL SGEMM( 'n
', 'n
', M, N, N, -ONE, C, M, Q, N, ONE, CF, M )
427 RESID = SLANGE( '1
', N, M, DF, N, RWORK )
428.GT.
IF( CNORMZERO ) THEN
429 RESULT( 5 ) = RESID / (EPS*MAX(1,N)*CNORM)
436 CALL SLACPY( 'full
', M, N, C, M, CF, M )
440 CALL SGEMLQ( 'r
', 't
', M, N, K, AF, M, T, TSIZE, CF, M,
445 CALL SGEMM( 'n
', 't
', M, N, N, -ONE, C, M, Q, N, ONE, CF, M )
446 RESID = SLANGE( '1
', M, N, CF, M, RWORK )
447.GT.
IF( CNORMZERO ) THEN
448 RESULT( 6 ) = RESID / (EPS*MAX(1,N)*CNORM)
457 DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T, C, D, CF, DF)