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,
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.GT.
IF( ANORMZERO ) 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.GT.
IF( CNORMZERO ) 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.GT.
IF( CNORMZERO ) 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.GT.
IF( DNORMZERO ) 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.GT.
IF( CNORMZERO ) 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.GT.
IF( ANORMZERO ) 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.GT.
IF( DNORMZERO ) 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.GT.
IF( DNORMZERO ) 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.GT.
IF( CNORMZERO ) 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.GT.
IF( CNORMZERO ) THEN
447 RESULT( 6 ) = RESID / (EPS*MAX(1,N)*CNORM)
456 DEALLOCATE ( A, AF, Q, R, RWORK, WORK, T, C, D, CF, DF)