92 DOUBLE PRECISION RESULT(6)
98 COMPLEX*16,
ALLOCATABLE :: AF(:,:), Q(:,:),
99 $ R(:,:), RWORK(:), WORK( : ), T(:),
100 $ CF(:,:), DF(:,:), A(:,:), C(:,:), D(:,:), LQ(:,:)
103 DOUBLE PRECISION ZERO
104 COMPLEX*16 ONE, CZERO
105 parameter( zero = 0.0, one = (1.0,0.0), czero=(0.0,0.0) )
108 LOGICAL TESTZEROS, TS
109 INTEGER INFO, J, K, L, LWORK, TSIZE, MNB
110 DOUBLE PRECISION ANORM, EPS, RESID, CNORM, DNORM
114 COMPLEX*16 TQUERY( 5 ), WORKQUERY( 1 )
117 DOUBLE PRECISION DLAMCH, ZLANGE, ZLANSY
128 COMMON / srnamc / srnamt
131 DATA iseed / 1988, 1989, 1990, 1991 /
135 ts =
lsame(tssw,
'TS')
149 ALLOCATE ( a(m,n), af(m,n), q(l,l), r(m,l), rwork(l),
151 $ d(n,m), df(n,m), lq(l,n) )
156 CALL zlarnv( 2, iseed, m, a( 1, j ) )
161 CALL zlarnv( 2, iseed, m/2, a( m/4, j ) )
165 CALL zlacpy(
'Full', m, n, a, m, af, m )
171 CALL zgeqr( m, n, af, m, tquery, -1, workquery, -1, info )
172 tsize = int( tquery( 1 ) )
173 lwork = int( workquery( 1 ) )
174 CALL zgemqr(
'L',
'N', m, m, k, af, m, tquery, tsize, cf, m,
175 $ workquery, -1, info)
176 lwork = max( lwork, int( workquery( 1 ) ) )
177 CALL zgemqr(
'L',
'N', m, n, k, af, m, tquery, tsize, cf, m,
178 $ workquery, -1, info)
179 lwork = max( lwork, int( workquery( 1 ) ) )
180 CALL zgemqr(
'L',
'C', m, n, k, af, m, tquery, tsize, cf, m,
181 $ workquery, -1, info)
182 lwork = max( lwork, int( workquery( 1 ) ) )
183 CALL zgemqr(
'R',
'N', n, m, k, af, m, tquery, tsize, df, n,
184 $ workquery, -1, info)
185 lwork = max( lwork, int( workquery( 1 ) ) )
186 CALL zgemqr(
'R',
'C', n, m, k, af, m, tquery, tsize, df, n,
187 $ workquery, -1, info)
188 lwork = max( lwork, int( workquery( 1 ) ) )
189 ALLOCATE ( t( tsize ) )
190 ALLOCATE ( work( lwork ) )
192 CALL zgeqr( m, n, af, m, t, tsize, work, lwork, info )
196 CALL zlaset(
'Full', m, m, czero, one, q, m )
198 CALL zgemqr(
'L',
'N', m, m, k, af, m, t, tsize, q, m,
199 $ work, lwork, info )
203 CALL zlaset(
'Full', m, n, czero, czero, r, m )
204 CALL zlacpy(
'Upper', m, n, af, m, r, m )
208 CALL zgemm(
'C',
'N', m, n, m, -one, q, m, a, m, one, r, m )
209 anorm =
zlange(
'1', m, n, a, m, rwork )
210 resid =
zlange(
'1', m, n, r, m, rwork )
211 IF( anorm.GT.zero )
THEN
212 result( 1 ) = resid / (eps*max(1,m)*anorm)
219 CALL zlaset(
'Full', m, m, czero, one, r, m )
220 CALL zherk(
'U',
'C', m, m, dreal(-one), q, m, dreal(one), r, m )
221 resid =
zlansy(
'1',
'Upper', m, r, m, rwork )
222 result( 2 ) = resid / (eps*max(1,m))
227 CALL zlarnv( 2, iseed, m, c( 1, j ) )
229 cnorm =
zlange(
'1', m, n, c, m, rwork)
230 CALL zlacpy(
'Full', m, n, c, m, cf, m )
235 CALL zgemqr(
'L',
'N', m, n, k, af, m, t, tsize, cf, m,
240 CALL zgemm(
'N',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
241 resid =
zlange(
'1', m, n, cf, m, rwork )
242 IF( cnorm.GT.zero )
THEN
243 result( 3 ) = resid / (eps*max(1,m)*cnorm)
250 CALL zlacpy(
'Full', m, n, c, m, cf, m )
255 CALL zgemqr(
'L',
'C', m, n, k, af, m, t, tsize, cf, m,
260 CALL zgemm(
'C',
'N', m, n, m, -one, q, m, c, m, one, cf, m )
261 resid =
zlange(
'1', m, n, cf, m, rwork )
262 IF( cnorm.GT.zero )
THEN
263 result( 4 ) = resid / (eps*max(1,m)*cnorm)
271 CALL zlarnv( 2, iseed, n, d( 1, j ) )
273 dnorm =
zlange(
'1', n, m, d, n, rwork)
274 CALL zlacpy(
'Full', n, m, d, n, df, n )
279 CALL zgemqr(
'R',
'N', n, m, k, af, m, t, tsize, df, n,
284 CALL zgemm(
'N',
'N', n, m, m, -one, d, n, q, m, one, df, n )
285 resid =
zlange(
'1', n, m, df, n, rwork )
286 IF( dnorm.GT.zero )
THEN
287 result( 5 ) = resid / (eps*max(1,m)*dnorm)
294 CALL zlacpy(
'Full', n, m, d, n, df, n )
298 CALL zgemqr(
'R',
'C', n, m, k, af, m, t, tsize, df, n,
303 CALL zgemm(
'N',
'C', n, m, m, -one, d, n, q, m, one, df, n )
304 resid =
zlange(
'1', n, m, df, n, rwork )
305 IF( cnorm.GT.zero )
THEN
306 result( 6 ) = resid / (eps*max(1,m)*dnorm)
314 CALL zgelq( m, n, af, m, tquery, -1, workquery, -1, info )
315 tsize = int( tquery( 1 ) )
316 lwork = int( workquery( 1 ) )
317 CALL zgemlq(
'R',
'N', n, n, k, af, m, tquery, tsize, q, n,
318 $ workquery, -1, info )
319 lwork = max( lwork, int( workquery( 1 ) ) )
320 CALL zgemlq(
'L',
'N', n, m, k, af, m, tquery, tsize, df, n,
321 $ workquery, -1, info)
322 lwork = max( lwork, int( workquery( 1 ) ) )
323 CALL zgemlq(
'L',
'C', n, m, k, af, m, tquery, tsize, df, n,
324 $ workquery, -1, info)
325 lwork = max( lwork, int( workquery( 1 ) ) )
326 CALL zgemlq(
'R',
'N', m, n, k, af, m, tquery, tsize, cf, m,
327 $ workquery, -1, info)
328 lwork = max( lwork, int( workquery( 1 ) ) )
329 CALL zgemlq(
'R',
'C', m, n, k, af, m, tquery, tsize, cf, m,
330 $ workquery, -1, info)
331 lwork = max( lwork, int( workquery( 1 ) ) )
332 ALLOCATE ( t( tsize ) )
333 ALLOCATE ( work( lwork ) )
335 CALL zgelq( m, n, af, m, t, tsize, work, lwork, info )
340 CALL zlaset(
'Full', n, n, czero, one, q, n )
342 CALL zgemlq(
'R',
'N', n, n, k, af, m, t, tsize, q, n,
343 $ work, lwork, info )
347 CALL zlaset(
'Full', m, n, czero, czero, lq, l )
348 CALL zlacpy(
'Lower', m, n, af, m, lq, l )
352 CALL zgemm(
'N',
'C', m, n, n, -one, a, m, q, n, one, lq, l )
353 anorm =
zlange(
'1', m, n, a, m, rwork )
354 resid =
zlange(
'1', m, n, lq, l, rwork )
355 IF( anorm.GT.zero )
THEN
356 result( 1 ) = resid / (eps*max(1,n)*anorm)
363 CALL zlaset(
'Full', n, n, czero, one, lq, l )
364 CALL zherk(
'U',
'C', n, n, dreal(-one), q, n, dreal(one), lq, l)
365 resid =
zlansy(
'1',
'Upper', n, lq, l, rwork )
366 result( 2 ) = resid / (eps*max(1,n))
371 CALL zlarnv( 2, iseed, n, d( 1, j ) )
373 dnorm =
zlange(
'1', n, m, d, n, rwork)
374 CALL zlacpy(
'Full', n, m, d, n, df, n )
378 CALL zgemlq(
'L',
'N', n, m, k, af, m, t, tsize, df, n,
383 CALL zgemm(
'N',
'N', n, m, n, -one, q, n, d, n, one, df, n )
384 resid =
zlange(
'1', n, m, df, n, rwork )
385 IF( dnorm.GT.zero )
THEN
386 result( 3 ) = resid / (eps*max(1,n)*dnorm)
393 CALL zlacpy(
'Full', n, m, d, n, df, n )
397 CALL zgemlq(
'L',
'C', n, m, k, af, m, t, tsize, df, n,
402 CALL zgemm(
'C',
'N', n, m, n, -one, q, n, d, n, one, df, n )
403 resid =
zlange(
'1', n, m, df, n, rwork )
404 IF( dnorm.GT.zero )
THEN
405 result( 4 ) = resid / (eps*max(1,n)*dnorm)
413 CALL zlarnv( 2, iseed, m, c( 1, j ) )
415 cnorm =
zlange(
'1', m, n, c, m, rwork)
416 CALL zlacpy(
'Full', m, n, c, m, cf, m )
420 CALL zgemlq(
'R',
'N', m, n, k, af, m, t, tsize, cf, m,
425 CALL zgemm(
'N',
'N', m, n, n, -one, c, m, q, n, one, cf, m )
426 resid =
zlange(
'1', n, m, df, n, rwork )
427 IF( cnorm.GT.zero )
THEN
428 result( 5 ) = resid / (eps*max(1,n)*cnorm)
435 CALL zlacpy(
'Full', m, n, c, m, cf, m )
439 CALL zgemlq(
'R',
'C', m, n, k, af, m, t, tsize, cf, m,
444 CALL zgemm(
'N',
'C', m, n, n, -one, c, m, q, n, one, cf, m )
445 resid =
zlange(
'1', m, n, cf, m, rwork )
446 IF( cnorm.GT.zero )
THEN
447 result( 6 ) = resid / (eps*max(1,n)*cnorm)
456 DEALLOCATE ( a, af, q, r, rwork, work, t, c, d, cf, df)
double precision function dlamch(CMACH)
DLAMCH
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
logical function lsame(CA, CB)
LSAME
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zherk(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)
ZHERK
double precision function zlange(NORM, M, N, A, LDA, WORK)
ZLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlarnv(IDIST, ISEED, N, X)
ZLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
double precision function zlansy(NORM, UPLO, N, A, LDA, WORK)
ZLANSY returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine zgelq(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
ZGELQ
subroutine zgemlq(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
ZGEMLQ
subroutine zgemqr(SIDE, TRANS, M, N, K, A, LDA, T, TSIZE, C, LDC, WORK, LWORK, INFO)
ZGEMQR
subroutine zgeqr(M, N, A, LDA, T, TSIZE, WORK, LWORK, INFO)
ZGEQR