83 SUBROUTINE dtsqr01(TSSW, M, N, MB, NB, RESULT)
94 DOUBLE PRECISION RESULT(6)
100 DOUBLE PRECISION,
ALLOCATABLE :: AF(:,:), Q(:,:),
101 $ R(:,:), RWORK(:), WORK( : ), T(:),
102 $ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:), LQ(:,:)
105 DOUBLE PRECISION ONE, ZERO
106 parameter( zero = 0.0, one = 1.0 )
109 LOGICAL TESTZEROS, TS
110 INTEGER INFO, J, K, L, LWORK, TSIZE, MNB
111 DOUBLE PRECISION ANORM, EPS, RESID, CNORM, DNORM
115 DOUBLE PRECISION TQUERY( 5 ), WORKQUERY( 1 )
118 DOUBLE PRECISION DLAMCH, DLANGE, DLANSY
121 EXTERNAL dlamch, dlange, dlansy, lsame, ilaenv
129 COMMON / srnamc / srnamt
132 DATA iseed / 1988, 1989, 1990, 1991 /
136 ts = lsame(tssw,
'TS')
142 eps = dlamch(
'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 dlarnv( 2, iseed, m, a( 1, j ) )
162 CALL dlarnv( 2, iseed, m/2, a( m/4, j ) )
166 CALL dlacpy(
'Full', m, n, a, m, af, m )
172 CALL dgeqr( m, n, af, m, tquery, -1, workquery, -1, info )
173 tsize = int( tquery( 1 ) )
174 lwork = int( workquery( 1 ) )
175 CALL dgemqr(
'L',
'N', m, m, k, af, m, tquery, tsize, cf, m,
176 $ workquery, -1, info)
177 lwork = max( lwork, int( workquery( 1 ) ) )
178 CALL dgemqr(
'L',
'N', m, n, k, af, m, tquery, tsize, cf, m,
179 $ workquery, -1, info)
180 lwork = max( lwork, int( workquery( 1 ) ) )
181 CALL dgemqr(
'L',
'T', m, n, k, af, m, tquery, tsize, cf, m,
182 $ workquery, -1, info)
183 lwork = max( lwork, int( workquery( 1 ) ) )
184 CALL dgemqr(
'R',
'N', n, m, k, af, m, tquery, tsize, df, n,
185 $ workquery, -1, info)
186 lwork = max( lwork, int( workquery( 1 ) ) )
187 CALL dgemqr(
'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 dgeqr( m, n, af, m, t, tsize, work, lwork, info )
197 CALL dlaset(
'Full', m, m, zero, one, q, m )
199 CALL dgemqr(
'L',
'N', m, m, k, af, m, t, tsize, q, m,
200 $ work, lwork, info )
204 CALL dlaset(
'Full', m, n, zero, zero, r, m )
205 CALL dlacpy(
'Upper', m, n, af, m, r, m )
209 CALL dgemm(
'T',
'N', m, n, m, -one, q, m, a, m, one, r, m )
210 anorm = dlange(
'1', m, n, a, m, rwork )
211 resid = dlange(
'1', m, n, r, m, rwork )
212 IF( anorm.GT.zero )
THEN
213 result( 1 ) = resid / (eps*max(1,m)*anorm)
220 CALL dlaset(
'Full', m, m, zero, one, r, m )
221 CALL dsyrk(
'U',
'C', m, m, -one, q, m, one, r, m )
222 resid = dlansy(
'1',
'Upper', m, r, m, rwork )
223 result( 2 ) = resid / (eps*max(1,m))
228 CALL dlarnv( 2, iseed, m, c( 1, j ) )
230 cnorm = dlange(
'1', m, n, c, m, rwork)
231 CALL dlacpy(
'Full', m, n, c, m, cf, m )
236 CALL dgemqr(
'L',
'N', m, n, k, af, m, t, tsize, cf, m,
241 CALL dgemm(
'N',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
242 resid = dlange(
'1', m, n, cf, m, rwork )
243 IF( cnorm.GT.zero )
THEN
244 result( 3 ) = resid / (eps*max(1,m)*cnorm)
251 CALL dlacpy(
'Full', m, n, c, m, cf, m )
256 CALL dgemqr(
'L',
'T', m, n, k, af, m, t, tsize, cf, m,
261 CALL dgemm(
'T',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
262 resid = dlange(
'1', m, n, cf, m, rwork )
263 IF( cnorm.GT.zero )
THEN
264 result( 4 ) = resid / (eps*max(1,m)*cnorm)
272 CALL dlarnv( 2, iseed, n, d( 1, j ) )
274 dnorm = dlange(
'1', n, m, d, n, rwork)
275 CALL dlacpy(
'Full', n, m, d, n, df, n )
280 CALL dgemqr(
'R',
'N', n, m, k, af, m, t, tsize, df, n,
285 CALL dgemm(
'N',
'N', n, m, m, -one, d, n, q, m, one, df, n )
286 resid = dlange(
'1', n, m, df, n, rwork )
287 IF( dnorm.GT.zero )
THEN
288 result( 5 ) = resid / (eps*max(1,m)*dnorm)
295 CALL dlacpy(
'Full', n, m, d, n, df, n )
299 CALL dgemqr(
'R',
'T', n, m, k, af, m, t, tsize, df, n,
304 CALL dgemm(
'N',
'T', n, m, m, -one, d, n, q, m, one, df, n )
305 resid = dlange(
'1', n, m, df, n, rwork )
306 IF( cnorm.GT.zero )
THEN
307 result( 6 ) = resid / (eps*max(1,m)*dnorm)
315 CALL dgelq( m, n, af, m, tquery, -1, workquery, -1, info )
316 tsize = int( tquery( 1 ) )
317 lwork = int( workquery( 1 ) )
318 CALL dgemlq(
'R',
'N', n, n, k, af, m, tquery, tsize, q, n,
319 $ workquery, -1, info )
320 lwork = max( lwork, int( workquery( 1 ) ) )
321 CALL dgemlq(
'L',
'N', n, m, k, af, m, tquery, tsize, df, n,
322 $ workquery, -1, info)
323 lwork = max( lwork, int( workquery( 1 ) ) )
324 CALL dgemlq(
'L',
'T', n, m, k, af, m, tquery, tsize, df, n,
325 $ workquery, -1, info)
326 lwork = max( lwork, int( workquery( 1 ) ) )
327 CALL dgemlq(
'R',
'N', m, n, k, af, m, tquery, tsize, cf, m,
328 $ workquery, -1, info)
329 lwork = max( lwork, int( workquery( 1 ) ) )
330 CALL dgemlq(
'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 dgelq( m, n, af, m, t, tsize, work, lwork, info )
341 CALL dlaset(
'Full', n, n, zero, one, q, n )
343 CALL dgemlq(
'R',
'N', n, n, k, af, m, t, tsize, q, n,
344 $ work, lwork, info )
348 CALL dlaset(
'Full', m, n, zero, zero, lq, l )
349 CALL dlacpy(
'Lower', m, n, af, m, lq, l )
353 CALL dgemm(
'N',
'T', m, n, n, -one, a, m, q, n, one, lq, l )
354 anorm = dlange(
'1', m, n, a, m, rwork )
355 resid = dlange(
'1', m, n, lq, l, rwork )
356 IF( anorm.GT.zero )
THEN
357 result( 1 ) = resid / (eps*max(1,n)*anorm)
364 CALL dlaset(
'Full', n, n, zero, one, lq, l )
365 CALL dsyrk(
'U',
'C', n, n, -one, q, n, one, lq, l )
366 resid = dlansy(
'1',
'Upper', n, lq, l, rwork )
367 result( 2 ) = resid / (eps*max(1,n))
372 CALL dlarnv( 2, iseed, n, d( 1, j ) )
374 dnorm = dlange(
'1', n, m, d, n, rwork)
375 CALL dlacpy(
'Full', n, m, d, n, df, n )
379 CALL dgemlq(
'L',
'N', n, m, k, af, m, t, tsize, df, n,
384 CALL dgemm(
'N',
'N', n, m, n, -one, q, n, d, n, one, df, n )
385 resid = dlange(
'1', n, m, df, n, rwork )
386 IF( dnorm.GT.zero )
THEN
387 result( 3 ) = resid / (eps*max(1,n)*dnorm)
394 CALL dlacpy(
'Full', n, m, d, n, df, n )
398 CALL dgemlq(
'L',
'T', n, m, k, af, m, t, tsize, df, n,
403 CALL dgemm(
'T',
'N', n, m, n, -one, q, n, d, n, one, df, n )
404 resid = dlange(
'1', n, m, df, n, rwork )
405 IF( dnorm.GT.zero )
THEN
406 result( 4 ) = resid / (eps*max(1,n)*dnorm)
414 CALL dlarnv( 2, iseed, m, c( 1, j ) )
416 cnorm = dlange(
'1', m, n, c, m, rwork)
417 CALL dlacpy(
'Full', m, n, c, m, cf, m )
421 CALL dgemlq(
'R',
'N', m, n, k, af, m, t, tsize, cf, m,
426 CALL dgemm(
'N',
'N', m, n, n, -one, c, m, q, n, one, cf, m )
427 resid = dlange(
'1', n, m, df, n, rwork )
428 IF( cnorm.GT.zero )
THEN
429 result( 5 ) = resid / (eps*max(1,n)*cnorm)
436 CALL dlacpy(
'Full', m, n, c, m, cf, m )
440 CALL dgemlq(
'R',
'T', m, n, k, af, m, t, tsize, cf, m,
445 CALL dgemm(
'N',
'T', m, n, n, -one, c, m, q, n, one, cf, m )
446 resid = dlange(
'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 dtsqr01(tssw, m, n, mb, nb, result)
DTSQR01
subroutine dgelq(m, n, a, lda, t, tsize, work, lwork, info)
DGELQ
subroutine dgemlq(side, trans, m, n, k, a, lda, t, tsize, c, ldc, work, lwork, info)
DGEMLQ
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dgemqr(side, trans, m, n, k, a, lda, t, tsize, c, ldc, work, lwork, info)
DGEMQR
subroutine dgeqr(m, n, a, lda, t, tsize, work, lwork, info)
DGEQR
subroutine dsyrk(uplo, trans, n, k, alpha, a, lda, beta, c, ldc)
DSYRK
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlarnv(idist, iseed, n, x)
DLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.