81 SUBROUTINE ztsqr01(TSSW, M, N, MB, NB, RESULT)
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
120 EXTERNAL dlamch, zlange, zlansy, lsame, ilaenv
128 COMMON / srnamc / srnamt
131 DATA iseed / 1988, 1989, 1990, 1991 /
135 ts = lsame(tssw,
'TS')
141 eps = dlamch(
'Epsilon' )
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)