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 IF( cnorm.GT.zero )
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 IF( cnorm.GT.zero )
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 IF( dnorm.GT.zero )
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 IF( cnorm.GT.zero )
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 IF( anorm.GT.zero )
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 IF( dnorm.GT.zero )
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 IF( dnorm.GT.zero )
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 IF( cnorm.GT.zero )
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 IF( cnorm.GT.zero )
THEN
448 result( 6 ) = resid / (eps*max(1,n)*cnorm)
457 DEALLOCATE ( a, af, q, r, rwork, work, t, c, d, cf, df)
subroutine sgelq(m, n, a, lda, t, tsize, work, lwork, info)
SGELQ
subroutine sgemlq(side, trans, m, n, k, a, lda, t, tsize, c, ldc, work, lwork, info)
SGEMLQ
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
subroutine sgemqr(side, trans, m, n, k, a, lda, t, tsize, c, ldc, work, lwork, info)
SGEMQR
subroutine sgeqr(m, n, a, lda, t, tsize, work, lwork, info)
SGEQR
subroutine ssyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
SSYRK
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
subroutine slarnv(idist, iseed, n, x)
SLARNV returns a vector of random numbers from a uniform or normal distribution.
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 stsqr01(tssw, m, n, mb, nb, result)
STSQR01